@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.
@@ -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 (!this::uiManager.isInitialized) {
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 (!this@VirtualRenderer::reactRootView.isInitialized) {
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?.reactSurfaceId?.let {
474
- renderer.uiManager.stopSurface(it)
480
+ if (renderer?.isUiManagerInitialized() == true) {
481
+ renderer.reactSurfaceId?.let {
482
+ renderer.uiManager.stopSurface(it)
483
+ }
475
484
  }
476
485
  } else {
477
- renderer?.reactRootView?.unmountReactApplication()
486
+ if (renderer?.isReactRootViewInitialized() == true) {
487
+ renderer.reactRootView.unmountReactApplication()
488
+ }
478
489
  }
479
490
 
480
491
  virtualRenderer.remove(moduleId)
package/ios/Types.swift CHANGED
@@ -18,4 +18,6 @@ enum AutoPlayError: Error {
18
18
  case propertyNotFoundError(String)
19
19
  case unsupportedVersion(String)
20
20
  case invalidTemplateType(String)
21
+ case noUiWindow(String)
22
+ case initReactRootViewFailed(String)
21
23
  }
@@ -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
- let scene = try SceneStore.getDashboardScene()
35
- scene?.initRootView()
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<
@@ -60,7 +60,7 @@ class HybridCluster: HybridClusterSpec {
60
60
  let scene = try SceneStore.getClusterScene(
61
61
  clusterId: clusterId
62
62
  )
63
- scene?.initRootView()
63
+ try scene?.initRootView()
64
64
  }
65
65
  } else {
66
66
  throw AutoPlayError.unsupportedVersion(
@@ -9,7 +9,7 @@ import CarPlay
9
9
 
10
10
  class AutoPlayScene: UIResponder {
11
11
  var initialProperties: [String: Any] = [:]
12
- var moduleName: String?
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
- func initRootView() {
65
- DispatchQueue.main.async {
66
- guard let window = self.window else {
67
- return
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.Result_void_ {
161
+ public final func initRootView() -> bridge.Result_std__shared_ptr_Promise_void___ {
162
162
  do {
163
- try self.__implementation.initRootView()
164
- return bridge.create_Result_void_()
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.create_Result_void_(__exceptionPtr)
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iternio/react-native-auto-play",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Android Auto and Apple CarPlay for react-native",
5
5
  "main": "lib/index",
6
6
  "module": "lib/index",
@@ -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
  }