@iternio/react-native-auto-play 0.1.0 → 0.1.1
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/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/VirtualRenderer.kt +16 -5
- package/ios/Types.swift +2 -0
- package/ios/hybrid/HybridAutoPlay.swift +2 -2
- package/ios/hybrid/HybridCarPlayDashboard.swift +7 -3
- package/ios/hybrid/HybridCluster.swift +1 -1
- package/ios/scenes/AutoPlayScene.swift +29 -31
- package/lib/specs/CarPlayDashboard.nitro.d.ts +1 -1
- package/nitrogen/generated/ios/ReactNativeAutoPlay-Swift-Cxx-Bridge.hpp +9 -9
- package/nitrogen/generated/ios/c++/HybridCarPlayDashboardSpecSwift.hpp +3 -1
- package/nitrogen/generated/ios/swift/HybridCarPlayDashboardSpec.swift +1 -1
- package/nitrogen/generated/ios/swift/HybridCarPlayDashboardSpec_cxx.swift +12 -4
- package/nitrogen/generated/shared/c++/HybridCarPlayDashboardSpec.hpp +1 -1
- package/package.json +1 -1
- package/src/specs/CarPlayDashboard.nitro.ts +1 -1
package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/VirtualRenderer.kt
CHANGED
|
@@ -43,6 +43,10 @@ class VirtualRenderer(
|
|
|
43
43
|
private val isCluster: Boolean = false
|
|
44
44
|
) {
|
|
45
45
|
private lateinit var uiManager: FabricUIManager
|
|
46
|
+
private fun isUiManagerInitialized(): Boolean {
|
|
47
|
+
return ::uiManager.isInitialized
|
|
48
|
+
}
|
|
49
|
+
|
|
46
50
|
private lateinit var display: Display
|
|
47
51
|
private lateinit var reactContext: ReactContext
|
|
48
52
|
|
|
@@ -51,6 +55,9 @@ class VirtualRenderer(
|
|
|
51
55
|
private var reactSurfaceId: Int? = null
|
|
52
56
|
|
|
53
57
|
private lateinit var reactRootView: ReactRootView
|
|
58
|
+
private fun isReactRootViewInitialized(): Boolean {
|
|
59
|
+
return ::reactRootView.isInitialized
|
|
60
|
+
}
|
|
54
61
|
|
|
55
62
|
private var height: Int = 0
|
|
56
63
|
private var width: Int = 0
|
|
@@ -270,7 +277,7 @@ class VirtualRenderer(
|
|
|
270
277
|
val reactNativeScale = virtualScreenDensity / mainScreenDensity * BuildConfig.SCALE_FACTOR
|
|
271
278
|
|
|
272
279
|
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
|
|
273
|
-
if (!
|
|
280
|
+
if (!isUiManagerInitialized()) {
|
|
274
281
|
// this makes sure we have all required instances
|
|
275
282
|
// no matter if the app is launched on the phone or AA first
|
|
276
283
|
return
|
|
@@ -299,7 +306,7 @@ class VirtualRenderer(
|
|
|
299
306
|
|
|
300
307
|
var splashScreenView: View? = null
|
|
301
308
|
|
|
302
|
-
if (!
|
|
309
|
+
if (!isReactRootViewInitialized()) {
|
|
303
310
|
splashScreenView =
|
|
304
311
|
if (isCluster) getClusterSplashScreen(context, height, width) else null
|
|
305
312
|
|
|
@@ -470,11 +477,15 @@ class VirtualRenderer(
|
|
|
470
477
|
val renderer = virtualRenderer[moduleId]
|
|
471
478
|
|
|
472
479
|
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
|
|
473
|
-
renderer?.
|
|
474
|
-
renderer.
|
|
480
|
+
if (renderer?.isUiManagerInitialized() == true) {
|
|
481
|
+
renderer.reactSurfaceId?.let {
|
|
482
|
+
renderer.uiManager.stopSurface(it)
|
|
483
|
+
}
|
|
475
484
|
}
|
|
476
485
|
} else {
|
|
477
|
-
renderer?.
|
|
486
|
+
if (renderer?.isReactRootViewInitialized() == true) {
|
|
487
|
+
renderer.reactRootView.unmountReactApplication()
|
|
488
|
+
}
|
|
478
489
|
}
|
|
479
490
|
|
|
480
491
|
virtualRenderer.remove(moduleId)
|
package/ios/Types.swift
CHANGED
|
@@ -131,8 +131,8 @@ class HybridAutoPlay: HybridAutoPlaySpec {
|
|
|
131
131
|
let carPlayTemplate = template.getTemplate()
|
|
132
132
|
|
|
133
133
|
if carPlayTemplate is CPMapTemplate {
|
|
134
|
-
await MainActor.run {
|
|
135
|
-
scene.initRootView()
|
|
134
|
+
try await MainActor.run {
|
|
135
|
+
try scene.initRootView()
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
|
|
@@ -30,9 +30,13 @@ class HybridCarPlayDashboard: HybridCarPlayDashboardSpec {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
func initRootView() throws {
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
func initRootView() throws -> Promise<Void> {
|
|
34
|
+
return Promise.async {
|
|
35
|
+
guard let scene = try SceneStore.getDashboardScene() else { return }
|
|
36
|
+
try await MainActor.run {
|
|
37
|
+
try scene.initRootView()
|
|
38
|
+
}
|
|
39
|
+
}
|
|
36
40
|
}
|
|
37
41
|
|
|
38
42
|
func setButtons(buttons: [NitroCarPlayDashboardButton]) throws -> Promise<
|
|
@@ -9,7 +9,7 @@ import CarPlay
|
|
|
9
9
|
|
|
10
10
|
class AutoPlayScene: UIResponder {
|
|
11
11
|
var initialProperties: [String: Any] = [:]
|
|
12
|
-
|
|
12
|
+
let moduleName: String
|
|
13
13
|
var window: UIWindow?
|
|
14
14
|
var isConnected = false
|
|
15
15
|
var interfaceController: AutoPlayInterfaceController?
|
|
@@ -17,7 +17,11 @@ class AutoPlayScene: UIResponder {
|
|
|
17
17
|
var traitCollection = UIScreen.main.traitCollection
|
|
18
18
|
var safeAreaInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
|
|
19
19
|
|
|
20
|
-
override init() {
|
|
20
|
+
override init() {
|
|
21
|
+
fatalError(
|
|
22
|
+
"init() should never be called - use init(moduleName: String) instead"
|
|
23
|
+
)
|
|
24
|
+
}
|
|
21
25
|
|
|
22
26
|
init(moduleName: String) {
|
|
23
27
|
self.moduleName = moduleName
|
|
@@ -46,43 +50,37 @@ class AutoPlayScene: UIResponder {
|
|
|
46
50
|
self.window = nil
|
|
47
51
|
isConnected = false
|
|
48
52
|
|
|
49
|
-
guard let moduleName = self.moduleName else {
|
|
50
|
-
return
|
|
51
|
-
}
|
|
52
|
-
|
|
53
53
|
SceneStore.removeScene(moduleName: moduleName)
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
func setState(state: VisibilityState) {
|
|
57
|
-
guard let moduleName = self.moduleName else {
|
|
58
|
-
return
|
|
59
|
-
}
|
|
60
|
-
|
|
61
57
|
SceneStore.setState(moduleName: moduleName, state: state)
|
|
62
58
|
}
|
|
63
59
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
guard let moduleName = self.moduleName else {
|
|
70
|
-
return
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
guard
|
|
74
|
-
let rootView = ViewUtils.getRootView(
|
|
75
|
-
moduleName: moduleName,
|
|
76
|
-
initialProps: self.initialProperties
|
|
77
|
-
)
|
|
78
|
-
else { return }
|
|
79
|
-
|
|
80
|
-
window.rootViewController = AutoPlaySceneViewController(
|
|
81
|
-
view: rootView,
|
|
82
|
-
moduleName: moduleName
|
|
60
|
+
@MainActor
|
|
61
|
+
func initRootView() throws {
|
|
62
|
+
guard let window = self.window else {
|
|
63
|
+
throw AutoPlayError.noUiWindow(
|
|
64
|
+
"window nil for module: \(moduleName)"
|
|
83
65
|
)
|
|
84
|
-
window.makeKeyAndVisible()
|
|
85
66
|
}
|
|
67
|
+
|
|
68
|
+
guard
|
|
69
|
+
let rootView = ViewUtils.getRootView(
|
|
70
|
+
moduleName: moduleName,
|
|
71
|
+
initialProps: self.initialProperties
|
|
72
|
+
)
|
|
73
|
+
else {
|
|
74
|
+
throw AutoPlayError.initReactRootViewFailed(
|
|
75
|
+
"could not create react root view for module: \(moduleName)"
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
window.rootViewController = AutoPlaySceneViewController(
|
|
80
|
+
view: rootView,
|
|
81
|
+
moduleName: moduleName
|
|
82
|
+
)
|
|
83
|
+
window.makeKeyAndVisible()
|
|
86
84
|
}
|
|
87
85
|
|
|
88
86
|
open func traitCollectionDidChange(traitCollection: UITraitCollection) {
|
|
@@ -93,7 +91,7 @@ class AutoPlayScene: UIResponder {
|
|
|
93
91
|
open func safeAreaInsetsDidChange(safeAreaInsets: UIEdgeInsets) {
|
|
94
92
|
self.safeAreaInsets = safeAreaInsets
|
|
95
93
|
HybridAutoPlay.emitSafeAreaInsets(
|
|
96
|
-
moduleName: moduleName
|
|
94
|
+
moduleName: moduleName,
|
|
97
95
|
safeAreaInsets: safeAreaInsets
|
|
98
96
|
)
|
|
99
97
|
}
|
|
@@ -16,7 +16,7 @@ export interface CarPlayDashboard extends HybridObject<{
|
|
|
16
16
|
}> {
|
|
17
17
|
addListener(eventType: EventName, callback: () => void): CleanupCallback;
|
|
18
18
|
setButtons(buttons: Array<NitroCarPlayDashboardButton>): Promise<void>;
|
|
19
|
-
initRootView(): void
|
|
19
|
+
initRootView(): Promise<void>;
|
|
20
20
|
addListenerColorScheme(callback: (payload: ColorScheme) => void): CleanupCallback;
|
|
21
21
|
}
|
|
22
22
|
export {};
|
|
@@ -613,15 +613,6 @@ namespace margelo::nitro::swe::iternio::reactnativeautoplay::bridge::swift {
|
|
|
613
613
|
using std__weak_ptr_HybridCarPlayDashboardSpec_ = std::weak_ptr<HybridCarPlayDashboardSpec>;
|
|
614
614
|
inline std__weak_ptr_HybridCarPlayDashboardSpec_ weakify_std__shared_ptr_HybridCarPlayDashboardSpec_(const std::shared_ptr<HybridCarPlayDashboardSpec>& strong) noexcept { return strong; }
|
|
615
615
|
|
|
616
|
-
// pragma MARK: Result<void>
|
|
617
|
-
using Result_void_ = Result<void>;
|
|
618
|
-
inline Result_void_ create_Result_void_() noexcept {
|
|
619
|
-
return Result<void>::withValue();
|
|
620
|
-
}
|
|
621
|
-
inline Result_void_ create_Result_void_(const std::exception_ptr& error) noexcept {
|
|
622
|
-
return Result<void>::withError(error);
|
|
623
|
-
}
|
|
624
|
-
|
|
625
616
|
// pragma MARK: std::function<void(const std::string& /* clusterId */)>
|
|
626
617
|
/**
|
|
627
618
|
* Specialized version of `std::function<void(const std::string&)>`.
|
|
@@ -759,6 +750,15 @@ namespace margelo::nitro::swe::iternio::reactnativeautoplay::bridge::swift {
|
|
|
759
750
|
using std__weak_ptr_HybridClusterSpec_ = std::weak_ptr<HybridClusterSpec>;
|
|
760
751
|
inline std__weak_ptr_HybridClusterSpec_ weakify_std__shared_ptr_HybridClusterSpec_(const std::shared_ptr<HybridClusterSpec>& strong) noexcept { return strong; }
|
|
761
752
|
|
|
753
|
+
// pragma MARK: Result<void>
|
|
754
|
+
using Result_void_ = Result<void>;
|
|
755
|
+
inline Result_void_ create_Result_void_() noexcept {
|
|
756
|
+
return Result<void>::withValue();
|
|
757
|
+
}
|
|
758
|
+
inline Result_void_ create_Result_void_(const std::exception_ptr& error) noexcept {
|
|
759
|
+
return Result<void>::withError(error);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
762
|
// pragma MARK: std::function<void(std::optional<bool> /* animated */)>
|
|
763
763
|
/**
|
|
764
764
|
* Specialized version of `std::function<void(std::optional<bool>)>`.
|
|
@@ -98,11 +98,13 @@ namespace margelo::nitro::swe::iternio::reactnativeautoplay {
|
|
|
98
98
|
auto __value = std::move(__result.value());
|
|
99
99
|
return __value;
|
|
100
100
|
}
|
|
101
|
-
inline void initRootView() override {
|
|
101
|
+
inline std::shared_ptr<Promise<void>> initRootView() override {
|
|
102
102
|
auto __result = _swiftPart.initRootView();
|
|
103
103
|
if (__result.hasError()) [[unlikely]] {
|
|
104
104
|
std::rethrow_exception(__result.error());
|
|
105
105
|
}
|
|
106
|
+
auto __value = std::move(__result.value());
|
|
107
|
+
return __value;
|
|
106
108
|
}
|
|
107
109
|
inline std::function<void()> addListenerColorScheme(const std::function<void(ColorScheme /* payload */)>& callback) override {
|
|
108
110
|
auto __result = _swiftPart.addListenerColorScheme(callback);
|
|
@@ -17,7 +17,7 @@ public protocol HybridCarPlayDashboardSpec_protocol: HybridObject {
|
|
|
17
17
|
// Methods
|
|
18
18
|
func addListener(eventType: EventName, callback: @escaping () -> Void) throws -> () -> Void
|
|
19
19
|
func setButtons(buttons: [NitroCarPlayDashboardButton]) throws -> Promise<Void>
|
|
20
|
-
func initRootView() throws -> Void
|
|
20
|
+
func initRootView() throws -> Promise<Void>
|
|
21
21
|
func addListenerColorScheme(callback: @escaping (_ payload: ColorScheme) -> Void) throws -> () -> Void
|
|
22
22
|
}
|
|
23
23
|
|
|
@@ -158,13 +158,21 @@ open class HybridCarPlayDashboardSpec_cxx {
|
|
|
158
158
|
}
|
|
159
159
|
|
|
160
160
|
@inline(__always)
|
|
161
|
-
public final func initRootView() -> bridge.
|
|
161
|
+
public final func initRootView() -> bridge.Result_std__shared_ptr_Promise_void___ {
|
|
162
162
|
do {
|
|
163
|
-
try self.__implementation.initRootView()
|
|
164
|
-
|
|
163
|
+
let __result = try self.__implementation.initRootView()
|
|
164
|
+
let __resultCpp = { () -> bridge.std__shared_ptr_Promise_void__ in
|
|
165
|
+
let __promise = bridge.create_std__shared_ptr_Promise_void__()
|
|
166
|
+
let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_void__(__promise)
|
|
167
|
+
__result
|
|
168
|
+
.then({ __result in __promiseHolder.resolve() })
|
|
169
|
+
.catch({ __error in __promiseHolder.reject(__error.toCpp()) })
|
|
170
|
+
return __promise
|
|
171
|
+
}()
|
|
172
|
+
return bridge.create_Result_std__shared_ptr_Promise_void___(__resultCpp)
|
|
165
173
|
} catch (let __error) {
|
|
166
174
|
let __exceptionPtr = __error.toCpp()
|
|
167
|
-
return bridge.
|
|
175
|
+
return bridge.create_Result_std__shared_ptr_Promise_void___(__exceptionPtr)
|
|
168
176
|
}
|
|
169
177
|
}
|
|
170
178
|
|
|
@@ -60,7 +60,7 @@ namespace margelo::nitro::swe::iternio::reactnativeautoplay {
|
|
|
60
60
|
// Methods
|
|
61
61
|
virtual std::function<void()> addListener(EventName eventType, const std::function<void()>& callback) = 0;
|
|
62
62
|
virtual std::shared_ptr<Promise<void>> setButtons(const std::vector<NitroCarPlayDashboardButton>& buttons) = 0;
|
|
63
|
-
virtual void initRootView() = 0;
|
|
63
|
+
virtual std::shared_ptr<Promise<void>> initRootView() = 0;
|
|
64
64
|
virtual std::function<void()> addListenerColorScheme(const std::function<void(ColorScheme /* payload */)>& callback) = 0;
|
|
65
65
|
|
|
66
66
|
protected:
|
package/package.json
CHANGED
|
@@ -17,6 +17,6 @@ interface NitroCarPlayDashboardButton extends BaseCarPlayDashboardButton {
|
|
|
17
17
|
export interface CarPlayDashboard extends HybridObject<{ ios: 'swift' }> {
|
|
18
18
|
addListener(eventType: EventName, callback: () => void): CleanupCallback;
|
|
19
19
|
setButtons(buttons: Array<NitroCarPlayDashboardButton>): Promise<void>;
|
|
20
|
-
initRootView(): void
|
|
20
|
+
initRootView(): Promise<void>;
|
|
21
21
|
addListenerColorScheme(callback: (payload: ColorScheme) => void): CleanupCallback;
|
|
22
22
|
}
|