@iternio/react-native-auto-play 0.1.18 → 0.2.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/README.md +152 -8
  2. package/android/build.gradle +15 -1
  3. package/android/gradle.properties +1 -1
  4. package/android/src/{main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/AndroidAutoTelemetryObserver.kt → auto/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/AndroidTelemetryObserver.kt} +31 -76
  5. package/android/src/automotive/AndroidManifest.xml +91 -0
  6. package/android/src/automotive/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/AndroidTelemetryObserver.kt +191 -0
  7. package/android/src/main/AndroidManifest.xml +0 -10
  8. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/AndroidAutoScreen.kt +3 -0
  9. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/AndroidAutoTelemetryHolder.kt +97 -19
  10. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridAndroidAutoTelemetry.kt +39 -3
  11. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridSignInTemplate.kt +22 -0
  12. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/TelemetryObserver.kt +56 -0
  13. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/VirtualRenderer.kt +15 -10
  14. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/template/AutomotivePermissionRequestTemplate.kt +103 -0
  15. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/template/GridTemplate.kt +0 -2
  16. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/template/Parser.kt +8 -2
  17. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/template/SignInTemplate.kt +159 -0
  18. package/ios/extensions/CarPlayExtensions.swift +4 -2
  19. package/ios/extensions/NitroImageExtensions.swift +4 -4
  20. package/ios/hybrid/HybridAutoPlay.swift +31 -42
  21. package/ios/hybrid/HybridCluster.swift +4 -2
  22. package/ios/hybrid/HybridGridTemplate.swift +11 -11
  23. package/ios/hybrid/HybridInformationTemplate.swift +12 -13
  24. package/ios/hybrid/HybridListTemplate.swift +12 -13
  25. package/ios/hybrid/HybridMapTemplate.swift +13 -16
  26. package/ios/hybrid/HybridMessageTemplate.swift +7 -4
  27. package/ios/hybrid/HybridSearchTemplate.swift +12 -13
  28. package/ios/scenes/AutoPlayInterfaceController.swift +41 -13
  29. package/ios/scenes/AutoPlayScene.swift +2 -1
  30. package/ios/scenes/AutoPlaySceneViewController.swift +8 -2
  31. package/ios/scenes/DashboardSceneDelegate.swift +15 -7
  32. package/ios/scenes/HeadUnitSceneDelegate.swift +7 -5
  33. package/ios/scenes/WindowApplicationSceneDelegate.swift +1 -1
  34. package/ios/templates/AutoPlayTemplate.swift +23 -15
  35. package/ios/templates/GridTemplate.swift +23 -16
  36. package/ios/templates/InformationTemplate.swift +12 -11
  37. package/ios/templates/ListTemplate.swift +11 -11
  38. package/ios/templates/MapTemplate.swift +44 -42
  39. package/ios/templates/MessageTemplate.swift +8 -12
  40. package/ios/templates/Parser.swift +2 -1
  41. package/ios/templates/SearchTemplate.swift +19 -17
  42. package/ios/templates/TemplateStore.swift +17 -9
  43. package/ios/utils/RootModule.swift +19 -12
  44. package/ios/utils/SymbolFont.swift +2 -1
  45. package/ios/utils/ViewUtils.swift +2 -2
  46. package/lib/hooks/useAndroidAutoTelemetry.d.ts +22 -4
  47. package/lib/hooks/useAndroidAutoTelemetry.js +52 -24
  48. package/lib/index.d.ts +2 -0
  49. package/lib/index.js +2 -0
  50. package/lib/specs/AndroidAutoTelemetry.nitro.d.ts +14 -1
  51. package/lib/types/Telemetry.d.ts +27 -0
  52. package/lib/types/Telemetry.js +7 -0
  53. package/nitro.json +3 -0
  54. package/nitrogen/generated/android/ReactNativeAutoPlay+autolinking.cmake +3 -0
  55. package/nitrogen/generated/android/ReactNativeAutoPlayOnLoad.cpp +12 -2
  56. package/nitrogen/generated/android/c++/JBooleanTelemetryItem.hpp +61 -0
  57. package/nitrogen/generated/android/c++/JFunc_void_std__optional_Telemetry_.hpp +87 -0
  58. package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +10 -10
  59. package/nitrogen/generated/android/c++/JHybridAndroidAutoTelemetrySpec.cpp +41 -5
  60. package/nitrogen/generated/android/c++/JHybridAndroidAutoTelemetrySpec.hpp +2 -1
  61. package/nitrogen/generated/android/c++/JHybridSignInTemplateSpec.cpp +133 -0
  62. package/nitrogen/generated/android/c++/JHybridSignInTemplateSpec.hpp +66 -0
  63. package/nitrogen/generated/android/c++/JInputSignIn.hpp +103 -0
  64. package/nitrogen/generated/android/c++/JKeyboardType.hpp +65 -0
  65. package/nitrogen/generated/android/c++/JPermissionRequestResult.hpp +98 -0
  66. package/nitrogen/generated/android/c++/JPinSignIn.hpp +63 -0
  67. package/nitrogen/generated/android/c++/JQrSignIn.hpp +63 -0
  68. package/nitrogen/generated/android/c++/JSignInMethods.hpp +65 -0
  69. package/nitrogen/generated/android/c++/JSignInTemplateConfig.hpp +217 -0
  70. package/nitrogen/generated/android/c++/JTelemetry.hpp +25 -3
  71. package/nitrogen/generated/android/c++/JTextInputType.hpp +59 -0
  72. package/nitrogen/generated/android/c++/JVariant_QrSignIn_PinSignIn_InputSignIn.cpp +30 -0
  73. package/nitrogen/generated/android/c++/JVariant_QrSignIn_PinSignIn_InputSignIn.hpp +99 -0
  74. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/AssetImage.kt +2 -2
  75. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/AutoText.kt +3 -3
  76. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/BooleanTelemetryItem.kt +41 -0
  77. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/Distance.kt +1 -1
  78. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/DurationWithTimeZone.kt +1 -1
  79. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/{Func_void_std__optional_Telemetry__std__optional_std__string_.kt → Func_void_std__optional_Telemetry_.kt} +14 -14
  80. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/Func_void_std__string.kt +9 -9
  81. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/GlyphImage.kt +2 -2
  82. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/GridTemplateConfig.kt +9 -9
  83. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridAndroidAutoTelemetrySpec.kt +7 -2
  84. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridSignInTemplateSpec.kt +62 -0
  85. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/ImageLane.kt +1 -1
  86. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/InformationTemplateConfig.kt +10 -10
  87. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/InputSignIn.kt +63 -0
  88. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/KeyboardType.kt +23 -0
  89. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/LaneGuidance.kt +1 -1
  90. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/ListTemplateConfig.kt +10 -10
  91. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/Location.kt +1 -1
  92. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/MapTemplateConfig.kt +18 -18
  93. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/MessageTemplateConfig.kt +12 -12
  94. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NavigationAlertAction.kt +2 -2
  95. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroAction.kt +7 -7
  96. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroAttributedString.kt +2 -2
  97. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroAttributedStringImage.kt +1 -1
  98. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroBaseMapTemplateConfig.kt +10 -10
  99. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroColor.kt +1 -1
  100. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroGridButton.kt +1 -1
  101. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroLoadingManeuver.kt +1 -1
  102. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroMapButton.kt +2 -2
  103. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroMessageManeuver.kt +3 -3
  104. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroNavigationAlert.kt +6 -6
  105. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroRoutingManeuver.kt +13 -13
  106. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroRow.kt +7 -7
  107. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroSection.kt +2 -2
  108. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NumericTelemetryItem.kt +1 -1
  109. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/PermissionRequestResult.kt +41 -0
  110. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/PinSignIn.kt +41 -0
  111. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/Point.kt +1 -1
  112. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/PreferredImageLane.kt +1 -1
  113. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/QrSignIn.kt +41 -0
  114. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/RouteChoice.kt +1 -1
  115. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/SafeAreaInsets.kt +2 -2
  116. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/SearchTemplateConfig.kt +10 -10
  117. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/SignInMethods.kt +23 -0
  118. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/SignInTemplateConfig.kt +78 -0
  119. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/StringTelemetryItem.kt +1 -1
  120. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/Telemetry.kt +24 -9
  121. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/TextInputType.kt +21 -0
  122. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/TravelEstimates.kt +2 -2
  123. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/TripConfig.kt +1 -1
  124. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/TripPoint.kt +1 -1
  125. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/TripPreviewTextConfiguration.kt +1 -1
  126. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/TripSelectorCallback.kt +1 -1
  127. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/TripsConfig.kt +1 -1
  128. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/Variant_QrSignIn_PinSignIn_InputSignIn.kt +72 -0
  129. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/VehicleTelemetryItem.kt +4 -4
  130. package/nitrogen/generated/shared/c++/BooleanTelemetryItem.hpp +79 -0
  131. package/nitrogen/generated/shared/c++/HybridAndroidAutoTelemetrySpec.cpp +1 -0
  132. package/nitrogen/generated/shared/c++/HybridAndroidAutoTelemetrySpec.hpp +7 -1
  133. package/nitrogen/generated/shared/c++/HybridSignInTemplateSpec.cpp +22 -0
  134. package/nitrogen/generated/shared/c++/HybridSignInTemplateSpec.hpp +66 -0
  135. package/nitrogen/generated/shared/c++/InputSignIn.hpp +113 -0
  136. package/nitrogen/generated/shared/c++/KeyboardType.hpp +64 -0
  137. package/nitrogen/generated/shared/c++/PermissionRequestResult.hpp +80 -0
  138. package/nitrogen/generated/shared/c++/PinSignIn.hpp +81 -0
  139. package/nitrogen/generated/shared/c++/QrSignIn.hpp +81 -0
  140. package/nitrogen/generated/shared/c++/SignInMethods.hpp +64 -0
  141. package/nitrogen/generated/shared/c++/SignInTemplateConfig.hpp +138 -0
  142. package/nitrogen/generated/shared/c++/Telemetry.hpp +25 -2
  143. package/nitrogen/generated/shared/c++/TextInputType.hpp +62 -0
  144. package/package.json +3 -2
  145. package/src/hooks/useAndroidAutoTelemetry.ts +80 -27
  146. package/src/index.ts +2 -0
  147. package/src/specs/AndroidAutoTelemetry.nitro.ts +19 -1
  148. package/src/specs/SignInTemplate.nitro.ts +10 -0
  149. package/src/templates/SignInTemplate.ts +117 -0
  150. package/src/types/SignInMethod.ts +41 -0
  151. package/src/types/Telemetry.ts +29 -0
  152. package/lib/hooks/useIsAutoPlayFocused.d.ts +0 -7
  153. package/lib/hooks/useIsAutoPlayFocused.js +0 -20
  154. package/lib/hybrid.d.ts +0 -2
  155. package/lib/hybrid.js +0 -2
  156. package/lib/specs/AutomotivePermissionRequestTemplate.d.ts +0 -11
  157. package/lib/specs/AutomotivePermissionRequestTemplate.js +0 -1
  158. package/lib/specs/AutomotivePermissionRequestTemplate.nitro.d.ts +0 -11
  159. package/lib/specs/AutomotivePermissionRequestTemplate.nitro.js +0 -1
  160. package/lib/templates/AutomotivePermissionRequestTemplate.d.ts +0 -23
  161. package/lib/templates/AutomotivePermissionRequestTemplate.js +0 -18
  162. package/nitrogen/generated/android/c++/JFunc_void_std__optional_Telemetry__std__optional_std__string_.hpp +0 -85
