@iternio/react-native-auto-play 0.0.9 → 0.0.11

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 (113) hide show
  1. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridAutoPlay.kt +10 -9
  2. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridGridTemplate.kt +6 -3
  3. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridInformationTemplate.kt +7 -5
  4. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridListTemplate.kt +6 -3
  5. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridMapTemplate.kt +6 -3
  6. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridSearchTemplate.kt +6 -3
  7. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/template/MapTemplate.kt +10 -6
  8. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/template/Parser.kt +3 -0
  9. package/ios/hybrid/HybridAutoPlay.swift +48 -16
  10. package/ios/hybrid/HybridGridTemplate.swift +17 -10
  11. package/ios/hybrid/HybridInformationTemplate.swift +18 -10
  12. package/ios/hybrid/HybridListTemplate.swift +18 -10
  13. package/ios/hybrid/HybridMapTemplate.swift +26 -11
  14. package/ios/hybrid/HybridMessageTemplate.swift +4 -7
  15. package/ios/hybrid/HybridSearchTemplate.swift +20 -10
  16. package/ios/scenes/AutoPlayInterfaceController.swift +11 -14
  17. package/ios/scenes/AutoPlayScene.swift +1 -1
  18. package/ios/scenes/HeadUnitSceneDelegate.swift +5 -4
  19. package/ios/templates/AutoPlayTemplate.swift +3 -2
  20. package/ios/templates/GridTemplate.swift +1 -2
  21. package/ios/templates/InformationTemplate.swift +1 -2
  22. package/ios/templates/ListTemplate.swift +3 -2
  23. package/ios/templates/MapTemplate.swift +39 -33
  24. package/ios/templates/SearchTemplate.swift +11 -7
  25. package/ios/templates/TemplateStore.swift +8 -8
  26. package/ios/utils/RootModule.swift +13 -40
  27. package/lib/specs/AutoPlay.nitro.d.ts +1 -1
  28. package/lib/specs/GridTemplate.nitro.d.ts +1 -1
  29. package/lib/specs/InformationTemplate.nitro.d.ts +1 -1
  30. package/lib/specs/ListTemplate.nitro.d.ts +1 -1
  31. package/lib/specs/MapTemplate.nitro.d.ts +1 -1
  32. package/lib/specs/SearchTemplate.nitro.d.ts +1 -1
  33. package/lib/templates/GridTemplate.d.ts +1 -1
  34. package/lib/templates/GridTemplate.js +1 -1
  35. package/lib/templates/InformationTemplate.d.ts +1 -1
  36. package/lib/templates/InformationTemplate.js +1 -1
  37. package/lib/templates/ListTemplate.d.ts +1 -1
  38. package/lib/templates/ListTemplate.js +1 -1
  39. package/lib/templates/MapTemplate.d.ts +2 -2
  40. package/lib/templates/MapTemplate.js +6 -2
  41. package/lib/templates/SearchTemplate.d.ts +1 -1
  42. package/lib/templates/SearchTemplate.js +1 -1
  43. package/lib/templates/Template.d.ts +1 -1
  44. package/lib/templates/Template.js +1 -1
  45. package/lib/types/Maneuver.d.ts +5 -2
  46. package/lib/utils/NitroManeuver.d.ts +4 -1
  47. package/nitrogen/generated/android/c++/JHybridAutoPlaySpec.cpp +14 -3
  48. package/nitrogen/generated/android/c++/JHybridAutoPlaySpec.hpp +1 -1
  49. package/nitrogen/generated/android/c++/JHybridGridTemplateSpec.cpp +16 -3
  50. package/nitrogen/generated/android/c++/JHybridGridTemplateSpec.hpp +1 -1
  51. package/nitrogen/generated/android/c++/JHybridInformationTemplateSpec.cpp +16 -3
  52. package/nitrogen/generated/android/c++/JHybridInformationTemplateSpec.hpp +1 -1
  53. package/nitrogen/generated/android/c++/JHybridListTemplateSpec.cpp +16 -3
  54. package/nitrogen/generated/android/c++/JHybridListTemplateSpec.hpp +1 -1
  55. package/nitrogen/generated/android/c++/JHybridMapTemplateSpec.cpp +21 -4
  56. package/nitrogen/generated/android/c++/JHybridMapTemplateSpec.hpp +2 -2
  57. package/nitrogen/generated/android/c++/JHybridSearchTemplateSpec.cpp +16 -3
  58. package/nitrogen/generated/android/c++/JHybridSearchTemplateSpec.hpp +1 -1
  59. package/nitrogen/generated/android/c++/JNitroLoadingManeuver.hpp +57 -0
  60. package/nitrogen/generated/android/c++/JNitroManeuver.cpp +6 -2
  61. package/nitrogen/generated/android/c++/JNitroManeuver.hpp +19 -2
  62. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridAutoPlaySpec.kt +1 -1
  63. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridGridTemplateSpec.kt +2 -1
  64. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridInformationTemplateSpec.kt +2 -1
  65. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridListTemplateSpec.kt +2 -1
  66. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridMapTemplateSpec.kt +2 -1
  67. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridSearchTemplateSpec.kt +2 -1
  68. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroLoadingManeuver.kt +38 -0
  69. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroManeuver.kt +15 -2
  70. package/nitrogen/generated/ios/ReactNativeAutoPlay-Swift-Cxx-Bridge.hpp +28 -19
  71. package/nitrogen/generated/ios/ReactNativeAutoPlay-Swift-Cxx-Umbrella.hpp +3 -0
  72. package/nitrogen/generated/ios/c++/HybridAutoPlaySpecSwift.hpp +3 -1
  73. package/nitrogen/generated/ios/c++/HybridGridTemplateSpecSwift.hpp +4 -1
  74. package/nitrogen/generated/ios/c++/HybridInformationTemplateSpecSwift.hpp +4 -1
  75. package/nitrogen/generated/ios/c++/HybridListTemplateSpecSwift.hpp +4 -1
  76. package/nitrogen/generated/ios/c++/HybridMapTemplateSpecSwift.hpp +8 -2
  77. package/nitrogen/generated/ios/c++/HybridSearchTemplateSpecSwift.hpp +4 -1
  78. package/nitrogen/generated/ios/swift/HybridAutoPlaySpec.swift +1 -1
  79. package/nitrogen/generated/ios/swift/HybridAutoPlaySpec_cxx.swift +12 -4
  80. package/nitrogen/generated/ios/swift/HybridGridTemplateSpec.swift +2 -1
  81. package/nitrogen/generated/ios/swift/HybridGridTemplateSpec_cxx.swift +13 -4
  82. package/nitrogen/generated/ios/swift/HybridInformationTemplateSpec.swift +2 -1
  83. package/nitrogen/generated/ios/swift/HybridInformationTemplateSpec_cxx.swift +13 -4
  84. package/nitrogen/generated/ios/swift/HybridListTemplateSpec.swift +2 -1
  85. package/nitrogen/generated/ios/swift/HybridListTemplateSpec_cxx.swift +13 -4
  86. package/nitrogen/generated/ios/swift/HybridMapTemplateSpec.swift +2 -1
  87. package/nitrogen/generated/ios/swift/HybridMapTemplateSpec_cxx.swift +17 -5
  88. package/nitrogen/generated/ios/swift/HybridSearchTemplateSpec.swift +2 -1
  89. package/nitrogen/generated/ios/swift/HybridSearchTemplateSpec_cxx.swift +13 -4
  90. package/nitrogen/generated/ios/swift/NitroLoadingManeuver.swift +35 -0
  91. package/nitrogen/generated/ios/swift/NitroManeuver.swift +2 -1
  92. package/nitrogen/generated/shared/c++/HybridAutoPlaySpec.hpp +1 -1
  93. package/nitrogen/generated/shared/c++/HybridGridTemplateSpec.hpp +2 -1
  94. package/nitrogen/generated/shared/c++/HybridInformationTemplateSpec.hpp +2 -1
  95. package/nitrogen/generated/shared/c++/HybridListTemplateSpec.hpp +2 -1
  96. package/nitrogen/generated/shared/c++/HybridMapTemplateSpec.hpp +6 -2
  97. package/nitrogen/generated/shared/c++/HybridSearchTemplateSpec.hpp +2 -1
  98. package/nitrogen/generated/shared/c++/NitroLoadingManeuver.hpp +75 -0
  99. package/package.json +1 -1
  100. package/src/specs/AutoPlay.nitro.ts +1 -1
  101. package/src/specs/GridTemplate.nitro.ts +1 -1
  102. package/src/specs/InformationTemplate.nitro.ts +1 -1
  103. package/src/specs/ListTemplate.nitro.ts +1 -1
  104. package/src/specs/MapTemplate.nitro.ts +1 -1
  105. package/src/specs/SearchTemplate.nitro.ts +4 -1
  106. package/src/templates/GridTemplate.ts +1 -1
  107. package/src/templates/InformationTemplate.ts +1 -1
  108. package/src/templates/ListTemplate.ts +1 -1
  109. package/src/templates/MapTemplate.ts +7 -2
  110. package/src/templates/SearchTemplate.ts +1 -1
  111. package/src/templates/Template.ts +1 -1
  112. package/src/types/Maneuver.ts +8 -1
  113. package/src/utils/NitroManeuver.ts +8 -1
