@iternio/react-native-auto-play 0.0.12 → 0.1.0

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.
@@ -0,0 +1,10 @@
1
+ //
2
+ // NitroSurface.h
3
+ // Pods
4
+ //
5
+ // Created by Manuel Auer on 28.11.25.
6
+ //
7
+
8
+ @interface NitroSurface : NSObject
9
+ + (void)stop:(nullable UIView *)view;
10
+ @end
@@ -0,0 +1,51 @@
1
+ //
2
+ // NitroSurface.m
3
+ // Pods
4
+ //
5
+ // Created by Manuel Auer on 28.11.25.
6
+ //
7
+
8
+ #import "NitroSurface.h"
9
+ #import <React/RCTInvalidating.h>
10
+ #import <React/RCTRootView.h>
11
+ #import <React/RCTSurface.h>
12
+ #import <React/RCTSurfaceHostingProxyRootView.h>
13
+
14
+ @implementation NitroSurface
15
+
16
+ + (void)stop:(nullable UIView *)view {
17
+ if (view == nil) {
18
+ NSLog(@"[AutoPlay] View is nil, ignoring");
19
+ return;
20
+ }
21
+
22
+ if ([view isKindOfClass:[RCTSurfaceHostingProxyRootView class]]) {
23
+ RCTSurfaceHostingProxyRootView *rootView =
24
+ (RCTSurfaceHostingProxyRootView *)view;
25
+ RCTSurface *surface = rootView.surface;
26
+
27
+ if (surface == nil) {
28
+ NSLog(@"[AutoPlay] surface == nil, cannot stop");
29
+ return;
30
+ }
31
+
32
+ [surface stop];
33
+ return;
34
+ }
35
+
36
+ if ([view isKindOfClass:[RCTRootView class]]) {
37
+ RCTRootView *rootView = (RCTRootView *)view;
38
+ UIView<RCTInvalidating> *contentView = (UIView<RCTInvalidating> *)rootView.contentView;
39
+
40
+ if ([contentView conformsToProtocol:@protocol(RCTInvalidating)]) {
41
+ [contentView invalidate];
42
+ } else {
43
+ NSLog(@"[AutoPlay] contentView does not conform to RCTInvalidating");
44
+ }
45
+ return;
46
+ }
47
+
48
+ NSLog(@"[AutoPlay] View is not recognized type, ignoring");
49
+ }
50
+
51
+ @end
@@ -7,10 +7,6 @@
7
7
 
8
8
  import CarPlay
9
9
 
