@iternio/react-native-auto-play 0.1.16 → 0.2.0-alpha.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.
Files changed (140) hide show
  1. package/README.md +429 -14
  2. package/android/build.gradle +15 -1
  3. package/android/gradle.properties +1 -1
  4. 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
  5. package/android/src/automotive/AndroidManifest.xml +91 -0
  6. package/android/src/automotive/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/AndroidTelemetryObserver.kt +191 -0
  7. package/android/src/main/AndroidManifest.xml +0 -10
  8. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/AndroidAutoScreen.kt +3 -0
  9. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/AndroidAutoTelemetryHolder.kt +97 -19
  10. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridAndroidAutoTelemetry.kt +39 -3
  11. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridSignInTemplate.kt +22 -0
  12. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/TelemetryObserver.kt +56 -0
  13. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/VirtualRenderer.kt +15 -10
  14. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/template/AutomotivePermissionRequestTemplate.kt +103 -0
  15. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/template/GridTemplate.kt +0 -2
  16. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/template/Parser.kt +8 -2
  17. package/android/src/main/java/com/margelo/nitro/swe/iternio/reactnativeautoplay/template/SignInTemplate.kt +159 -0
  18. package/ios/extensions/CarPlayExtensions.swift +4 -2
  19. package/ios/extensions/NitroImageExtensions.swift +4 -4
  20. package/ios/hybrid/HybridAutoPlay.swift +31 -42
  21. package/ios/hybrid/HybridCluster.swift +4 -2
  22. package/ios/hybrid/HybridGridTemplate.swift +11 -11
  23. package/ios/hybrid/HybridInformationTemplate.swift +12 -13
  24. package/ios/hybrid/HybridListTemplate.swift +12 -13
  25. package/ios/hybrid/HybridMapTemplate.swift +13 -16
  26. package/ios/hybrid/HybridMessageTemplate.swift +7 -4
  27. package/ios/hybrid/HybridSearchTemplate.swift +12 -13
  28. package/ios/scenes/AutoPlayInterfaceController.swift +44 -13
  29. package/ios/scenes/AutoPlayScene.swift +2 -1
  30. package/ios/scenes/AutoPlaySceneViewController.swift +8 -2
  31. package/ios/scenes/DashboardSceneDelegate.swift +15 -7
  32. package/ios/scenes/HeadUnitSceneDelegate.swift +12 -7
  33. package/ios/scenes/WindowApplicationSceneDelegate.swift +1 -1
  34. package/ios/templates/AutoPlayTemplate.swift +23 -15
  35. package/ios/templates/GridTemplate.swift +23 -16
  36. package/ios/templates/InformationTemplate.swift +12 -11
  37. package/ios/templates/ListTemplate.swift +11 -11
  38. package/ios/templates/MapTemplate.swift +40 -32
  39. package/ios/templates/MessageTemplate.swift +8 -12
  40. package/ios/templates/Parser.swift +2 -1
  41. package/ios/templates/SearchTemplate.swift +19 -17
  42. package/ios/templates/TemplateStore.swift +17 -9
  43. package/ios/utils/RootModule.swift +19 -12
  44. package/ios/utils/SymbolFont.swift +2 -1
  45. package/ios/utils/ViewUtils.swift +2 -2
  46. package/lib/hooks/useAndroidAutoTelemetry.d.ts +22 -4
  47. package/lib/hooks/useAndroidAutoTelemetry.js +52 -24
  48. package/lib/index.d.ts +2 -0
  49. package/lib/index.js +2 -0
  50. package/lib/specs/AndroidAutoTelemetry.nitro.d.ts +14 -1
  51. package/lib/specs/SignInTemplate.nitro.d.ts +12 -0
  52. package/lib/templates/SignInTemplate.d.ts +49 -0
  53. package/lib/templates/SignInTemplate.js +51 -0
  54. package/lib/types/SignInMethod.d.ts +38 -0
  55. package/lib/types/SignInMethod.js +19 -0
  56. package/lib/types/Telemetry.d.ts +27 -0
  57. package/lib/types/Telemetry.js +7 -0
  58. package/nitro.json +3 -0
  59. package/nitrogen/generated/android/ReactNativeAutoPlay+autolinking.cmake +3 -0
  60. package/nitrogen/generated/android/ReactNativeAutoPlayOnLoad.cpp +12 -2
  61. package/nitrogen/generated/android/c++/JBooleanTelemetryItem.hpp +61 -0
  62. package/nitrogen/generated/android/c++/JFunc_void_std__optional_Telemetry_.hpp +87 -0
  63. package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +10 -10
  64. package/nitrogen/generated/android/c++/JHybridAndroidAutoTelemetrySpec.cpp +41 -5
  65. package/nitrogen/generated/android/c++/JHybridAndroidAutoTelemetrySpec.hpp +2 -1
  66. package/nitrogen/generated/android/c++/JHybridSignInTemplateSpec.cpp +133 -0
  67. package/nitrogen/generated/android/c++/JHybridSignInTemplateSpec.hpp +66 -0
  68. package/nitrogen/generated/android/c++/JInputSignIn.hpp +103 -0
  69. package/nitrogen/generated/android/c++/JKeyboardType.hpp +65 -0
  70. package/nitrogen/generated/android/c++/JPermissionRequestResult.hpp +98 -0
  71. package/nitrogen/generated/android/c++/JPinSignIn.hpp +63 -0
  72. package/nitrogen/generated/android/c++/JQrSignIn.hpp +63 -0
  73. package/nitrogen/generated/android/c++/JSignInMethods.hpp +65 -0
  74. package/nitrogen/generated/android/c++/JSignInTemplateConfig.hpp +217 -0
  75. package/nitrogen/generated/android/c++/JTelemetry.hpp +25 -3
  76. package/nitrogen/generated/android/c++/JTextInputType.hpp +59 -0
  77. package/nitrogen/generated/android/c++/JVariant_QrSignIn_PinSignIn_InputSignIn.cpp +30 -0
  78. package/nitrogen/generated/android/c++/JVariant_QrSignIn_PinSignIn_InputSignIn.hpp +99 -0
  79. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/AssetImage.kt +1 -1
  80. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/AutoText.kt +2 -2
  81. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/BooleanTelemetryItem.kt +41 -0
  82. 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
  83. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/Func_void_std__string.kt +9 -9
  84. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/GlyphImage.kt +1 -1
  85. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/GridTemplateConfig.kt +8 -8
  86. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridAndroidAutoTelemetrySpec.kt +7 -2
  87. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridSignInTemplateSpec.kt +62 -0
  88. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/InformationTemplateConfig.kt +9 -9
  89. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/InputSignIn.kt +63 -0
  90. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/KeyboardType.kt +23 -0
  91. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/ListTemplateConfig.kt +9 -9
  92. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/MapTemplateConfig.kt +17 -17
  93. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/MessageTemplateConfig.kt +11 -11
  94. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NavigationAlertAction.kt +1 -1
  95. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroAction.kt +6 -6
  96. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroAttributedString.kt +1 -1
  97. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroBaseMapTemplateConfig.kt +9 -9
  98. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroMapButton.kt +1 -1
  99. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroMessageManeuver.kt +2 -2
  100. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroNavigationAlert.kt +5 -5
  101. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroRoutingManeuver.kt +12 -12
  102. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroRow.kt +6 -6
  103. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/NitroSection.kt +1 -1
  104. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/PermissionRequestResult.kt +41 -0
  105. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/PinSignIn.kt +41 -0
  106. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/QrSignIn.kt +41 -0
  107. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/SafeAreaInsets.kt +1 -1
  108. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/SearchTemplateConfig.kt +9 -9
  109. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/SignInMethods.kt +23 -0
  110. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/SignInTemplateConfig.kt +78 -0
  111. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/Telemetry.kt +23 -8
  112. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/TextInputType.kt +21 -0
  113. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/TravelEstimates.kt +1 -1
  114. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/Variant_QrSignIn_PinSignIn_InputSignIn.kt +72 -0
  115. package/nitrogen/generated/android/kotlin/com/margelo/nitro/swe/iternio/reactnativeautoplay/VehicleTelemetryItem.kt +3 -3
  116. package/nitrogen/generated/shared/c++/BooleanTelemetryItem.hpp +79 -0
  117. package/nitrogen/generated/shared/c++/HybridAndroidAutoTelemetrySpec.cpp +1 -0
  118. package/nitrogen/generated/shared/c++/HybridAndroidAutoTelemetrySpec.hpp +7 -1
  119. package/nitrogen/generated/shared/c++/HybridSignInTemplateSpec.cpp +22 -0
  120. package/nitrogen/generated/shared/c++/HybridSignInTemplateSpec.hpp +66 -0
  121. package/nitrogen/generated/shared/c++/InputSignIn.hpp +113 -0
  122. package/nitrogen/generated/shared/c++/KeyboardType.hpp +64 -0
  123. package/nitrogen/generated/shared/c++/PermissionRequestResult.hpp +80 -0
  124. package/nitrogen/generated/shared/c++/PinSignIn.hpp +81 -0
  125. package/nitrogen/generated/shared/c++/QrSignIn.hpp +81 -0
  126. package/nitrogen/generated/shared/c++/SignInMethods.hpp +64 -0
  127. package/nitrogen/generated/shared/c++/SignInTemplateConfig.hpp +138 -0
  128. package/nitrogen/generated/shared/c++/Telemetry.hpp +25 -2
  129. package/nitrogen/generated/shared/c++/TextInputType.hpp +62 -0
  130. package/package.json +4 -2
  131. package/src/hooks/useAndroidAutoTelemetry.ts +80 -27
  132. package/src/index.ts +2 -0
  133. package/src/specs/AndroidAutoTelemetry.nitro.ts +19 -1
  134. package/src/specs/SignInTemplate.nitro.ts +10 -0
  135. package/src/templates/SignInTemplate.ts +117 -0
  136. package/src/types/SignInMethod.ts +41 -0
  137. package/src/types/Telemetry.ts +29 -0
  138. package/lib/specs/VoiceInput.nitro.d.ts +0 -8
  139. package/nitrogen/generated/android/c++/JFunc_void_std__optional_Telemetry__std__optional_std__string_.hpp +0 -85
  140. /package/lib/specs/{VoiceInput.nitro.js → SignInTemplate.nitro.js} +0 -0