@@ -72,12 +72,14 @@ class HybridAutoPlay : HybridAutoPlaySpec() {
72
72
 
73
73
  override fun setTemplateHeaderActions(
74
74
  templateId: String, headerActions: Array<NitroAction>?
75
- ) {
76
- val template =
77
- AndroidAutoTemplate.getTemplate(templateId) ?: throw IllegalArgumentException(
78
- "setTemplateHeaderActions failed, template $templateId not found"
79
- )
80
- template.setTemplateHeaderActions(headerActions)
75
+ ): Promise<Unit> {
76
+ return Promise.async {
77
+ val template =
78
+ AndroidAutoTemplate.getTemplate(templateId) ?: throw IllegalArgumentException(
79
+ "setTemplateHeaderActions failed, template $templateId not found"
80
+ )
81
+ template.setTemplateHeaderActions(headerActions)
82
+ }
81
83
  }
82
84
 
83
85
  override fun setRootTemplate(templateId: String): Promise<Unit> {
@@ -105,9 +107,8 @@ class HybridAutoPlay : HybridAutoPlaySpec() {
105
107
  } else {
106
108
  val screenManager = AndroidAutoScreen.getScreenManager()
107
109
  ?: throw IllegalArgumentException("setRootTemplate failed, screenManager not found")
108
- val carContext =
109
- AndroidAutoSession.getCarContext(AndroidAutoSession.ROOT_SESSION)
110
- ?: throw IllegalArgumentException("setRootTemplate failed, carContext for $templateId template not found")
110
+ val carContext = AndroidAutoSession.getCarContext(AndroidAutoSession.ROOT_SESSION)
111
+ ?: throw IllegalArgumentException("setRootTemplate failed, carContext for $templateId template not found")
111
112
 
112
113
  val result = ThreadUtil.postOnUiAndAwait {
113
114
  screenManager.popToRoot()
@@ -1,5 +1,6 @@
1
1
  package com.margelo.nitro.swe.iternio.reactnativeautoplay
2
2
 
3
+ import com.margelo.nitro.core.Promise
3
4
  import com.margelo.nitro.swe.iternio.reactnativeautoplay.template.AndroidAutoTemplate
4
5
  import com.margelo.nitro.swe.iternio.reactnativeautoplay.template.GridTemplate
5
6
 
@@ -14,8 +15,10 @@ class HybridGridTemplate : HybridGridTemplateSpec() {
14
15
 
15
16
  override fun updateGridTemplateButtons(
16
17
  templateId: String, buttons: Array<NitroGridButton>
17
- ) {
18
- val template = AndroidAutoTemplate.getTemplate<GridTemplate>(templateId)
19
- template.updateButtons(buttons)
18
+ ): Promise<Unit> {
19
+ return Promise.async {
20
+ val template = AndroidAutoTemplate.getTemplate<GridTemplate>(templateId)
21
+ template.updateButtons(buttons)
22
+ }
20
23
  }
21
24
  }
@@ -1,5 +1,6 @@
1
1
  package com.margelo.nitro.swe.iternio.reactnativeautoplay
2
2
 
3
+ import com.margelo.nitro.core.Promise
3
4
  import com.margelo.nitro.swe.iternio.reactnativeautoplay.template.AndroidAutoTemplate
4
5
  import com.margelo.nitro.swe.iternio.reactnativeautoplay.template.InformationTemplate
5
6
 
@@ -13,10 +14,11 @@ class HybridInformationTemplate : HybridInformationTemplateSpec() {
13
14
  }
14
15
 
15
16
  override fun updateInformationTemplateSections(
16
- templateId: String,
17
- section: NitroSection
18
- ) {
19
- val template = AndroidAutoTemplate.getTemplate<InformationTemplate>(templateId)
20
- template.updateSection(section)
17
+ templateId: String, section: NitroSection
18
+ ): Promise<Unit> {
19
+ return Promise.async {
20
+ val template = AndroidAutoTemplate.getTemplate<InformationTemplate>(templateId)
21
+ template.updateSection(section)
22
+ }
21
23
  }
22
24
  }
@@ -1,5 +1,6 @@
1
1
  package com.margelo.nitro.swe.iternio.reactnativeautoplay
2
2
 
3
+ import com.margelo.nitro.core.Promise
3
4
  import com.margelo.nitro.swe.iternio.reactnativeautoplay.template.AndroidAutoTemplate
4
5
  import com.margelo.nitro.swe.iternio.reactnativeautoplay.template.ListTemplate
5
6
 
@@ -15,8 +16,10 @@ class HybridListTemplate : HybridListTemplateSpec() {
15
16
 
16
17
  override fun updateListTemplateSections(
17
18
  templateId: String, sections: Array<NitroSection>?
18
- ) {
19
- val template = AndroidAutoTemplate.getTemplate<ListTemplate>(templateId)
20
- template.updateSections(sections)
19
+ ): Promise<Unit> {
20
+ return Promise.async {
21
+ val template = AndroidAutoTemplate.getTemplate<ListTemplate>(templateId)
22
+ template.updateSections(sections)
23
+ }
21
24
  }
22
25
  }
@@ -2,6 +2,7 @@ package com.margelo.nitro.swe.iternio.reactnativeautoplay
2
2
 
3
3
  import androidx.car.app.AppManager
4
4
  import com.facebook.react.bridge.UiThreadUtil
5
+ import com.margelo.nitro.core.Promise
5
6
  import com.margelo.nitro.swe.iternio.reactnativeautoplay.template.AndroidAutoTemplate
6
7
  import com.margelo.nitro.swe.iternio.reactnativeautoplay.template.MapTemplate
7
8
  import com.margelo.nitro.swe.iternio.reactnativeautoplay.template.RoutePreviewTemplate
@@ -120,9 +121,11 @@ class HybridMapTemplate : HybridMapTemplateSpec() {
120
121
 
121
122
  override fun setTemplateMapButtons(
122
123
  templateId: String, buttons: Array<NitroMapButton>?
123
- ) {
124
- val template = AndroidAutoTemplate.getTemplate<MapTemplate>(templateId)
125
- template.setMapActions(buttons)
124
+ ): Promise<Unit> {
125
+ return Promise.async {
126
+ val template = AndroidAutoTemplate.getTemplate<MapTemplate>(templateId)
127
+ template.setMapActions(buttons)
128
+ }
126
129
  }
127
130
 
128
131
  override fun updateVisibleTravelEstimate(
@@ -1,5 +1,6 @@
1
1
  package com.margelo.nitro.swe.iternio.reactnativeautoplay
2
2
 
3
+ import com.margelo.nitro.core.Promise
3
4
  import com.margelo.nitro.swe.iternio.reactnativeautoplay.template.AndroidAutoTemplate
4
5
  import com.margelo.nitro.swe.iternio.reactnativeautoplay.template.SearchTemplate
5
6
 
@@ -13,8 +14,10 @@ class HybridSearchTemplate : HybridSearchTemplateSpec() {
13
14
  AndroidAutoTemplate.setTemplate(config.id, template)
14
15
  }
15
16
 
16
- override fun updateSearchResults(templateId: String, results: NitroSection) {
17
- val template = AndroidAutoTemplate.getTemplate<SearchTemplate>(templateId)
18
- template.updateSearchResults(results)
17
+ override fun updateSearchResults(templateId: String, results: NitroSection): Promise<Unit> {
18
+ return Promise.async {
19
+ val template = AndroidAutoTemplate.getTemplate<SearchTemplate>(templateId)
20
+ template.updateSearchResults(results)
21
+ }
19
22
  }
20
23
  }
@@ -86,10 +86,6 @@ class MapTemplate(
86
86
  if (isNavigating) {
87
87
  navigationInfo?.let {
88
88
  setNavigationInfo(it)
89
- } ?: run {
90
- setNavigationInfo(RoutingInfo.Builder().apply {
91
- setLoading(true)
92
- }.build())
93
89
  }
94
90
  }
95
91
  config.onDidChangePanningInterface?.let {
@@ -309,13 +305,19 @@ class MapTemplate(
309
305
 
310
306
  val routingInfo = maneuvers.asFirstOrNull()
311
307
  val messageInfo = maneuvers.asSecondOrNull()
308
+ val loadingInfo = maneuvers.asThirdOrNull()
312
309
 
313
- if (routingInfo.isNullOrEmpty() && messageInfo == null) {
310
+ if (routingInfo.isNullOrEmpty() && messageInfo == null && loadingInfo == null) {
314
311
  navigationInfo = null
315
312
  AndroidAutoScreen.invalidateSurfaceScreens()
316
313
  return
317
314
  }
318
315
 
316
+ if (loadingInfo != null) {
317
+ navigationInfo = RoutingInfo.Builder().setLoading(true).build()
318
+ return
319
+ }
320
+
319
321
  if (messageInfo != null) {
320
322
  val backgroundColor =
321
323
  if (context.isDarkMode) messageInfo.cardBackgroundColor.darkColor else messageInfo.cardBackgroundColor.lightColor
@@ -359,7 +361,9 @@ class MapTemplate(
359
361
 
360
362
  val notificationText = currentStep.cue?.toString()
361
363
 
362
- val notificationTitle = "${currentDistance.displayDistance.toInt()} ${Parser.parseDistanceUnit(currentDistance.displayUnit)}"
364
+ val notificationTitle = "${currentDistance.displayDistance.toInt()} ${
365
+ Parser.parseDistanceUnit(currentDistance.displayUnit)
366
+ }"
363
367
 
364
368
  it.notify(
365
369
  notificationTitle, notificationText, notificationIcon
@@ -670,6 +670,9 @@ object Parser {
670
670
  setManeuver(parseManeuver(context, nitroManeuver))
671
671
  nitroManeuver.linkedLaneGuidance?.let { laneGuidance ->
672
672
  val lanes = laneGuidance.lanes.mapNotNull { it.asFirstOrNull() }
673
+ if (lanes.isEmpty()) {
674
+ return@let
675
+ }
673
676
  lanes.forEach { lane ->
674
677
  addLane(Lane.Builder().apply {
675
678
  addDirection(
@@ -110,17 +110,29 @@ class HybridAutoPlay: HybridAutoPlaySpec {
110
110
  // MARK: set/push/pop templates
111
111
  func setRootTemplate(templateId: String) throws -> Promise<Void> {
112
112
  return Promise.async {
113
- try await RootModule.withSceneTemplateAndInterfaceController(
114
- templateId: templateId
115
- ) { template, scene, interfaceController in
116
- if template is CPMapTemplate {
113
+ guard
114
+ let template = TemplateStore.getTemplate(
115
+ templateId: templateId
116
+ )
117
+ else {
118
+ throw AutoPlayError.templateNotFound(templateId)
119
+ }
120
+
121
+ try await RootModule.withSceneAndInterfaceController {
122
+ scene,
123
+ interfaceController in
124
+ let carPlayTemplate = template.getTemplate()
125
+
126
+ if carPlayTemplate is CPMapTemplate {
117
127
  await MainActor.run {
118
128
  scene.initRootView()
119
129
  }
120
130
  }
121
131
 
132
+ await template.invalidate()
133
+
122
134
  let _ = try await interfaceController.setRootTemplate(
123
- template,
135
+ carPlayTemplate,
124
136
  animated: false
125
137
  )
126
138
  }
@@ -131,27 +143,39 @@ class HybridAutoPlay: HybridAutoPlaySpec {
131
143
  -> NitroModules.Promise<Void>
132
144
  {
133
145
  return Promise.async {
134
- return try await RootModule.withSceneTemplateAndInterfaceController(
135
- templateId: templateId
136
- ) { template, scene, interfaceController in
137
- if template is CPAlertTemplate {
146
+ guard
147
+ let template = TemplateStore.getTemplate(
148
+ templateId: templateId
149
+ )
150
+ else {
151
+ throw AutoPlayError.templateNotFound(templateId)
152
+ }
153
+
154
+ await template.invalidate()
155
+
156
+ return try await RootModule.withInterfaceController {
157
+ interfaceController in
158
+
159
+ let carPlayTemplate = template.getTemplate()
160
+
161
+ if carPlayTemplate is CPAlertTemplate {
138
162
  let animated = try await
139
163
  !interfaceController.dismissTemplate(
140
164
  animated: false
141
165
  )
142
166
 
143
167
  let _ = try await interfaceController.presentTemplate(
144
- template,
168
+ carPlayTemplate,
145
169
  animated: animated
146
170
  )
147
171
  } else {
148
172
  let _ = try await interfaceController.pushTemplate(
149
- template,
173
+ carPlayTemplate,
150
174
  animated: true
151
175
  )
152
176
  }
153
177
 
154
- if let autoDismissMs = await scene.templateStore.getTemplate(
178
+ if let autoDismissMs = TemplateStore.getTemplate(
155
179
  templateId: templateId
156
180
  )?.autoDismissMs {
157
181
  Task { @MainActor in
@@ -240,10 +264,18 @@ class HybridAutoPlay: HybridAutoPlaySpec {
240
264
  func setTemplateHeaderActions(
241
265
  templateId: String,
242
266
  headerActions: [NitroAction]?
243
- ) throws {
244
- try RootModule.withAutoPlayTemplate(templateId: templateId) {
245
- (template: AutoPlayTemplate) in
246
- if var template = template as? AutoPlayHeaderProviding {
267
+ ) throws -> Promise<Void> {
268
+ return Promise.async {
269
+ try await MainActor.run {
270
+ guard
271
+ var template = TemplateStore.getTemplate(
272
+ templateId: templateId
273
+ ) as? AutoPlayHeaderProviding
274
+ else {
275
+ throw AutoPlayError.invalidTemplateType(
276
+ "\(templateId) does not support header actions"
277
+ )
278
+ }
247
279
  template.barButtons = headerActions
248
280
  }
249
281
  }
@@ -5,24 +5,31 @@
5
5
  // Created by Manuel Auer on 15.10.25.
6
6
  //
7
7
 
8
+ import NitroModules
9
+
8
10
  class HybridGridTemplate: HybridGridTemplateSpec {
9
11
  func createGridTemplate(config: GridTemplateConfig) throws {
10
12
  let template = GridTemplate(config: config)
11
- try RootModule.withScene { scene in
12
- scene.templateStore.addTemplate(
13
- template: template,
14
- templateId: config.id
15
- )
16
- }
13
+
14
+ TemplateStore.addTemplate(
15
+ template: template,
16
+ templateId: config.id
17
+ )
17
18
  }
18
19
 
19
20
  func updateGridTemplateButtons(
20
21
  templateId: String,
21
22
  buttons: [NitroGridButton]
22
- ) throws {
23
- try RootModule.withAutoPlayTemplate(templateId: templateId) {
24
- (template: GridTemplate) in
25
- template.updateButtons(buttons: buttons)
23
+ ) throws -> Promise<Void> {
24
+ return Promise.async {
25
+ guard
26
+ let template = TemplateStore.getTemplate(templateId: templateId)
27
+ as? GridTemplate
28
+ else {
29
+ throw AutoPlayError.templateNotFound(templateId)
30
+ }
31
+
32
+ await template.updateButtons(buttons: buttons)
26
33
  }
27
34
  }
28
35
  }
@@ -5,25 +5,33 @@
5
5
  // Created by Samuel Brucksch on 05.11.25.
6
6
  //
7
7
 
8
+ import NitroModules
9
+
8
10
  class HybridInformationTemplate: HybridInformationTemplateSpec {
9
11
 
10
12
  func createInformationTemplate(config: InformationTemplateConfig) throws {
11
13
  let template = InformationTemplate(config: config)
12
- try RootModule.withScene { scene in
13
- scene.templateStore.addTemplate(
14
- template: template,
15
- templateId: config.id
16
- )
17
- }
14
+ TemplateStore.addTemplate(
15
+ template: template,
16
+ templateId: config.id
17
+ )
18
18
  }
19
19
 
20
20
  func updateInformationTemplateSections(
21
21
  templateId: String,
22
22
  section: NitroSection
23
- ) throws {
24
- try RootModule.withAutoPlayTemplate(templateId: templateId) {
25
- (template: InformationTemplate) in
26
- template.updateSection(section: section)
23
+ ) throws -> Promise<Void> {
24
+ return Promise.async {
25
+ guard
26
+ let template = TemplateStore.getTemplate(templateId: templateId)
27
+ as? InformationTemplate
28
+ else {
29
+ throw AutoPlayError.invalidTemplateType(
30
+ "\(templateId) is not an InformationTemplate"
31
+ )
32
+ }
33
+
34
+ await template.updateSection(section: section)
27
35
  }
28
36
  }
29
37
  }
@@ -5,24 +5,32 @@
5
5
  // Created by Manuel Auer on 15.10.25.
6
6
  //
7
7
 
8
+ import NitroModules
9
+
8
10
  class HybridListTemplate: HybridListTemplateSpec {
9
11
  func createListTemplate(config: ListTemplateConfig) throws {
10
12
  let template = ListTemplate(config: config)
11
- try RootModule.withScene { scene in
12
- scene.templateStore.addTemplate(
13
- template: template,
14
- templateId: config.id
15
- )
16
- }
13
+ TemplateStore.addTemplate(
14
+ template: template,
15
+ templateId: config.id
16
+ )
17
17
  }
18
18
 
19
19
  func updateListTemplateSections(
20
20
  templateId: String,
21
21
  sections: [NitroSection]?
22
- ) throws {
23
- try RootModule.withAutoPlayTemplate(templateId: templateId) {
24
- (template: ListTemplate) in
25
- template.updateSections(sections: sections)
22
+ ) throws -> Promise<Void> {
23
+ return Promise.async {
24
+ guard
25
+ let template = TemplateStore.getTemplate(templateId: templateId)
26
+ as? ListTemplate
27
+ else {
28
+ throw AutoPlayError.invalidTemplateType(
29
+ "\(templateId) is not a ListTemplate"
30
+ )
31
+ }
32
+
33
+ await template.updateSections(sections: sections)
26
34
  }
27
35
  }
28
36
  }
@@ -6,26 +6,34 @@
6
6
  //
7
7
 
8
8
  import CarPlay
9
+ import NitroModules
9
10
 
10
11
  class HybridMapTemplate: HybridMapTemplateSpec {
11
12
  func createMapTemplate(config: MapTemplateConfig) throws {
12
13
  let template = MapTemplate(config: config)
13
- try RootModule.withScene { scene in
14
- scene.templateStore.addTemplate(
15
- template: template,
16
- templateId: config.id
17
- )
18
- }
14
+ TemplateStore.addTemplate(
15
+ template: template,
16
+ templateId: config.id
17
+ )
19
18
  }
20
19
 
21
20
  func setTemplateMapButtons(templateId: String, buttons: [NitroMapButton]?)
22
- throws
21
+ throws -> Promise<Void>
23
22
  {
24
- try RootModule.withAutoPlayTemplate(templateId: templateId) {
25
- (template: MapTemplate) in
23
+ return Promise.async {
24
+ guard
25
+ let template = TemplateStore.getTemplate(templateId: templateId)
26
+ as? MapTemplate
27
+ else {
28
+ throw AutoPlayError.invalidTemplateError(
29
+ "\(templateId) is not a MapTemplate"
30
+ )
31
+ }
26
32
 
27
- template.config.mapButtons = buttons
28
- template.invalidate()
33
+ await MainActor.run {
34
+ template.config.mapButtons = buttons
35
+ template.invalidate()
36
+ }
29
37
  }
30
38
  }
31
39
 
@@ -133,6 +141,13 @@ class HybridMapTemplate: HybridMapTemplateSpec {
133
141
  {
134
142
  template.updateManeuvers(messageManeuver: messageManeuver)
135
143
  }()
144
+ case .third(let loadingManeuver):
145
+ {
146
+ template.navigationSession?.pauseTrip(
147
+ for: .loading,
148
+ description: nil
149
+ )
150
+ }()
136
151
  }
137
152
 
138
153
  }
@@ -8,12 +8,9 @@
8
8
  class HybridMessageTemplate: HybridMessageTemplateSpec {
9
9
  func createMessageTemplate(config: MessageTemplateConfig) throws {
10
10
  let template = MessageTemplate(config: config)
11
-
12
- try RootModule.withScene { scene in
13
- scene.templateStore.addTemplate(
14
- template: template,
15
- templateId: config.id
16
- )
17
- }
11
+ TemplateStore.addTemplate(
12
+ template: template,
13
+ templateId: config.id
14
+ )
18
15
  }
19
16
  }
@@ -5,21 +5,31 @@
5
5
  // Created by Samuel Brucksch on 28.10.25.
6
6
  //
7
7
 
8
+ import NitroModules
9
+
8
10
  class HybridSearchTemplate: HybridSearchTemplateSpec {
9
11
  func createSearchTemplate(config: SearchTemplateConfig) throws {
10
12
  let template = SearchTemplate(config: config)
11
- try RootModule.withScene { scene in
12
- scene.templateStore.addTemplate(
13
- template: template,
14
- templateId: config.id
15
- )
16
- }
13
+ TemplateStore.addTemplate(
14
+ template: template,
15
+ templateId: config.id
16
+ )
17
17
  }
18
18
 
19
- func updateSearchResults(templateId: String, results: NitroSection) throws {
20
- try RootModule.withAutoPlayTemplate(templateId: templateId) {
21
- (template: SearchTemplate) in
22
- template.updateSearchResults(results: results)
19
+ func updateSearchResults(templateId: String, results: NitroSection) throws
20
+ -> Promise<Void>
21
+ {
22
+ return Promise.async {
23
+ guard
24
+ let template = TemplateStore.getTemplate(templateId: templateId)
25
+ as? SearchTemplate
26
+ else {
27
+ throw AutoPlayError.invalidTemplateType(
28
+ "\(templateId) is not a SearchTemplate"
29
+ )
30
+ }
31
+
32
+ await template.updateSearchResults(results: results)
23
33
  }
24
34
  }
25
35
  }
@@ -10,14 +10,11 @@ import CarPlay
10
10
  @MainActor
11
11
  class AutoPlayInterfaceController: NSObject, CPInterfaceControllerDelegate {
12
12
  let interfaceController: CPInterfaceController
13
- let templateStore: TemplateStore
14
13
 
15
14
  init(
16
- interfaceController: CPInterfaceController,
17
- templateStore: TemplateStore
15
+ interfaceController: CPInterfaceController
18
16
  ) {
19
17
  self.interfaceController = interfaceController
20
- self.templateStore = templateStore
21
18
 
22
19
  super.init()
23
20
 
@@ -47,7 +44,7 @@ class AutoPlayInterfaceController: NSObject, CPInterfaceControllerDelegate {
47
44
  var rootTemplateId: String? {
48
45
  return interfaceController.rootTemplate.id
49
46
  }
50
-
47
+
51
48
  func pushTemplate(
52
49
  _ templateToPush: CPTemplate,
53
50
  animated: Bool
@@ -77,7 +74,7 @@ class AutoPlayInterfaceController: NSObject, CPInterfaceControllerDelegate {
77
74
  animated: animated
78
75
  )
79
76
 
80
- self.templateStore.removeTemplate(templateId: templateId)
77
+ TemplateStore.removeTemplate(templateId: templateId)
81
78
 
82
79
  return templateId
83
80
  }
@@ -100,7 +97,7 @@ class AutoPlayInterfaceController: NSObject, CPInterfaceControllerDelegate {
100
97
  animated: animated
101
98
  )
102
99
 
103
- self.templateStore.removeTemplates(templateIds: templateIds)
100
+ TemplateStore.removeTemplates(templateIds: templateIds)
104
101
 
105
102
  return templateIds
106
103
  }
@@ -157,7 +154,7 @@ class AutoPlayInterfaceController: NSObject, CPInterfaceControllerDelegate {
157
154
  try await interfaceController.dismissTemplate(
158
155
  animated: animated
159
156
  )
160
-
157
+
161
158
  return true
162
159
  }
163
160
 
@@ -168,7 +165,7 @@ class AutoPlayInterfaceController: NSObject, CPInterfaceControllerDelegate {
168
165
  ) {
169
166
  let templateId = aTemplate.id
170
167
 
171
- templateStore.getTemplate(templateId: templateId)?.onWillAppear(
168
+ TemplateStore.getTemplate(templateId: templateId)?.onWillAppear(
172
169
  animated: animated
173
170
  )
174
171
  }
@@ -181,10 +178,10 @@ class AutoPlayInterfaceController: NSObject, CPInterfaceControllerDelegate {
181
178
 
182
179
  if rootTemplateId == templateId {
183
180
  // this makes sure we purge outdated CPSearchTemplate since that one can be popped on with a CarPlay native button we can not intercept
184
- templateStore.purge()
181
+ TemplateStore.purge()
185
182
  }
186
183
 
187
- templateStore.getTemplate(templateId: templateId)?.onDidAppear(
184
+ TemplateStore.getTemplate(templateId: templateId)?.onDidAppear(
188
185
  animated: animated
189
186
  )
190
187
  }
@@ -195,7 +192,7 @@ class AutoPlayInterfaceController: NSObject, CPInterfaceControllerDelegate {
195
192
  ) {
196
193
  let templateId = aTemplate.id
197
194
 
198
- templateStore.getTemplate(templateId: templateId)?.onWillDisappear(
195
+ TemplateStore.getTemplate(templateId: templateId)?.onWillDisappear(
199
196
  animated: animated
200
197
  )
201
198
  }
@@ -206,12 +203,12 @@ class AutoPlayInterfaceController: NSObject, CPInterfaceControllerDelegate {
206
203
  ) {
207
204
  let templateId = aTemplate.id
208
205
 
209
- templateStore.getTemplate(templateId: templateId)?.onDidDisappear(
206
+ TemplateStore.getTemplate(templateId: templateId)?.onDidDisappear(
210
207
  animated: animated
211
208
  )
212
209
 
213
210
  if aTemplate is CPAlertTemplate {
214
- templateStore.removeTemplate(templateId: templateId)
211
+ TemplateStore.removeTemplate(templateId: templateId)
215
212
 
216
213
  HybridAutoPlay.removeListeners(
217
214
  templateId: templateId
@@ -106,7 +106,7 @@ class AutoPlayScene: UIResponder {
106
106
 
107
107
  open func traitCollectionDidChange(traitCollection: UITraitCollection) {
108
108
  self.traitCollection = traitCollection
109
- self.templateStore.traitCollectionDidChange()
109
+ TemplateStore.traitCollectionDidChange()
110
110
  }
111
111
 
112
112
  open func safeAreaInsetsDidChange(safeAreaInsets: UIEdgeInsets) {