@@ -11,7 +11,7 @@ struct NavigationAlertWrapper {
11
11
  let config: NitroNavigationAlert
12
12
  }
13
13
 
14
- class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
14
+ class MapTemplate: AutoPlayTemplate, AutoPlayHeaderProviding,
15
15
  CPMapTemplateDelegate
16
16
  {
17
17
  let template: CPMapTemplate
@@ -29,11 +29,11 @@ class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
29
29
  }
30
30
  }
31
31
 
32
- var autoDismissMs: Double? {
32
+ override var autoDismissMs: Double? {
33
33
  return config.autoDismissMs
34
34
  }
35
35
 
36
- func getTemplate() -> CPTemplate {
36
+ override func getTemplate() -> CPTemplate {
37
37
  return template
38
38
  }
39
39
 
@@ -44,11 +44,6 @@ class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
44
44
  var currentTripId: String?
45
45
 
46
46
  var tripSelectorVisible = false
47
- /**
48
- this avoids a race condition when invalidating the template that causes an App Hang (main‑thread stall)
49
- when using CPMapTemplate.isPanningInterfaceVisible
50
- */
51
- private var isPanningInterfaceVisible = false
52
47
 
53
48
  init(config: MapTemplateConfig) {
54
49
  self.config = config
@@ -63,7 +58,8 @@ class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
63
58
  width: width,
64
59
  height: height
65
60
  )
66
- } else {
61
+ }
62
+ else {
67
63
  screenDimensions = CGSize(width: 0, height: 0)
68
64
  }
69
65
 
@@ -73,9 +69,10 @@ class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
73
69
  }