@@ -8,8 +8,8 @@ import { HybridAndroidAutoTelemetry, HybridAutoPlay } from '..';
8
8
  * @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.
9
9
  * @param requiredPermissions The permissions to check.
10
10
  */
11
- export const useAndroidAutoTelemetry = ({ requestTelemetryPermissions = true, requiredPermissions, }) => {
12
- const [permissionsGranted, setPermissionsGranted] = useState(false);
11
+ export const useAndroidAutoTelemetry = ({ requestTelemetryPermissions = true, requiredPermissions, automotivePermissionRequest, }) => {
12
+ const [permissionsGranted, setPermissionsGranted] = useState(null);
13
13
  const [telemetry, setTelemetry] = useState(undefined);
14
14
  const [error, setError] = useState(undefined);
15
15
  const [isConnected, setIsConnected] = useState(false);
@@ -27,43 +27,71 @@ export const useAndroidAutoTelemetry = ({ requestTelemetryPermissions = true, re
27
27
  const state = await Promise.all(requiredPermissions.map((permission) => PermissionsAndroid.check(permission).catch(() => false)));
28
28
  setPermissionsGranted(state.every((granted) => granted));
29
29
  };
30
- checkPermissions();
30
+ void checkPermissions();
31
31
  }, [requiredPermissions]);
32
32
  useEffect(() => {
33
33
  if (!isConnected || !permissionsGranted) {
34
34
  return;
35
35
  }
36
- const remove = HybridAndroidAutoTelemetry?.registerTelemetryListener((tlm, errorMessage) => {
37
- setError(errorMessage);
38
- setTelemetry(tlm);
39
- });
40
- return () => {
41
- remove?.();
42
- };
36
+ try {
37
+ const remove = HybridAndroidAutoTelemetry?.registerTelemetryListener(setTelemetry);
38
+ return () => remove?.();
39
+ }
40
+ catch (e) {
41
+ if (e instanceof Error) {
42
+ setError(`${e.name}: ${e.message}\n${e.stack ?? ''}`.trim());
43
+ }
44
+ else {
45
+ setError(String(e));
46
+ }
47
+ }
48
+ return;
43
49
  }, [isConnected, permissionsGranted]);
44
50
  useEffect(() => {
45
- if (requestTelemetryPermissions && requiredPermissions.length > 0) {
46
- // PermissionsAndroid is not aware of automotive permissions
47
- PermissionsAndroid.requestMultiple(requiredPermissions)
48
- .then((value) => {
49
- const isGranted = requiredPermissions.every((permission) => value[permission] === 'granted');
51
+ if (!requestTelemetryPermissions || requiredPermissions.length === 0) {
52
+ return;
53
+ }
54
+ if (permissionsGranted !== false) {
55
+ // either wait for permission request to finish or do nothing in case permissions are granted already
56
+ return;
57
+ }
58
+ if (automotivePermissionRequest?.message != null) {
59
+ HybridAndroidAutoTelemetry?.requestAutomotivePermissions(requiredPermissions, automotivePermissionRequest.message, automotivePermissionRequest.grantButtonText, automotivePermissionRequest.cancelButtonText).then(({ granted, denied }) => {
60
+ const isGranted = granted.length === requiredPermissions.length;
61
+ setPermissionsGranted(isGranted);
50
62
  if (!isGranted) {
51
- console.warn('*** Android Auto telemetry permissions not granted');
52
- return;
63
+ setError(`Android Automotive permissions denied: [${denied.join(',')}]`);
53
64
  }
54
- setPermissionsGranted(true);
55
- })
56
- .catch((e) => console.error('*** Android Auto telemetry permissions error', e));
65
+ });
66
+ return;
57
67
  }
58
- return;
59
- }, [requestTelemetryPermissions, requiredPermissions]);
68
+ // PermissionsAndroid is not aware of Android Auto related permissions
69
+ PermissionsAndroid.requestMultiple(requiredPermissions)
70
+ .then((result) => {
71
+ const isGranted = requiredPermissions.every((permission) => result[permission] === 'granted');
72
+ if (!isGranted) {
73
+ console.warn('Android Auto telemetry permissions not granted');
74
+ return;
75
+ }
76
+ setPermissionsGranted(true);
77
+ })
78
+ .catch((e) => console.error('Android Auto telemetry permissions error', e));
79
+ }, [
80
+ requestTelemetryPermissions,
81
+ requiredPermissions,
82
+ permissionsGranted,
83
+ automotivePermissionRequest?.cancelButtonText,
84
+ automotivePermissionRequest?.grantButtonText,
85
+ automotivePermissionRequest?.message,
86
+ ]);
60
87
  return {
61
88
  /**
62
- * True if the telemetry permissions are granted, false otherwise.
89
+ * null on pending permission check, True if the telemetry permissions are granted, false otherwise.
63
90
  */
64
91
  permissionsGranted,
65
92
  /**
66
- * The telemetry data.
93
+ * The telemetry data, might be a partial update not containing all properties of the regular timed updates.
94
+ * For example gear changes are emitted immediately without all the other telemetry data.
67
95
  */
68
96
  telemetry,
69
97
  /**
package/lib/index.d.ts CHANGED
@@ -25,12 +25,14 @@ export * from './templates/ListTemplate';
25
25
  export * from './templates/MapTemplate';
26
26
  export * from './templates/MessageTemplate';
27
27
  export * from './templates/SearchTemplate';
28
+ export * from './templates/SignInTemplate';
28
29
  export * from './templates/Template';
29
30
  export * from './types/Button';
30
31
  export * from './types/Event';
31
32
  export * from './types/Image';
32
33
  export * from './types/Maneuver';
33
34
  export * from './types/RootComponent';
35
+ export * from './types/SignInMethod';
34
36
  export * from './types/Telemetry';
35
37
  export * from './types/Text';
36
38
  export * from './types/Trip';
package/lib/index.js CHANGED
@@ -30,12 +30,14 @@ export * from './templates/ListTemplate';
30
30
  export * from './templates/MapTemplate';
31
31
  export * from './templates/MessageTemplate';
32
32
  export * from './templates/SearchTemplate';
33
+ export * from './templates/SignInTemplate';
33
34
  export * from './templates/Template';
34
35
  export * from './types/Button';
35
36
  export * from './types/Event';
36
37
  export * from './types/Image';
37
38
  export * from './types/Maneuver';
38
39
  export * from './types/RootComponent';
40
+ export * from './types/SignInMethod';
39
41
  export * from './types/Telemetry';
40
42
  export * from './types/Text';
41
43
  export * from './types/Trip';
@@ -1,6 +1,10 @@
1
1
  import type { HybridObject } from 'react-native-nitro-modules';
2
2
  import type { CleanupCallback } from '../types/Event';
3
3
  import type { Telemetry } from '../types/Telemetry';
4
+ type PermissionRequestResult = {
5
+ granted: Array<string>;
6
+ denied: Array<string>;
7
+ };
4
8
  export interface AndroidAutoTelemetry extends HybridObject<{
5
9
  android: 'kotlin';
6
10
  }> {
@@ -11,5 +15,14 @@ export interface AndroidAutoTelemetry extends HybridObject<{
11
15
  * @returns callback to remove the listener
12
16
  * @namespace Android
13
17
  */
14
- registerTelemetryListener(callback: (tlm?: Telemetry, error?: string) => void): CleanupCallback;
18
+ registerTelemetryListener(callback: (tlm?: Telemetry) => void): CleanupCallback;
19
+ /**
20
+ * Brings up a template to request specified permissions from the user
21
+ * @param permissions some of `AndroidAutoPermissions`
22
+ * @param message text shown on the template
23
+ * @param grantButtonText primary action button text
24
+ * @param cancelButtonText secondary action button text, if not specified button will not be shown
25
+ */
26
+ requestAutomotivePermissions(permissions: Array<string>, message: string, grantButtonText: string, cancelButtonText?: string): Promise<PermissionRequestResult>;
15
27
  }