10
- #if RCT_NEW_ARCH_ENABLED
11
- import React
12
- #endif
13
-
14
10
  class AutoPlayScene: UIResponder {
15
11
  var initialProperties: [String: Any] = [:]
16
12
  var moduleName: String?
@@ -46,22 +42,7 @@ class AutoPlayScene: UIResponder {
46
42
  }
47
43
 
48
44
  func disconnect() {
49
- #if RCT_NEW_ARCH_ENABLED
50
- if let rootView = self.window?.rootViewController?.view
51
- as? RCTSurfaceHostingProxyRootView
52
- {
53
- rootView.surface.stop()
54
- }
55
- #else
56
- if let rootView = self.window?.rootViewController?.view
57
- as? RCTRootView
58
- {
59
- if let contentView = rootView.contentView as? RCTInvalidating {
60
- contentView.invalidate()
61
- }
62
- }
63
- #endif
64
-
45
+ NitroSurface.stop(self.window?.rootViewController?.view)
65
46
  self.window = nil
66
47
  isConnected = false
67
48
 
@@ -0,0 +1,15 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+ import type { CleanupCallback } from '../types/Event';
3
+ import type { Telemetry } from '../types/Telemetry';
4
+ export interface HybridAndroidAutoTelemetry extends HybridObject<{
5
+ android: 'kotlin';
6
+ }> {
7
+ /**
8
+ * Register a listener for Android Auto telemetry data. Should be registered only after the telemetry permissions are granted otherwise no data will be received.
9
+ * @param callback the callback to receive the telemetry data
10
+ * @param error the error message if the telemetry listener failed to start
11
+ * @returns callback to remove the listener
12
+ * @namespace Android
13
+ */
14
+ registerTelemetryListener(callback: (tlm?: Telemetry, error?: string) => void): CleanupCallback;
15
+ }
@@ -0,0 +1,64 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+ import type { TemplateConfig } from '../templates/Template';
3
+ import type { CleanupCallback, EventName, SafeAreaInsets, VisibilityState } from '../types/Event';
4
+ import type { NitroAction } from '../utils/NitroAction';
5
+ export interface NitroTemplateConfig extends TemplateConfig {
6
+ id: string;
7
+ }
8
+ export interface HybridAutoPlay extends HybridObject<{
9
+ android: 'kotlin';
10
+ ios: 'swift';
11
+ }> {
12
+ /**
13
+ * attach a listener for didConnect and didDisconnect
14
+ * @namespace all
15
+ * @param eventType generic events
16
+ * @returns callback to remove the listener
17
+ */
18
+ addListener(eventType: EventName, callback: () => void): CleanupCallback;
19
+ /**
20
+ * adds a listener for the session/scene state
21
+ * fires willAppear & didAppear when the scene/session is visible
22
+ * fires willDisappear & didDisappear when the scene/session is not visible
23
+ * @param moduleName on of @AutoPlayModules, a cluster scene uuid or your main for the WindowApplicationSceneDelegate
24
+ */
25
+ addListenerRenderState(moduleName: string, callback: (payload: VisibilityState) => void): CleanupCallback;
26
+ /**
27
+ * sets the specified template as root template, initializes a new stack
28
+ * Promise might contain an error message in case setting root template failed
29
+ * can be used on any Android screen/iOS scene
30
+ */
31
+ setRootTemplate(templateId: string): Promise<void>;
32
+ /**
33
+ * push a template to the AutoPlayRoot Android screen/iOS scene
34
+ */
35
+ pushTemplate(templateId: string): Promise<void>;
36
+ /**
37
+ * remove the top template from the stack
38
+ * @param animate - defaults to true
39
+ */
40
+ popTemplate(animate?: boolean): Promise<void>;
41
+ /**
42
+ * remove all templates from the stack except the root template
43
+ * @param animate - defaults to true
44
+ */
45
+ popToRootTemplate(animate?: boolean): Promise<void>;
46
+ /**
47
+ * removes all templates until the specified one is the top template
48
+ */
49
+ popToTemplate(templateId: string, animate?: boolean): Promise<void>;
50
+ /**
51
+ * callback for safe area insets changes
52
+ * @param insets the insets that you use to determine the safe area for this view.
53
+ */
54
+ addSafeAreaInsetsListener(moduleName: string, callback: (insets: SafeAreaInsets) => void): CleanupCallback;
55
+ /**
56
+ * update a templates headerActions
57
+ */
58
+ setTemplateHeaderActions(templateId: string, headerActions?: Array<NitroAction>): void;
59
+ /**
60
+ * Check if AutoPlay is connected.
61
+ * @returns true if AutoPlay is connected, false otherwise.
62
+ */
63
+ isConnected(): boolean;
64
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,22 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+ import type { CleanupCallback, EventName } from '../types/Event';
3
+ import type { ColorScheme } from '../types/RootComponent';
4
+ import type { NitroImage } from '../utils/NitroImage';
5
+ export interface BaseCarPlayDashboardButton {
6
+ titleVariants: Array<string>;
7
+ subtitleVariants: Array<string>;
8
+ onPress: () => void;
9
+ launchHeadUnitScene?: boolean;
10
+ }
11
+ interface NitroCarPlayDashboardButton extends BaseCarPlayDashboardButton {
12
+ image: NitroImage;
13
+ }
14
+ export interface HybridCarPlayDashboard extends HybridObject<{
15
+ ios: 'swift';
16
+ }> {
17
+ addListener(eventType: EventName, callback: () => void): CleanupCallback;
18
+ setButtons(buttons: Array<NitroCarPlayDashboardButton>): Promise<void>;
19
+ initRootView(): void;
20
+ addListenerColorScheme(callback: (payload: ColorScheme) => void): CleanupCallback;
21
+ }
22
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,19 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+ import type { CleanupCallback } from '../types/Event';
3
+ import type { ColorScheme } from '../types/RootComponent';
4
+ import type { NitroAttributedString } from '../utils/NitroAttributedString';
5
+ type ClusterEventName = 'didConnect' | 'didConnectWithWindow' | 'didDisconnect' | 'didDisconnectFromWindow';
6
+ export type ZoomEvent = 'in' | 'out';
7
+ export interface HybridCluster extends HybridObject<{
8
+ android: 'kotlin';
9
+ ios: 'swift';
10
+ }> {
11
+ addListener(eventType: ClusterEventName, callback: (clusterId: string) => void): CleanupCallback;
12
+ initRootView(clusterId: string): Promise<void>;
13
+ setAttributedInactiveDescriptionVariants(clusterId: string, attributedInactiveDescriptionVariants: Array<NitroAttributedString>): void;
14
+ addListenerColorScheme(callback: (clusterId: string, payload: ColorScheme) => void): CleanupCallback;
15
+ addListenerZoom(callback: (clusterId: string, payload: ZoomEvent) => void): CleanupCallback;
16
+ addListenerCompass(callback: (clusterId: string, payload: boolean) => void): CleanupCallback;
17
+ addListenerSpeedLimit(callback: (clusterId: string, payload: boolean) => void): CleanupCallback;
18
+ }
19
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,14 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+ import type { NitroGridTemplateConfig } from '../templates/GridTemplate';
3
+ import type { NitroGridButton } from '../utils/NitroGrid';
4
+ import type { NitroTemplateConfig } from './HybridAutoPlay.nitro';
5
+ interface GridTemplateConfig extends NitroTemplateConfig, NitroGridTemplateConfig {
6
+ }
7
+ export interface HybridGridTemplate extends HybridObject<{
8
+ android: 'kotlin';
9
+ ios: 'swift';
10
+ }> {
11
+ createGridTemplate(config: GridTemplateConfig): void;
12
+ updateGridTemplateButtons(templateId: string, buttons: Array<NitroGridButton>): void;
13
+ }
14
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+ import type { NitroInformationTemplateConfig } from '../templates/InformationTemplate';
3
+ import type { NitroTemplateConfig } from './HybridAutoPlay.nitro';
4
+ interface InformationTemplateConfig extends NitroTemplateConfig, NitroInformationTemplateConfig {
5
+ }
6
+ export interface HybridInformationTemplate extends HybridObject<{
7
+ android: 'kotlin';
8
+ ios: 'swift';
9
+ }> {
10
+ createInformationTemplate(config: InformationTemplateConfig): void;
11
+ updateInformationTemplateSections(templateId: string, section: NitroInformationTemplateConfig['section']): void;
12
+ }
13
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+ import type { NitroListTemplateConfig } from '../templates/ListTemplate';
3
+ import type { NitroTemplateConfig } from './HybridAutoPlay.nitro';
4
+ interface ListTemplateConfig extends NitroTemplateConfig, NitroListTemplateConfig {
5
+ }
6
+ export interface HybridListTemplate extends HybridObject<{
7
+ android: 'kotlin';
8
+ ios: 'swift';
9
+ }> {
10
+ createListTemplate(config: ListTemplateConfig): void;
11
+ updateListTemplateSections(templateId: string, sections: NitroListTemplateConfig['sections']): void;
12
+ }
13
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,25 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+ import type { NavigationAlertCallbacks, NitroMapTemplateConfig, TripSelectorCallback, VisibleTravelEstimate } from '../templates/MapTemplate';
3
+ import type { TripConfig, TripPoint, TripPreviewTextConfiguration, TripsConfig } from '../types/Trip';
4
+ import type { NitroNavigationAlert } from '../utils/NitroAlert';
5
+ import type { NitroManeuver } from '../utils/NitroManeuver';
6
+ import type { NitroMapButton } from '../utils/NitroMapButton';
7
+ import type { NitroTemplateConfig } from './HybridAutoPlay.nitro';
8
+ interface MapTemplateConfig extends NitroTemplateConfig, NitroMapTemplateConfig {
9
+ }
10
+ export interface HybridMapTemplate extends HybridObject<{
11
+ android: 'kotlin';
12
+ ios: 'swift';
13
+ }> {
14
+ createMapTemplate(config: MapTemplateConfig): void;
15
+ showNavigationAlert(templateId: string, alert: NitroNavigationAlert): NavigationAlertCallbacks;
16
+ showTripSelector(templateId: string, trips: Array<TripsConfig>, selectedTripId: string | undefined, textConfig: TripPreviewTextConfiguration, onTripSelected: (tripId: string, routeId: string) => void, onTripStarted: (tripId: string, routeId: string) => void, onBackPressed: () => void, mapButtons: Array<NitroMapButton>): TripSelectorCallback;
17
+ hideTripSelector(templateId: string): void;
18
+ setTemplateMapButtons(templateId: string, buttons?: Array<NitroMapButton>): void;
19
+ updateVisibleTravelEstimate(templateId: string, visibleTravelEstimate: VisibleTravelEstimate): void;
20
+ updateTravelEstimates(templateId: string, steps: Array<TripPoint>): void;
21
+ updateManeuvers(templateId: string, maneuvers: NitroManeuver): void;
22
+ startNavigation(templateId: string, trip: TripConfig): void;
23
+ stopNavigation(templateId: string): void;
24
+ }
25
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+ import type { NitroMessageTemplateConfig } from '../templates/MessageTemplate';
3
+ import type { NitroTemplateConfig } from './HybridAutoPlay.nitro';
4
+ interface MessageTemplateConfig extends NitroTemplateConfig, NitroMessageTemplateConfig {
5
+ }
6
+ export interface HybridMessageTemplate extends HybridObject<{
7
+ android: 'kotlin';
8
+ ios: 'swift';
9
+ }> {
10
+ createMessageTemplate(config: MessageTemplateConfig): void;
11
+ }
12
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+ import type { NitroSearchTemplateConfig } from '../templates/SearchTemplate';
3
+ import type { NitroTemplateConfig } from './HybridAutoPlay.nitro';
4
+ interface SearchTemplateConfig extends NitroTemplateConfig, NitroSearchTemplateConfig {
5
+ }
6
+ export interface HybridSearchTemplate extends HybridObject<{
7
+ android: 'kotlin';
8
+ ios: 'swift';
9
+ }> {
10
+ createSearchTemplate(config: SearchTemplateConfig): void;
11
+ updateSearchResults(templateId: string, results: NitroSearchTemplateConfig['results']): void;
12
+ }
13
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,37 @@
1
+ type Translation = {
2
+ x: number;
3
+ y: number;
4
+ };
5
+ type Velocity = {
6
+ x: number;
7
+ y: number;
8
+ };
9
+ /**
10
+ * @param translation screen coordinate offset
11
+ * @param velocity only reported on iOS/CarPlay
12
+ */
13
+ export type PanGestureWithTranslationEventPayload = {
14
+ translation: Translation;
15
+ velocity?: Velocity;
16
+ };
17
+ /**
18
+ * @param x screen coordinate of the pinch center
19
+ * @param y screen coordinate of the pinch center
20
+ * @param scaleFactor value > 0.0 and < 2.0 when 1.0 means no scaling, > 1.0 zoom in and < 1.0 zoom out, value == 2.0 is a double tap
21
+ * @namespace Android
22
+ */
23
+ export type PinchGestureEventPayload = {
24
+ x: number;
25
+ y: number;
26
+ scaleFactor: number;
27
+ };
28
+ /**
29
+ * @param x screen coordinate of the press event
30
+ * @param y screen coordinate of the press event
31
+ * @namespace Android
32
+ */
33
+ export type PressEventPayload = {
34
+ x: number;
35
+ y: number;
36
+ };
37
+ export {};
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iternio/react-native-auto-play",
3
- "version": "0.0.12",
3
+ "version": "0.1.0",
4
4
  "description": "Android Auto and Apple CarPlay for react-native",
5
5
  "main": "lib/index",
6
6
  "module": "lib/index",
@@ -1,29 +0,0 @@
1
- //
2
- // RootView.h
3
- // Pods
4
- //
5
- // Created by Manuel Auer on 07.11.25.
6
- //
7
-
8
- // this is required for old architecture support since the React pod can not be imported
9
-
10
- #ifdef RCT_NEW_ARCH_ENABLED
11
-
12
- #else
13
-
14
- #import <Foundation/Foundation.h>
15
-
16
- @protocol RCTInvalidating <NSObject>
17
-
18
- - (void)invalidate;
19
-
20
- @end
21
-
22
- @interface RCTRootView : UIView
23
- /**
24
- * The React-managed contents view of the root view.
25
- */
26
- @property(nonatomic, strong, readonly) UIView *contentView;
27
- @end
28
-
29
- #endif
@@ -1,8 +0,0 @@
1
- import type { HybridObject } from 'react-native-nitro-modules';
2
- import type { CleanupCallback } from '../types/Event';
3
- export interface VoiceInput extends HybridObject<{
4
- android: 'kotlin';
5
- ios: 'swift';
6
- }> {
7
- registerVoiceInputListener(callback: (voiceInputResult?: string, error?: string) => void): CleanupCallback;
8
- }