74
70
 
75
71
  func onPanButtonPress() {
76
- if isPanningInterfaceVisible {
72
+ if template.isPanningInterfaceVisible {
77
73
  template.dismissPanningInterface(animated: true)
78
- } else {
74
+ }
75
+ else {
79
76
  template.showPanningInterface(animated: true)
80
77
  }
81
78
  }
@@ -124,13 +121,13 @@ class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
124
121
  }
125
122
 
126
123
  @MainActor
127
- func invalidate() {
124
+ override func _invalidate() {
128
125
  if tripSelectorVisible {
129
126
  // ignore invalidate calls to not break the trip selectors back button
130
127
  return
131
128
  }
132
129
 
133
- if isPanningInterfaceVisible {
130
+ if template.isPanningInterfaceVisible {
134
131
  // while panning interface is shown we only provide a back button on the header
135
132
  // and all map buttons except the pan button
136
133
  // reason is that you can have a max of 2 map buttons while panning interface is shown
@@ -158,27 +155,28 @@ class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
158
155
  }
159
156
  }
160
157
 
161
- func onWillAppear(animated: Bool) {
158
+ override func onWillAppear(animated: Bool) {
162
159
  config.onWillAppear?(animated)
163
160
  }
164
161
 
165
- func onDidAppear(animated: Bool) {
162
+ override func onDidAppear(animated: Bool) {
166
163
  config.onDidAppear?(animated)
167
164
  }
168
165
 
169
- func onWillDisappear(animated: Bool) {
166
+ override func onWillDisappear(animated: Bool) {
170
167
  config.onWillDisappear?(animated)
171
168
  }
172
169
 
173
- func onDidDisappear(animated: Bool) {
170
+ override func onDidDisappear(animated: Bool) {
174
171
  config.onDidDisappear?(animated)
175
172
  }
176
173
 
177
- func onPopped() {
174
+ override func onPopped() {
178
175
  config.onPopped?()
179
176
  }
180
177
 
181
- func traitCollectionDidChange() {
178
+ @MainActor
179
+ override func traitCollectionDidChange() {
182
180
  let traitCollection = SceneStore.getRootTraitCollection()
183
181
  let isDark = traitCollection.userInterfaceStyle == .dark
184
182
 
@@ -212,7 +210,7 @@ class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
212
210
  scale: CGFloat,
213
211
  velocity: CGFloat
214
212
  ) {
215
- if isPanningInterfaceVisible {
213
+ if template.isPanningInterfaceVisible {
216
214
  return
217
215
  }
218
216
 
@@ -228,12 +226,11 @@ class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
228
226
  }
229
227
 
230
228
  func mapTemplateDidShowPanningInterface(_ mapTemplate: CPMapTemplate) {
231
- isPanningInterfaceVisible = true
232
229
  config.onDidChangePanningInterface?(true)
233
230
  invalidate()
234
231
  }
232
+
235
233
  func mapTemplateDidDismissPanningInterface(_ mapTemplate: CPMapTemplate) {
236
- isPanningInterfaceVisible = false
237
234
  config.onDidChangePanningInterface?(false)
238
235
  invalidate()
239
236
  }
@@ -353,9 +350,9 @@ class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
353
350
  return
354
351
  }
355
352
 
356
- let title = Parser.parseText(text: alertConfig.title)!
357
- let subtitle = alertConfig.subtitle.map { subtitle in
358
- [Parser.parseText(text: subtitle)!]
353
+ guard let title = Parser.parseText(text: alertConfig.title) else { return }
354
+ let subtitle = alertConfig.subtitle.flatMap { subtitle in
355
+ [Parser.parseText(text: subtitle)].compactMap { $0 }
359
356
  }
360
357
 
361
358
  let image = Parser.parseNitroImage(
@@ -399,7 +396,8 @@ class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
399
396
  template.dismissNavigationAlert(animated: true) { _ in
400
397
  setNavigationAlert()
401
398
  }
402
- } else {
399
+ }
400
+ else {
403
401
  setNavigationAlert()
404
402
  }
405
403
  }
@@ -417,10 +415,10 @@ class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
417
415
  return
418
416
  }
419
417
 
420
- let title = Parser.parseText(text: title)!
418
+ guard let title = Parser.parseText(text: title) else { return }
421
419
  let subtitle =
422
- subtitle.map { subtitle in
423
- [Parser.parseText(text: subtitle)!]
420
+ subtitle.flatMap { subtitle in
421
+ [Parser.parseText(text: subtitle)].compactMap { $0 }
424
422
  } ?? []
425
423
 
426
424
  alert.updateTitleVariants([title], subtitleVariants: subtitle)
@@ -501,7 +499,7 @@ class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
501
499
  }
502
500
 
503
501
  func hideTripSelector() {
504
- currentTripId = nil;
502
+ currentTripId = nil
505
503
  template.hideTripPreviews()
506
504
 
507
505
  tripSelectorVisible = false
@@ -517,13 +515,13 @@ class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
517
515
  using routeChoice: CPRouteChoice
518
516
  ) {
519
517
  let tripId = trip.id
520
-
521
- if (currentTripId != nil && currentTripId == tripId) {
518
+
519
+ if currentTripId != nil && currentTripId == tripId {
522
520
  return
523
521
  }
524
-
522
+
525
523
  currentTripId = trip.id
526
-
524
+
527
525
  let routeId = routeChoice.id
528
526
  self.onTripSelected?(tripId, routeId)
529
527
 
@@ -547,14 +545,14 @@ class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
547
545
  )
548
546
 
549
547
  startNavigation(trip: trip)
550
-
548
+
551
549
  if let onTripStarted = self.onTripStarted {
552
550
  let tripId = trip.id
553
551
  let routeId = routeChoice.id
554
552
 
555
553
  onTripStarted(tripId, routeId)
556
554
  }
557
-
555
+
558
556
  hideTripSelector()
559
557
  }
560
558
 
@@ -604,7 +602,8 @@ class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
604
602
 
605
603
  if #available(iOS 15.4, *) {
606
604
  maneuver.cardBackgroundColor = cardBackgroundColor
607
- } else {
605
+ }
606
+ else {
608
607
  template.guidanceBackgroundColor = cardBackgroundColor
609
608
  }
610
609
 
@@ -660,10 +659,11 @@ class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
660
659
  )
661
660
 
662
661
  if index != maneuverIndex {
663
- let maneuver = navigationSession.upcomingManeuvers.first(
662
+ if let maneuver = navigationSession.upcomingManeuvers.first(
664
663
  where: { $0.id == nitroManeuver.id }
665
- )!
666
- upcomingManeuvers.append(maneuver)
664
+ ) {
665
+ upcomingManeuvers.append(maneuver)
666
+ }
667
667
  }
668
668
  continue
669
669
  }
@@ -693,7 +693,8 @@ class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
693
693
  secondaryManeuver.cardBackgroundColor =
694
694
  maneuver.cardBackgroundColor
695
695
  return [maneuver, secondaryManeuver]
696
- } else {
696
+ }
697
+ else {
697
698
  return [maneuver]
698
699
  }
699
700
  }
@@ -711,7 +712,8 @@ class MapTemplate: NSObject, AutoPlayTemplate, AutoPlayHeaderProviding,
711
712
  }
712
713
  if laneGuidances.isEmpty {
713
714
  navigationSession.currentLaneGuidance = nil
714
- } else {
715
+ }
716
+ else {
715
717
  navigationSession.add(laneGuidances)
716
718
  navigationSession.currentLaneGuidance = laneGuidances.first
717
719
  }
@@ -10,12 +10,12 @@ import CarPlay
10
10
  class MessageTemplate: AutoPlayTemplate {
11
11
  let template: CPAlertTemplate
12
12
  var config: MessageTemplateConfig
13
-
14
- var autoDismissMs: Double? {
13
+
14
+ override var autoDismissMs: Double? {
15
15
  return config.autoDismissMs
16
16
  }
17
17
 
18
- func getTemplate() -> CPTemplate {
18
+ override func getTemplate() -> CPTemplate {
19
19
  return template
20
20
  }
21
21
 
@@ -28,28 +28,24 @@ class MessageTemplate: AutoPlayTemplate {
28
28
  id: config.id
29
29
  )
30
30
  }
31
-
32
- func invalidate() {
33
- // this template can not be updated
34
- }
35
31
 
36
- func onWillAppear(animated: Bool) {
32
+ override func onWillAppear(animated: Bool) {
37
33
  config.onWillAppear?(animated)
38
34
  }
39
35
 
40
- func onDidAppear(animated: Bool) {
36
+ override func onDidAppear(animated: Bool) {
41
37
  config.onDidAppear?(animated)
42
38
  }
43
39
 
44
- func onWillDisappear(animated: Bool) {
40
+ override func onWillDisappear(animated: Bool) {
45
41
  config.onWillDisappear?(animated)
46
42
  }
47
43
 
48
- func onDidDisappear(animated: Bool) {
44
+ override func onDidDisappear(animated: Bool) {
49
45
  config.onDidDisappear?(animated)
50
46
  }
51
47
 
52
- func onPopped() {
48
+ override func onPopped() {
53
49
  config.onPopped?()
54
50
  }
55
51
  }
@@ -79,7 +79,8 @@ class Parser {
79
79
 
80
80
  if let image = image {
81
81
  button = CPBarButton(image: image) { _ in action.onPress() }
82
- } else {
82
+ }
83
+ else {
83
84
  button = CPBarButton(title: action.title ?? "") { _ in
84
85
  action.onPress()
85
86
  }
@@ -7,15 +7,15 @@
7
7
 
8
8
  import CarPlay
9
9
 
10
- class SearchTemplate: NSObject, AutoPlayTemplate, CPSearchTemplateDelegate {
10
+ class SearchTemplate: AutoPlayTemplate, CPSearchTemplateDelegate {
11
11
  var template: CPSearchTemplate
12
12
  var config: SearchTemplateConfig
13
13
 
14
- var autoDismissMs: Double? {
14
+ override var autoDismissMs: Double? {
15
15
  return config.autoDismissMs
16
16
  }
17
17
 
18
- func getTemplate() -> CPTemplate {
18
+ override func getTemplate() -> CPTemplate {
19
19
  return template
20
20
  }
21
21
 
@@ -35,7 +35,7 @@ class SearchTemplate: NSObject, AutoPlayTemplate, CPSearchTemplateDelegate {
35
35
  }
36
36
 
37
37
  @MainActor
38
- func invalidate() {
38
+ override func _invalidate() {
39
39
  // if we have pushed a list template update it
40
40
  if let listTemplate = pushedListTemplate {
41
41
  listTemplate.updateSections(sections: [config.results])
@@ -55,26 +55,26 @@ class SearchTemplate: NSObject, AutoPlayTemplate, CPSearchTemplateDelegate {
55
55
  self.completionHandler = nil
56
56
  }
57
57
 
58
- func onWillAppear(animated: Bool) {
58
+ override func onWillAppear(animated: Bool) {
59
59
  self.pushedListTemplate = nil
60
60
  config.onWillAppear?(animated)
61
61
  }
62
62
 
63
- func onDidAppear(animated: Bool) {
63
+ override func onDidAppear(animated: Bool) {
64
64
  config.onDidAppear?(animated)
65
65
  template.delegate = self
66
66
  }
67
67
 
68
- func onWillDisappear(animated: Bool) {
68
+ override func onWillDisappear(animated: Bool) {
69
69
  config.onWillDisappear?(animated)
70
70
  template.delegate = nil
71
71
  }
72
72
 
73
- func onDidDisappear(animated: Bool) {
73
+ override func onDidDisappear(animated: Bool) {
74
74
  config.onDidDisappear?(animated)
75
75
  }
76
76
 
77
- func onPopped() {
77
+ override func onPopped() {
78
78
  config.onPopped?()
79
79
  }
80
80
 
@@ -140,17 +140,18 @@ class SearchTemplate: NSObject, AutoPlayTemplate, CPSearchTemplateDelegate {
140
140
  // execute callback after creating the template to avoid race condition in updateSearchResults
141
141
  config.onSearchTextSubmitted(searchText)
142
142
 
143
- TemplateStore.addTemplate(
144
- template: listTemplate,
145
- templateId: listConfig.id
146
- )
147
-
148
143
  // Push the template
149
144
  Task { @MainActor in
150
145
  do {
151
- try await RootModule.withInterfaceController {
146
+ try await RootModule.withSceneAndInterfaceController {
147
+ scene,
152
148
  interfaceController in
153
-
149
+
150
+ scene.templateStore.addTemplate(
151
+ template: listTemplate,
152
+ templateId: listConfig.id
153
+ )
154
+
154
155
  listTemplate.invalidate()
155
156
 
156
157
  let _ = try await interfaceController.pushTemplate(
@@ -158,7 +159,8 @@ class SearchTemplate: NSObject, AutoPlayTemplate, CPSearchTemplateDelegate {
158
159
  animated: true
159
160
  )
160
161
  }
161
- } catch {
162
+ }
163
+ catch {
162
164
  print("Failed to push list template: \(error)")
163
165
  }
164
166
  }
@@ -7,27 +7,30 @@
7
7
  import CarPlay
8
8
 
9
9
  class TemplateStore {
10
- private static var store: [String: AutoPlayTemplate] = [:]
10
+ private var store: [String: AutoPlayTemplate] = [:]
11
11
 
12
- static func getCPTemplate(templateId key: String) -> CPTemplate? {
12
+ func getCPTemplate(templateId key: String) -> CPTemplate? {
13
13
  return store[key]?.getTemplate()
14
14
  }
15
15
 
16
- static func getTemplate(templateId: String) -> AutoPlayTemplate? {
17
- return store[templateId]
16
+ func getTemplate(templateId: String) throws -> AutoPlayTemplate {
17
+ if let template = store[templateId] {
18
+ return template
19
+ }
20
+ throw AutoPlayError.templateNotFound(templateId)
18
21
  }
19
22
 
20
- static func addTemplate(template: AutoPlayTemplate, templateId: String) {
23
+ func addTemplate(template: AutoPlayTemplate, templateId: String) {
21
24
  store[templateId] = template
22
25
  }
23
26
 
24
- static func removeTemplate(templateId: String) {
27
+ func removeTemplate(templateId: String) {
25
28
  store[templateId]?.onPopped()
26
29
 
27
30
  store.removeValue(forKey: templateId)
28
31
  }
29
32
 
30
- static func removeTemplates(templateIds: [String]) {
33
+ func removeTemplates(templateIds: [String]) {
31
34
  templateIds.forEach { templateId in
32
35
  store[templateId]?.onPopped()
33
36
  }
@@ -35,11 +38,16 @@ class TemplateStore {
35
38
  store = store.filter { !templateIds.contains($0.key) }
36
39
  }
37
40
 
38
- static func purge() {
41
+ func purge() {
39
42
  store = store.filter { !($0.value.getTemplate() is CPSearchTemplate) }
40
43
  }
41
44
 
42
- static func traitCollectionDidChange() {
45
+ @MainActor
46
+ func traitCollectionDidChange() {
43
47
  store.values.forEach { template in template.traitCollectionDidChange() }
44
48
  }
49
+
50
+ func disconnect() {
51
+ store = [:]
52
+ }
45
53
  }
@@ -24,25 +24,31 @@ class RootModule {
24
24
  try action(scene)
25
25
  }
26
26
 
27
+ static func withTemplateStore(
28
+ perform action: @escaping (TemplateStore) throws -> Void
29
+ ) throws {
30
+ try withScene { rootScene in
31
+ try action(rootScene.templateStore)
32
+ }
33
+ }
34
+
27
35
  static func withAutoPlayTemplate<T>(
28
36
  templateId: String,
29
37
  perform action: @escaping (T) throws -> Void
30
38
  ) throws {
31
- guard
32
- let template = TemplateStore.getTemplate(
39
+ try withScene { rootScene in
40
+ let template = try rootScene.templateStore.getTemplate(
33
41
  templateId: templateId
34
42
  )
35
- else {
36
- throw AutoPlayError.templateNotFound(templateId)
37
- }
38
43
 
39
- guard let template = template as? T else {
40
- throw AutoPlayError.invalidTemplateType(
41
- "\(template) is not a \(T.self) template"
42
- )
43
- }
44
+ guard let template = template as? T else {
45
+ throw AutoPlayError.invalidTemplateType(
46
+ "\(template) is not a \(T.self) template"
47
+ )
48
+ }
44
49
 
45
- try action(template)
50
+ try action(template)
51
+ }
46
52
  }
47
53
 
48
54
  static func withTemplate<T: CPTemplate>(
@@ -53,7 +59,8 @@ class RootModule {
53
59
  (autoPlayTemplate: AutoPlayTemplate) in
54
60
  if let template = autoPlayTemplate.getTemplate() as? T {
55
61
  try! action(template)
56
- } else {
62
+ }
63
+ else {
57
64
  throw AutoPlayError.invalidTemplateType(
58
65
  "\(autoPlayTemplate) is not a \(T.self) template"
59
66
  )
@@ -42,7 +42,8 @@ class SymbolFont {
42
42
  CTFontManagerRegisterGraphicsFont(font, &error)
43
43
  if let error = error?.takeUnretainedValue() {
44
44
  print("Failed to register font: \(error)")
45
- } else {
45
+ }
46
+ else {
46
47
  print("Font \(font.fullName as String? ?? "unknown") registered")
47
48
  }
48
49
 
@@ -19,10 +19,10 @@ class ViewUtils {
19
19
  return function(appDelegate, selector, moduleName as NSString, initialProps as NSDictionary)
20
20
  }
21
21
  }
22
-
22
+
23
23
  return nil
24
24
  }
25
-
25
+
26
26
  static func showLaunchScreen(window: UIWindow) {
27
27
  if let name = Bundle.main.object(
28
28
  forInfoDictionaryKey: "UILaunchStoryboardName"
@@ -10,6 +10,23 @@ interface Props {
10
10
  * The permissions to check.
11
11
  */
12
12
  requiredPermissions: Array<AndroidAutoPermissions>;
13
+ /**
14
+ * Android Automotive specific permission request properties
15
+ */
16
+ automotivePermissionRequest?: {
17
+ /**
18
+ * message to be shown on the permission request screen
19
+ */
20
+ message: string;
21
+ /**
22
+ * primary action button text
23
+ */
24
+ grantButtonText: string;
25
+ /**
26
+ * secondary action button text, if not specified button will not be shown
27
+ */
28
+ cancelButtonText?: string;
29
+ };
13
30
  }
14
31
  /**
15
32
  * Hook to check if the telemetry permissions are granted. If the permissions are not granted, it will request them from the user.
@@ -18,13 +35,14 @@ interface Props {
18
35
  * @param requestTelemetryPermissions If true, the telemetry permissions will be requested from the user. Can be set to false initially, in case other permissions need to be requested first, so the permission request dialogs do not overlap.
19
36
  * @param requiredPermissions The permissions to check.
20
37
  */
21
- export declare const useAndroidAutoTelemetry: ({ requestTelemetryPermissions, requiredPermissions, }: Props) => {
38
+ export declare const useAndroidAutoTelemetry: ({ requestTelemetryPermissions, requiredPermissions, automotivePermissionRequest, }: Props) => {
22
39
  /**
23
- * True if the telemetry permissions are granted, false otherwise.
40
+ * null on pending permission check, True if the telemetry permissions are granted, false otherwise.
24
41
  */
25
- permissionsGranted: boolean;
42
+ permissionsGranted: boolean | null;
26
43
  /**
27
- * The telemetry data.
44
+ * The telemetry data, might be a partial update not containing all properties of the regular timed updates.
45
+ * For example gear changes are emitted immediately without all the other telemetry data.
28
46
  */
29
47
  telemetry: Telemetry | undefined;
30
48
  /**