@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.
- package/README.md +152 -8
- package/android/build.gradle +15 -1
- package/android/gradle.properties +1 -1
- 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
- package/android/src/automotive/AndroidManifest.xml +91 -0
- package/android/src/automotive/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/AndroidTelemetryObserver.kt +191 -0
- package/android/src/main/AndroidManifest.xml +0 -10
- package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/AndroidAutoScreen.kt +3 -0
- package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/AndroidAutoTelemetryHolder.kt +97 -19
- package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridAndroidAutoTelemetry.kt +39 -3
- package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridSignInTemplate.kt +22 -0
- package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/TelemetryObserver.kt +56 -0
- package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/VirtualRenderer.kt +15 -10
- package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/template/AutomotivePermissionRequestTemplate.kt +103 -0
- package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/template/GridTemplate.kt +0 -2
- package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/template/Parser.kt +8 -2
- package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/template/SignInTemplate.kt +159 -0
- package/ios/extensions/CarPlayExtensions.swift +4 -2
- package/ios/extensions/NitroImageExtensions.swift +4 -4
- package/ios/hybrid/HybridAutoPlay.swift +31 -42
- package/ios/hybrid/HybridCluster.swift +4 -2
- package/ios/hybrid/HybridGridTemplate.swift +11 -11
- package/ios/hybrid/HybridInformationTemplate.swift +12 -13
- package/ios/hybrid/HybridListTemplate.swift +12 -13
- package/ios/hybrid/HybridMapTemplate.swift +13 -16
- package/ios/hybrid/HybridMessageTemplate.swift +7 -4
- package/ios/hybrid/HybridSearchTemplate.swift +12 -13
- package/ios/scenes/AutoPlayInterfaceController.swift +41 -13
- package/ios/scenes/AutoPlayScene.swift +2 -1
- package/ios/scenes/AutoPlaySceneViewController.swift +8 -2
- package/ios/scenes/DashboardSceneDelegate.swift +15 -7
- package/ios/scenes/HeadUnitSceneDelegate.swift +7 -5
- package/ios/scenes/WindowApplicationSceneDelegate.swift +1 -1
- package/ios/templates/AutoPlayTemplate.swift +23 -15
- package/ios/templates/GridTemplate.swift +23 -16
- package/ios/templates/InformationTemplate.swift +12 -11
- package/ios/templates/ListTemplate.swift +11 -11
- package/ios/templates/MapTemplate.swift +44 -42
- package/ios/templates/MessageTemplate.swift +8 -12
- package/ios/templates/Parser.swift +2 -1
- package/ios/templates/SearchTemplate.swift +19 -17
- package/ios/templates/TemplateStore.swift +17 -9
- package/ios/utils/RootModule.swift +19 -12
- package/ios/utils/SymbolFont.swift +2 -1
- package/ios/utils/ViewUtils.swift +2 -2
- package/lib/hooks/useAndroidAutoTelemetry.d.ts +22 -4
- package/lib/hooks/useAndroidAutoTelemetry.js +52 -24
- package/lib/index.d.ts +2 -0
- package/lib/index.js +2 -0
- package/lib/specs/AndroidAutoTelemetry.nitro.d.ts +14 -1
- package/lib/types/Telemetry.d.ts +27 -0
- package/lib/types/Telemetry.js +7 -0
- package/nitro.json +3 -0
- package/nitrogen/generated/android/ReactNativeAutoPlay+autolinking.cmake +3 -0
- package/nitrogen/generated/android/ReactNativeAutoPlayOnLoad.cpp +12 -2
- package/nitrogen/generated/android/c++/JBooleanTelemetryItem.hpp +61 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_Telemetry_.hpp +87 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +10 -10
- package/nitrogen/generated/android/c++/JHybridAndroidAutoTelemetrySpec.cpp +41 -5
- package/nitrogen/generated/android/c++/JHybridAndroidAutoTelemetrySpec.hpp +2 -1
- package/nitrogen/generated/android/c++/JHybridSignInTemplateSpec.cpp +133 -0
- package/nitrogen/generated/android/c++/JHybridSignInTemplateSpec.hpp +66 -0
- package/nitrogen/generated/android/c++/JInputSignIn.hpp +103 -0
- package/nitrogen/generated/android/c++/JKeyboardType.hpp +65 -0
- package/nitrogen/generated/android/c++/JPermissionRequestResult.hpp +98 -0
- package/nitrogen/generated/android/c++/JPinSignIn.hpp +63 -0
- package/nitrogen/generated/android/c++/JQrSignIn.hpp +63 -0
- package/nitrogen/generated/android/c++/JSignInMethods.hpp +65 -0
- package/nitrogen/generated/android/c++/JSignInTemplateConfig.hpp +217 -0
- package/nitrogen/generated/android/c++/JTelemetry.hpp +25 -3
- package/nitrogen/generated/android/c++/JTextInputType.hpp +59 -0
- package/nitrogen/generated/android/c++/JVariant_QrSignIn_PinSignIn_InputSignIn.cpp +30 -0
- package/nitrogen/generated/android/c++/JVariant_QrSignIn_PinSignIn_InputSignIn.hpp +99 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/AssetImage.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/AutoText.kt +3 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/BooleanTelemetryItem.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/Distance.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/DurationWithTimeZone.kt +1 -1
- 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
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/Func_void_std__string.kt +9 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/GlyphImage.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/GridTemplateConfig.kt +9 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridAndroidAutoTelemetrySpec.kt +7 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridSignInTemplateSpec.kt +62 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/ImageLane.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/InformationTemplateConfig.kt +10 -10
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/InputSignIn.kt +63 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/KeyboardType.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/LaneGuidance.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/ListTemplateConfig.kt +10 -10
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/Location.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/MapTemplateConfig.kt +18 -18
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/MessageTemplateConfig.kt +12 -12
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NavigationAlertAction.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroAction.kt +7 -7
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroAttributedString.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroAttributedStringImage.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroBaseMapTemplateConfig.kt +10 -10
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroColor.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroGridButton.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroLoadingManeuver.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroMapButton.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroMessageManeuver.kt +3 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroNavigationAlert.kt +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroRoutingManeuver.kt +13 -13
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroRow.kt +7 -7
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroSection.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NumericTelemetryItem.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/PermissionRequestResult.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/PinSignIn.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/Point.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/PreferredImageLane.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/QrSignIn.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/RouteChoice.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/SafeAreaInsets.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/SearchTemplateConfig.kt +10 -10
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/SignInMethods.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/SignInTemplateConfig.kt +78 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/StringTelemetryItem.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/Telemetry.kt +24 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/TextInputType.kt +21 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/TravelEstimates.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/TripConfig.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/TripPoint.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/TripPreviewTextConfiguration.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/TripSelectorCallback.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/TripsConfig.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/Variant_QrSignIn_PinSignIn_InputSignIn.kt +72 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/VehicleTelemetryItem.kt +4 -4
- package/nitrogen/generated/shared/c++/BooleanTelemetryItem.hpp +79 -0
- package/nitrogen/generated/shared/c++/HybridAndroidAutoTelemetrySpec.cpp +1 -0
- package/nitrogen/generated/shared/c++/HybridAndroidAutoTelemetrySpec.hpp +7 -1
- package/nitrogen/generated/shared/c++/HybridSignInTemplateSpec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridSignInTemplateSpec.hpp +66 -0
- package/nitrogen/generated/shared/c++/InputSignIn.hpp +113 -0
- package/nitrogen/generated/shared/c++/KeyboardType.hpp +64 -0
- package/nitrogen/generated/shared/c++/PermissionRequestResult.hpp +80 -0
- package/nitrogen/generated/shared/c++/PinSignIn.hpp +81 -0
- package/nitrogen/generated/shared/c++/QrSignIn.hpp +81 -0
- package/nitrogen/generated/shared/c++/SignInMethods.hpp +64 -0
- package/nitrogen/generated/shared/c++/SignInTemplateConfig.hpp +138 -0
- package/nitrogen/generated/shared/c++/Telemetry.hpp +25 -2
- package/nitrogen/generated/shared/c++/TextInputType.hpp +62 -0
- package/package.json +3 -2
- package/src/hooks/useAndroidAutoTelemetry.ts +80 -27
- package/src/index.ts +2 -0
- package/src/specs/AndroidAutoTelemetry.nitro.ts +19 -1
- package/src/specs/SignInTemplate.nitro.ts +10 -0
- package/src/templates/SignInTemplate.ts +117 -0
- package/src/types/SignInMethod.ts +41 -0
- package/src/types/Telemetry.ts +29 -0
- package/lib/hooks/useIsAutoPlayFocused.d.ts +0 -7
- package/lib/hooks/useIsAutoPlayFocused.js +0 -20
- package/lib/hybrid.d.ts +0 -2
- package/lib/hybrid.js +0 -2
- package/lib/specs/AutomotivePermissionRequestTemplate.d.ts +0 -11
- package/lib/specs/AutomotivePermissionRequestTemplate.js +0 -1
- package/lib/specs/AutomotivePermissionRequestTemplate.nitro.d.ts +0 -11
- package/lib/specs/AutomotivePermissionRequestTemplate.nitro.js +0 -1
- package/lib/templates/AutomotivePermissionRequestTemplate.d.ts +0 -23
- package/lib/templates/AutomotivePermissionRequestTemplate.js +0 -18
- 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:
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
-
}
|
|
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.
|
|
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
|
|
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
|
-
}
|
|
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
|
-
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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
|
}
|
|
@@ -7,15 +7,15 @@
|
|
|
7
7
|
|
|
8
8
|
import CarPlay
|
|
9
9
|
|
|
10
|
-
class SearchTemplate:
|
|
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
|
|
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.
|
|
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
|
-
}
|
|
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
|
|
10
|
+
private var store: [String: AutoPlayTemplate] = [:]
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
func getCPTemplate(templateId key: String) -> CPTemplate? {
|
|
13
13
|
return store[key]?.getTemplate()
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
23
|
+
func addTemplate(template: AutoPlayTemplate, templateId: String) {
|
|
21
24
|
store[templateId] = template
|
|
22
25
|
}
|
|
23
26
|
|
|
24
|
-
|
|
27
|
+
func removeTemplate(templateId: String) {
|
|
25
28
|
store[templateId]?.onPopped()
|
|
26
29
|
|
|
27
30
|
store.removeValue(forKey: templateId)
|
|
28
31
|
}
|
|
29
32
|
|
|
30
|
-
|
|
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
|
-
|
|
41
|
+
func purge() {
|
|
39
42
|
store = store.filter { !($0.value.getTemplate() is CPSearchTemplate) }
|
|
40
43
|
}
|
|
41
44
|
|
|
42
|
-
|
|
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
|
-
|
|
32
|
-
let template =
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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
|
/**
|