28
+ export {};
@@ -0,0 +1,12 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+ import type { NitroSignInTemplateConfig } from '../templates/SignInTemplate';
3
+ import type { NitroTemplateConfig } from './AutoPlay.nitro';
4
+ interface SignInTemplateConfig extends NitroTemplateConfig, NitroSignInTemplateConfig {
5
+ }
6
+ export interface SignInTemplate extends HybridObject<{
7
+ android: 'kotlin';
8
+ }> {
9
+ createSignInTemplate(config: SignInTemplateConfig): void;
10
+ updateTemplate(templateId: string, config: SignInTemplateConfig): Promise<void>;
11
+ }
12
+ export {};
@@ -0,0 +1,49 @@
1
+ import type { ActionButton, AppButton, BackButton, CustomActionButtonAndroid, ImageButton } from '..';
2
+ import type { SignInTemplate as NitroSignInTemplate } from '../specs/SignInTemplate.nitro';
3
+ import { type SignInMethod } from '../types/SignInMethod';
4
+ import { type NitroAction } from '../utils/NitroAction';
5
+ import { Template, type TemplateConfig } from './Template';
6
+ export declare const HybridSignInTemplate: NitroSignInTemplate | null;
7
+ export interface NitroSignInTemplateConfig extends TemplateConfig {
8
+ title?: string;
9
+ additionalText?: string;
10
+ signInMethod?: SignInMethod;
11
+ headerActions?: Array<NitroAction>;
12
+ actions?: Array<NitroAction>;
13
+ instructions?: string;
14
+ }
15
+ export type SignInHeaderActions<T> = {
16
+ android: {
17
+ startHeaderAction?: AppButton | BackButton<T>;
18
+ /**
19
+ * Actions for the sign-in template.
20
+ * Note: Android Auto only allows 1 action with a custom title in the action strip.
21
+ */
22
+ endHeaderActions?: [CustomActionButtonAndroid<SignInTemplate>, ImageButton<SignInTemplate>] | [ImageButton<SignInTemplate>, CustomActionButtonAndroid<SignInTemplate>] | [CustomActionButtonAndroid<SignInTemplate>];
23
+ };
24
+ };
25
+ export type SignInTemplateConfig = Omit<NitroSignInTemplateConfig, 'headerActions' | 'actions' | 'signInMethod'> & {
26
+ headerActions?: SignInHeaderActions<SignInTemplate>;
27
+ actions?: Array<ActionButton<SignInTemplate>>;
28
+ signInMethod: SignInMethod;
29
+ };
30
+ export type SignInTemplateUpdateConfig = Omit<NitroSignInTemplateConfig, 'headerActions' | 'actions'> & {
31
+ headerActions?: SignInHeaderActions<SignInTemplate>;
32
+ actions?: Array<ActionButton<SignInTemplate>>;
33
+ };
34
+ /**
35
+ * A template for signing in to an account.
36
+ * @namespace Android
37
+ */
38
+ export declare class SignInTemplate extends Template<SignInTemplateConfig, SignInHeaderActions<SignInTemplate>> {
39
+ private template;
40
+ constructor(config: SignInTemplateConfig);
41
+ /**
42
+ * Updates the template with new config. The config is merged with the current one,
43
+ * so if values are not provided, they will stay. To change values, they need to be overridden.
44
+ *
45
+ * @param updatedConfig - The updated config for the template.
46
+ * @returns A promise that resolves when the template is updated.
47
+ */
48
+ updateTemplate(updatedConfig: SignInTemplateUpdateConfig): Promise<void> | undefined;
49
+ }
@@ -0,0 +1,51 @@
1
+ import { Platform } from 'react-native';
2
+ import { NitroModules } from 'react-native-nitro-modules';
3
+ import { SignInMethods } from '../types/SignInMethod';
4
+ import { NitroActionUtil } from '../utils/NitroAction';
5
+ import { Template } from './Template';
6
+ export const HybridSignInTemplate = Platform.OS === 'android'
7
+ ? NitroModules.createHybridObject('SignInTemplate')
8
+ : null;
9
+ /**
10
+ * A template for signing in to an account.
11
+ * @namespace Android
12
+ */
13
+ export class SignInTemplate extends Template {
14
+ template = this;
15
+ constructor(config) {
16
+ super(config);
17
+ const { headerActions, actions, ...rest } = config;
18
+ const nitroConfig = {
19
+ ...rest,
20
+ id: this.id,
21
+ headerActions: NitroActionUtil.convert(this.template, headerActions),
22
+ actions: NitroActionUtil.convert(this.template, actions),
23
+ };
24
+ if (config.signInMethod.method === SignInMethods.PIN &&
25
+ (config.signInMethod.pin?.length > 12 || config.signInMethod.pin?.length < 1)) {
26
+ throw new Error('PIN must be 1-12 characters');
27
+ }
28
+ HybridSignInTemplate?.createSignInTemplate(nitroConfig);
29
+ }
30
+ /**
31
+ * Updates the template with new config. The config is merged with the current one,
32
+ * so if values are not provided, they will stay. To change values, they need to be overridden.
33
+ *
34
+ * @param updatedConfig - The updated config for the template.
35
+ * @returns A promise that resolves when the template is updated.
36
+ */
37
+ updateTemplate(updatedConfig) {
38
+ const { headerActions, actions, ...rest } = updatedConfig;
39
+ const nitroConfig = {
40
+ ...rest,
41
+ id: this.id,
42
+ headerActions: NitroActionUtil.convert(this.template, headerActions),
43
+ actions: NitroActionUtil.convert(this.template, actions),
44
+ };
45
+ if (nitroConfig.signInMethod?.method === SignInMethods.PIN &&
46
+ (nitroConfig.signInMethod.pin?.length > 12 || nitroConfig.signInMethod.pin?.length < 1)) {
47
+ throw new Error('PIN must be 1-12 characters');
48
+ }
49
+ return HybridSignInTemplate?.updateTemplate(this.id, nitroConfig);
50
+ }
51
+ }
@@ -0,0 +1,38 @@
1
+ export declare enum SignInMethods {
2
+ QR = 0,
3
+ PROVIDER = 1,
4
+ PIN = 2,
5
+ INPUT = 3
6
+ }
7
+ export type PinSignIn = {
8
+ method: SignInMethods.PIN;
9
+ /**
10
+ * PIN code for sign-in. Must be 1-12 characters.
11
+ */
12
+ pin: string;
13
+ };
14
+ export declare enum KeyboardType {
15
+ DEFAULT = 0,
16
+ EMAIL = 1,
17
+ PHONE = 2,
18
+ NUMBER = 3
19
+ }
20
+ export declare enum TextInputType {
21
+ PASSWORD = 0,
22
+ DEFAULT = 1
23
+ }
24
+ export type InputSignIn = {
25
+ method: SignInMethods.INPUT;
26
+ keyboardType?: KeyboardType;
27
+ hint?: string;
28
+ defaultValue?: string;
29
+ errorMessage?: string;
30
+ callback: (text: string) => void;
31
+ showKeyboardByDefault?: boolean;
32
+ inputType: TextInputType;
33
+ };
34
+ export type QrSignIn = {
35
+ method: SignInMethods.QR;
36
+ url: string;
37
+ };
38
+ export type SignInMethod = QrSignIn | PinSignIn | InputSignIn;
@@ -0,0 +1,19 @@
1
+ export var SignInMethods;
2
+ (function (SignInMethods) {
3
+ SignInMethods[SignInMethods["QR"] = 0] = "QR";
4
+ SignInMethods[SignInMethods["PROVIDER"] = 1] = "PROVIDER";
5
+ SignInMethods[SignInMethods["PIN"] = 2] = "PIN";
6
+ SignInMethods[SignInMethods["INPUT"] = 3] = "INPUT";
7
+ })(SignInMethods || (SignInMethods = {}));
8
+ export var KeyboardType;
9
+ (function (KeyboardType) {
10
+ KeyboardType[KeyboardType["DEFAULT"] = 0] = "DEFAULT";
11
+ KeyboardType[KeyboardType["EMAIL"] = 1] = "EMAIL";
12
+ KeyboardType[KeyboardType["PHONE"] = 2] = "PHONE";
13
+ KeyboardType[KeyboardType["NUMBER"] = 3] = "NUMBER";
14
+ })(KeyboardType || (KeyboardType = {}));
15
+ export var TextInputType;
16
+ (function (TextInputType) {
17
+ TextInputType[TextInputType["PASSWORD"] = 0] = "PASSWORD";
18
+ TextInputType[TextInputType["DEFAULT"] = 1] = "DEFAULT";
19
+ })(TextInputType || (TextInputType = {}));
@@ -30,11 +30,24 @@ type StringTelemetryItem = {
30
30
  timestamp: number;
31
31
  value: string;
32
32
  };
33
+ type BooleanTelemetryItem = {
34
+ /**
35
+ * timestamp in seconds when the value was received on native side
36
+ */
37
+ timestamp: number;
38
+ value: boolean;
39
+ };
33
40
  type VehicleTelemetryItem = {
34
41
  name?: StringTelemetryItem;
35
42
  year?: NumericTelemetryItem;
36
43
  manufacturer?: StringTelemetryItem;
37
44
  };
45
+ export declare enum VehicleGear {
46
+ Neutral = 1,
47
+ Reverse = 2,
48
+ Park = 4,
49
+ Drive = 8
50
+ }
38
51
  export type Telemetry = {
39
52
  /**
40
53
  * Speed in km/h
@@ -60,5 +73,19 @@ export type Telemetry = {
60
73
  * Vehicle information
61
74
  */
62
75
  vehicle?: VehicleTelemetryItem;
76
+ /**
77
+ * one of VehicleGear enum
78
+ */
79
+ selectedGear?: NumericTelemetryItem;
80
+ /**
81
+ * Outside temperature in celsius.
82
+ */
83
+ envOutsideTemperature?: NumericTelemetryItem;
84
+ evChargePortConnected?: BooleanTelemetryItem;
85
+ /**
86
+ * EV instantaneous charge rate in kW.
87
+ */
88
+ evBatteryInstantaneousChargeRate?: NumericTelemetryItem;
89
+ parkingBrakeOn?: BooleanTelemetryItem;
63
90
  };
64
91
  export {};
@@ -12,3 +12,10 @@ export var AndroidAutomotiveTelemetryPermissions;
12
12
  AndroidAutomotiveTelemetryPermissions["ExteriorEnvironment"] = "android.car.permission.CAR_EXTERIOR_ENVIRONMENT";
13
13
  AndroidAutomotiveTelemetryPermissions["EnergyPorts"] = "android.car.permission.CAR_ENERGY_PORTS";
14
14
  })(AndroidAutomotiveTelemetryPermissions || (AndroidAutomotiveTelemetryPermissions = {}));
15
+ export var VehicleGear;
16
+ (function (VehicleGear) {
17
+ VehicleGear[VehicleGear["Neutral"] = 1] = "Neutral";
18
+ VehicleGear[VehicleGear["Reverse"] = 2] = "Reverse";
19
+ VehicleGear[VehicleGear["Park"] = 4] = "Park";
20
+ VehicleGear[VehicleGear["Drive"] = 8] = "Drive";
21
+ })(VehicleGear || (VehicleGear = {}));
package/nitro.json CHANGED
@@ -16,6 +16,9 @@
16
16
  "AndroidAutoTelemetry": {
17
17
  "kotlin": "HybridAndroidAutoTelemetry"
18
18
  },
19
+ "SignInTemplate": {
20
+ "kotlin": "HybridSignInTemplate"
21
+ },
19
22
  "ListTemplate": {
20
23
  "kotlin": "HybridListTemplate",
21
24
  "swift": "HybridListTemplate"
@@ -43,6 +43,7 @@ target_sources(
43
43
  ../nitrogen/generated/shared/c++/HybridMapTemplateSpec.cpp
44
44
  ../nitrogen/generated/shared/c++/HybridMessageTemplateSpec.cpp
45
45
  ../nitrogen/generated/shared/c++/HybridSearchTemplateSpec.cpp
46
+ ../nitrogen/generated/shared/c++/HybridSignInTemplateSpec.cpp
46
47
  # Android-specific Nitrogen C++ sources
47
48
  ../nitrogen/generated/android/c++/JHybridAndroidAutoTelemetrySpec.cpp
48
49
  ../nitrogen/generated/android/c++/JHybridAutoPlaySpec.cpp
@@ -57,6 +58,8 @@ target_sources(
57
58
  ../nitrogen/generated/android/c++/JVariant_PreferredImageLane_ImageLane.cpp
58
59
  ../nitrogen/generated/android/c++/JHybridMessageTemplateSpec.cpp
59
60
  ../nitrogen/generated/android/c++/JHybridSearchTemplateSpec.cpp
61
+ ../nitrogen/generated/android/c++/JHybridSignInTemplateSpec.cpp
62
+ ../nitrogen/generated/android/c++/JVariant_QrSignIn_PinSignIn_InputSignIn.cpp
60
63
  )
61
64
 
62
65
  # From node_modules/react-native/ReactAndroid/cmake-utils/folly-flags.cmake
@@ -17,7 +17,7 @@
17
17
 
18
18
  #include "JHybridAndroidAutoTelemetrySpec.hpp"
19
19
  #include "JFunc_void.hpp"
20
- #include "JFunc_void_std__optional_Telemetry__std__optional_std__string_.hpp"
20
+ #include "JFunc_void_std__optional_Telemetry_.hpp"
21
21
  #include "JHybridAutoPlaySpec.hpp"
22
22
  #include "JFunc_void_VisibilityState.hpp"
23
23
  #include "JFunc_void_std__optional_Location__std__optional_std__string_.hpp"
@@ -41,6 +41,7 @@
41
41
  #include "JFunc_void_std__string_std__string.hpp"
42
42
  #include "JHybridMessageTemplateSpec.hpp"
43
43
  #include "JHybridSearchTemplateSpec.hpp"
44
+ #include "JHybridSignInTemplateSpec.hpp"
44
45
  #include <NitroModules/DefaultConstructableObject.hpp>
45
46
 
46
47
  namespace margelo::nitro::swe::iternio::reactnativeautoplay {
@@ -54,7 +55,7 @@ int initialize(JavaVM* vm) {
54
55
  // Register native JNI methods
55
56
  margelo::nitro::swe::iternio::reactnativeautoplay::JHybridAndroidAutoTelemetrySpec::registerNatives();
56
57
  margelo::nitro::swe::iternio::reactnativeautoplay::JFunc_void_cxx::registerNatives();
57
- margelo::nitro::swe::iternio::reactnativeautoplay::JFunc_void_std__optional_Telemetry__std__optional_std__string__cxx::registerNatives();
58
+ margelo::nitro::swe::iternio::reactnativeautoplay::JFunc_void_std__optional_Telemetry__cxx::registerNatives();
58
59
  margelo::nitro::swe::iternio::reactnativeautoplay::JHybridAutoPlaySpec::registerNatives();
59
60
  margelo::nitro::swe::iternio::reactnativeautoplay::JFunc_void_VisibilityState_cxx::registerNatives();
60
61
  margelo::nitro::swe::iternio::reactnativeautoplay::JFunc_void_std__optional_Location__std__optional_std__string__cxx::registerNatives();
@@ -78,6 +79,7 @@ int initialize(JavaVM* vm) {
78
79
  margelo::nitro::swe::iternio::reactnativeautoplay::JFunc_void_std__string_std__string_cxx::registerNatives();
79
80
  margelo::nitro::swe::iternio::reactnativeautoplay::JHybridMessageTemplateSpec::registerNatives();
80
81
  margelo::nitro::swe::iternio::reactnativeautoplay::JHybridSearchTemplateSpec::registerNatives();
82
+ margelo::nitro::swe::iternio::reactnativeautoplay::JHybridSignInTemplateSpec::registerNatives();
81
83
 
82
84
  // Register Nitro Hybrid Objects
83
85
  HybridObjectRegistry::registerHybridObjectConstructor(
@@ -96,6 +98,14 @@ int initialize(JavaVM* vm) {
96
98
  return instance->cthis()->shared();
97
99
  }
98
100
  );
101
+ HybridObjectRegistry::registerHybridObjectConstructor(
102
+ "SignInTemplate",
103
+ []() -> std::shared_ptr<HybridObject> {
104
+ static DefaultConstructableObject<JHybridSignInTemplateSpec::javaobject> object("com/margelo/nitro/swe/iternio/reactnativeautoplay/HybridSignInTemplate");
105
+ auto instance = object.create();
106
+ return instance->cthis()->shared();
107
+ }
108
+ );
99
109
  HybridObjectRegistry::registerHybridObjectConstructor(
100
110
  "ListTemplate",
101
111
  []() -> std::shared_ptr<HybridObject> {
@@ -0,0 +1,61 @@
1
+ ///
2
+ /// JBooleanTelemetryItem.hpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © 2025 Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #pragma once
9
+
10
+ #include <fbjni/fbjni.h>
11
+ #include "BooleanTelemetryItem.hpp"
12
+
13
+
14
+
15
+ namespace margelo::nitro::swe::iternio::reactnativeautoplay {
16
+
17
+ using namespace facebook;
18
+
19
+ /**
20
+ * The C++ JNI bridge between the C++ struct "BooleanTelemetryItem" and the the Kotlin data class "BooleanTelemetryItem".
21
+ */
22
+ struct JBooleanTelemetryItem final: public jni::JavaClass<JBooleanTelemetryItem> {
23
+ public:
24
+ static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/swe/iternio/reactnativeautoplay/BooleanTelemetryItem;";
25
+
26
+ public:
27
+ /**
28
+ * Convert this Java/Kotlin-based struct to the C++ struct BooleanTelemetryItem by copying all values to C++.
29
+ */
30
+ [[maybe_unused]]
31
+ [[nodiscard]]
32
+ BooleanTelemetryItem toCpp() const {
33
+ static const auto clazz = javaClassStatic();
34
+ static const auto fieldTimestamp = clazz->getField<double>("timestamp");
35
+ double timestamp = this->getFieldValue(fieldTimestamp);
36
+ static const auto fieldValue = clazz->getField<jboolean>("value");
37
+ jboolean value = this->getFieldValue(fieldValue);
38
+ return BooleanTelemetryItem(
39
+ timestamp,
40
+ static_cast<bool>(value)
41
+ );
42
+ }
43
+
44
+ public:
45
+ /**
46
+ * Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java.
47
+ */
48
+ [[maybe_unused]]
49
+ static jni::local_ref<JBooleanTelemetryItem::javaobject> fromCpp(const BooleanTelemetryItem& value) {
50
+ using JSignature = JBooleanTelemetryItem(double, jboolean);
51
+ static const auto clazz = javaClassStatic();
52
+ static const auto create = clazz->getStaticMethod<JSignature>("fromCpp");
53
+ return create(
54
+ clazz,
55
+ value.timestamp,
56
+ value.value
57
+ );
58
+ }
59
+ };
60
+
61
+ } // namespace margelo::nitro::swe::iternio::reactnativeautoplay
@@ -0,0 +1,87 @@
1
+ ///
2
+ /// JFunc_void_std__optional_Telemetry_.hpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © 2025 Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #pragma once
9
+
10
+ #include <fbjni/fbjni.h>
11
+ #include <functional>
12
+
13
+ #include "Telemetry.hpp"
14
+ #include <optional>
15
+ #include <functional>
16
+ #include <NitroModules/JNICallable.hpp>
17
+ #include "JTelemetry.hpp"
18
+ #include "NumericTelemetryItem.hpp"
19
+ #include "JNumericTelemetryItem.hpp"
20
+ #include "VehicleTelemetryItem.hpp"
21
+ #include "JVehicleTelemetryItem.hpp"
22
+ #include "StringTelemetryItem.hpp"
23
+ #include "JStringTelemetryItem.hpp"
24
+ #include <string>
25
+ #include "BooleanTelemetryItem.hpp"
26
+ #include "JBooleanTelemetryItem.hpp"
27
+
28
+ namespace margelo::nitro::swe::iternio::reactnativeautoplay {
29
+
30
+ using namespace facebook;
31
+
32
+ /**
33
+ * Represents the Java/Kotlin callback `(tlm: Telemetry?) -> Unit`.
34
+ * This can be passed around between C++ and Java/Kotlin.
35
+ */
36
+ struct JFunc_void_std__optional_Telemetry_: public jni::JavaClass<JFunc_void_std__optional_Telemetry_> {
37
+ public:
38
+ static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/swe/iternio/reactnativeautoplay/Func_void_std__optional_Telemetry_;";
39
+
40
+ public:
41
+ /**
42
+ * Invokes the function this `JFunc_void_std__optional_Telemetry_` instance holds through JNI.
43
+ */
44
+ void invoke(const std::optional<Telemetry>& tlm) const {
45
+ static const auto method = javaClassStatic()->getMethod<void(jni::alias_ref<JTelemetry> /* tlm */)>("invoke");
46
+ method(self(), tlm.has_value() ? JTelemetry::fromCpp(tlm.value()) : nullptr);
47
+ }
48
+ };
49
+
50
+ /**
51
+ * An implementation of Func_void_std__optional_Telemetry_ that is backed by a C++ implementation (using `std::function<...>`)
52
+ */
53
+ class JFunc_void_std__optional_Telemetry__cxx final: public jni::HybridClass<JFunc_void_std__optional_Telemetry__cxx, JFunc_void_std__optional_Telemetry_> {
54
+ public:
55
+ static jni::local_ref<JFunc_void_std__optional_Telemetry_::javaobject> fromCpp(const std::function<void(const std::optional<Telemetry>& /* tlm */)>& func) {
56
+ return JFunc_void_std__optional_Telemetry__cxx::newObjectCxxArgs(func);
57
+ }
58
+
59
+ public:
60
+ /**
61
+ * Invokes the C++ `std::function<...>` this `JFunc_void_std__optional_Telemetry__cxx` instance holds.
62
+ */
63
+ void invoke_cxx(jni::alias_ref<JTelemetry> tlm) {
64
+ _func(tlm != nullptr ? std::make_optional(tlm->toCpp()) : std::nullopt);
65
+ }
66
+
67
+ public:
68
+ [[nodiscard]]
69
+ inline const std::function<void(const std::optional<Telemetry>& /* tlm */)>& getFunction() const {
70
+ return _func;
71
+ }
72
+
73
+ public:
74
+ static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/swe/iternio/reactnativeautoplay/Func_void_std__optional_Telemetry__cxx;";
75
+ static void registerNatives() {
76
+ registerHybrid({makeNativeMethod("invoke_cxx", JFunc_void_std__optional_Telemetry__cxx::invoke_cxx)});
77
+ }
78
+
79
+ private:
80
+ explicit JFunc_void_std__optional_Telemetry__cxx(const std::function<void(const std::optional<Telemetry>& /* tlm */)>& func): _func(func) { }
81
+
82
+ private:
83
+ friend HybridBase;
84
+ std::function<void(const std::optional<Telemetry>& /* tlm */)> _func;
85
+ };
86
+
87
+ } // namespace margelo::nitro::swe::iternio::reactnativeautoplay