@santoshpk/react-native-carplay 1.0.3

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 (269) hide show
  1. package/README.md +119 -0
  2. package/android/.idea/compiler.xml +6 -0
  3. package/android/.idea/gradle.xml +17 -0
  4. package/android/.idea/jarRepositories.xml +25 -0
  5. package/android/.idea/misc.xml +10 -0
  6. package/android/.idea/vcs.xml +6 -0
  7. package/android/build.gradle +63 -0
  8. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  9. package/android/gradle/wrapper/gradle-wrapper.properties +5 -0
  10. package/android/gradle.properties +20 -0
  11. package/android/gradlew +234 -0
  12. package/android/gradlew.bat +89 -0
  13. package/android/local.properties +8 -0
  14. package/android/src/main/AndroidManifest.xml +31 -0
  15. package/android/src/main/AndroidManifestNew.xml +31 -0
  16. package/android/src/main/java/org/birkir/carplay/CarPlayModule.kt +348 -0
  17. package/android/src/main/java/org/birkir/carplay/CarPlayPackage.kt +18 -0
  18. package/android/src/main/java/org/birkir/carplay/CarPlayService.kt +34 -0
  19. package/android/src/main/java/org/birkir/carplay/CarPlaySession.kt +114 -0
  20. package/android/src/main/java/org/birkir/carplay/parser/Ext.kt +11 -0
  21. package/android/src/main/java/org/birkir/carplay/parser/Parser.kt +18 -0
  22. package/android/src/main/java/org/birkir/carplay/parser/RCTGridTemplate.kt +28 -0
  23. package/android/src/main/java/org/birkir/carplay/parser/RCTListTemplate.kt +64 -0
  24. package/android/src/main/java/org/birkir/carplay/parser/RCTMapTemplate.kt +185 -0
  25. package/android/src/main/java/org/birkir/carplay/parser/RCTMessageTemplate.kt +36 -0
  26. package/android/src/main/java/org/birkir/carplay/parser/RCTPaneTemplate.kt +24 -0
  27. package/android/src/main/java/org/birkir/carplay/parser/RCTSearchTemplate.kt +41 -0
  28. package/android/src/main/java/org/birkir/carplay/parser/RCTTabTemplate.kt +52 -0
  29. package/android/src/main/java/org/birkir/carplay/parser/RCTTemplate.kt +434 -0
  30. package/android/src/main/java/org/birkir/carplay/parser/TemplateParser.kt +35 -0
  31. package/android/src/main/java/org/birkir/carplay/screens/CarScreen.kt +69 -0
  32. package/android/src/main/java/org/birkir/carplay/screens/CarScreenContext.kt +10 -0
  33. package/android/src/main/java/org/birkir/carplay/utils/EventEmitter.kt +174 -0
  34. package/android/src/main/java/org/birkir/carplay/utils/VirtualRenderer.kt +75 -0
  35. package/ios/RCTConvert+RNCarPlay.h +18 -0
  36. package/ios/RCTConvert+RNCarPlay.m +96 -0
  37. package/ios/RNCPStore.h +24 -0
  38. package/ios/RNCPStore.m +68 -0
  39. package/ios/RNCarPlay.h +29 -0
  40. package/ios/RNCarPlay.m +1839 -0
  41. package/ios/RNCarPlay.xcodeproj/project.pbxproj +300 -0
  42. package/lib/CarPlay.d.ts +196 -0
  43. package/lib/CarPlay.d.ts.map +1 -0
  44. package/lib/CarPlay.js +176 -0
  45. package/lib/CarPlay.js.map +1 -0
  46. package/lib/index.d.ts +44 -0
  47. package/lib/index.d.ts.map +1 -0
  48. package/lib/index.js +64 -0
  49. package/lib/index.js.map +1 -0
  50. package/lib/interfaces/Action.d.ts +13 -0
  51. package/lib/interfaces/Action.d.ts.map +1 -0
  52. package/lib/interfaces/Action.js +3 -0
  53. package/lib/interfaces/Action.js.map +1 -0
  54. package/lib/interfaces/AlertAction.d.ts +6 -0
  55. package/lib/interfaces/AlertAction.d.ts.map +1 -0
  56. package/lib/interfaces/AlertAction.js +3 -0
  57. package/lib/interfaces/AlertAction.js.map +1 -0
  58. package/lib/interfaces/BarButton.d.ts +39 -0
  59. package/lib/interfaces/BarButton.d.ts.map +1 -0
  60. package/lib/interfaces/BarButton.js +3 -0
  61. package/lib/interfaces/BarButton.js.map +1 -0
  62. package/lib/interfaces/CarColor.d.ts +2 -0
  63. package/lib/interfaces/CarColor.d.ts.map +1 -0
  64. package/lib/interfaces/CarColor.js +3 -0
  65. package/lib/interfaces/CarColor.js.map +1 -0
  66. package/lib/interfaces/GridButton.d.ts +24 -0
  67. package/lib/interfaces/GridButton.d.ts.map +1 -0
  68. package/lib/interfaces/GridButton.js +3 -0
  69. package/lib/interfaces/GridButton.js.map +1 -0
  70. package/lib/interfaces/Header.d.ts +15 -0
  71. package/lib/interfaces/Header.d.ts.map +1 -0
  72. package/lib/interfaces/Header.js +3 -0
  73. package/lib/interfaces/Header.js.map +1 -0
  74. package/lib/interfaces/ListItem.d.ts +61 -0
  75. package/lib/interfaces/ListItem.d.ts.map +1 -0
  76. package/lib/interfaces/ListItem.js +3 -0
  77. package/lib/interfaces/ListItem.js.map +1 -0
  78. package/lib/interfaces/ListItemUpdate.d.ts +15 -0
  79. package/lib/interfaces/ListItemUpdate.d.ts.map +1 -0
  80. package/lib/interfaces/ListItemUpdate.js +3 -0
  81. package/lib/interfaces/ListItemUpdate.js.map +1 -0
  82. package/lib/interfaces/ListSection.d.ts +21 -0
  83. package/lib/interfaces/ListSection.d.ts.map +1 -0
  84. package/lib/interfaces/ListSection.js +3 -0
  85. package/lib/interfaces/ListSection.js.map +1 -0
  86. package/lib/interfaces/Maneuver.d.ts +31 -0
  87. package/lib/interfaces/Maneuver.d.ts.map +1 -0
  88. package/lib/interfaces/Maneuver.js +3 -0
  89. package/lib/interfaces/Maneuver.js.map +1 -0
  90. package/lib/interfaces/MapButton.d.ts +27 -0
  91. package/lib/interfaces/MapButton.d.ts.map +1 -0
  92. package/lib/interfaces/MapButton.js +3 -0
  93. package/lib/interfaces/MapButton.js.map +1 -0
  94. package/lib/interfaces/NavigationAlert.d.ts +44 -0
  95. package/lib/interfaces/NavigationAlert.d.ts.map +1 -0
  96. package/lib/interfaces/NavigationAlert.js +10 -0
  97. package/lib/interfaces/NavigationAlert.js.map +1 -0
  98. package/lib/interfaces/NavigationInfo.d.ts +17 -0
  99. package/lib/interfaces/NavigationInfo.d.ts.map +1 -0
  100. package/lib/interfaces/NavigationInfo.js +3 -0
  101. package/lib/interfaces/NavigationInfo.js.map +1 -0
  102. package/lib/interfaces/NavigationStep.d.ts +17 -0
  103. package/lib/interfaces/NavigationStep.d.ts.map +1 -0
  104. package/lib/interfaces/NavigationStep.js +3 -0
  105. package/lib/interfaces/NavigationStep.js.map +1 -0
  106. package/lib/interfaces/Pane.d.ts +29 -0
  107. package/lib/interfaces/Pane.d.ts.map +1 -0
  108. package/lib/interfaces/Pane.js +3 -0
  109. package/lib/interfaces/Pane.js.map +1 -0
  110. package/lib/interfaces/PauseReason.d.ts +8 -0
  111. package/lib/interfaces/PauseReason.d.ts.map +1 -0
  112. package/lib/interfaces/PauseReason.js +12 -0
  113. package/lib/interfaces/PauseReason.js.map +1 -0
  114. package/lib/interfaces/Place.d.ts +11 -0
  115. package/lib/interfaces/Place.d.ts.map +1 -0
  116. package/lib/interfaces/Place.js +3 -0
  117. package/lib/interfaces/Place.js.map +1 -0
  118. package/lib/interfaces/TextConfiguration.d.ts +6 -0
  119. package/lib/interfaces/TextConfiguration.d.ts.map +1 -0
  120. package/lib/interfaces/TextConfiguration.js +3 -0
  121. package/lib/interfaces/TextConfiguration.js.map +1 -0
  122. package/lib/interfaces/TimeRemainingColor.d.ts +2 -0
  123. package/lib/interfaces/TimeRemainingColor.d.ts.map +1 -0
  124. package/lib/interfaces/TimeRemainingColor.js +3 -0
  125. package/lib/interfaces/TimeRemainingColor.js.map +1 -0
  126. package/lib/interfaces/TravelEstimates.d.ts +37 -0
  127. package/lib/interfaces/TravelEstimates.d.ts.map +1 -0
  128. package/lib/interfaces/TravelEstimates.js +3 -0
  129. package/lib/interfaces/TravelEstimates.js.map +1 -0
  130. package/lib/interfaces/VoiceControlState.d.ts +8 -0
  131. package/lib/interfaces/VoiceControlState.d.ts.map +1 -0
  132. package/lib/interfaces/VoiceControlState.js +3 -0
  133. package/lib/interfaces/VoiceControlState.js.map +1 -0
  134. package/lib/navigation/NavigationSession.d.ts +18 -0
  135. package/lib/navigation/NavigationSession.d.ts.map +1 -0
  136. package/lib/navigation/NavigationSession.js +51 -0
  137. package/lib/navigation/NavigationSession.js.map +1 -0
  138. package/lib/navigation/Trip.d.ts +22 -0
  139. package/lib/navigation/Trip.d.ts.map +1 -0
  140. package/lib/navigation/Trip.js +18 -0
  141. package/lib/navigation/Trip.js.map +1 -0
  142. package/lib/templates/ActionSheetTemplate.d.ts +18 -0
  143. package/lib/templates/ActionSheetTemplate.d.ts.map +1 -0
  144. package/lib/templates/ActionSheetTemplate.js +16 -0
  145. package/lib/templates/ActionSheetTemplate.js.map +1 -0
  146. package/lib/templates/AlertTemplate.d.ts +17 -0
  147. package/lib/templates/AlertTemplate.d.ts.map +1 -0
  148. package/lib/templates/AlertTemplate.js +16 -0
  149. package/lib/templates/AlertTemplate.js.map +1 -0
  150. package/lib/templates/ContactTemplate.d.ts +36 -0
  151. package/lib/templates/ContactTemplate.d.ts.map +1 -0
  152. package/lib/templates/ContactTemplate.js +16 -0
  153. package/lib/templates/ContactTemplate.js.map +1 -0
  154. package/lib/templates/GridTemplate.d.ts +38 -0
  155. package/lib/templates/GridTemplate.d.ts.map +1 -0
  156. package/lib/templates/GridTemplate.js +17 -0
  157. package/lib/templates/GridTemplate.js.map +1 -0
  158. package/lib/templates/InformationTemplate.d.ts +28 -0
  159. package/lib/templates/InformationTemplate.d.ts.map +1 -0
  160. package/lib/templates/InformationTemplate.js +28 -0
  161. package/lib/templates/InformationTemplate.js.map +1 -0
  162. package/lib/templates/ListTemplate.d.ts +112 -0
  163. package/lib/templates/ListTemplate.d.ts.map +1 -0
  164. package/lib/templates/ListTemplate.js +57 -0
  165. package/lib/templates/ListTemplate.js.map +1 -0
  166. package/lib/templates/MapTemplate.d.ts +171 -0
  167. package/lib/templates/MapTemplate.d.ts.map +1 -0
  168. package/lib/templates/MapTemplate.js +115 -0
  169. package/lib/templates/MapTemplate.js.map +1 -0
  170. package/lib/templates/NowPlayingTemplate.d.ts +31 -0
  171. package/lib/templates/NowPlayingTemplate.d.ts.map +1 -0
  172. package/lib/templates/NowPlayingTemplate.js +18 -0
  173. package/lib/templates/NowPlayingTemplate.js.map +1 -0
  174. package/lib/templates/PointOfInterestTemplate.d.ts +38 -0
  175. package/lib/templates/PointOfInterestTemplate.d.ts.map +1 -0
  176. package/lib/templates/PointOfInterestTemplate.js +18 -0
  177. package/lib/templates/PointOfInterestTemplate.js.map +1 -0
  178. package/lib/templates/SearchTemplate.d.ts +32 -0
  179. package/lib/templates/SearchTemplate.d.ts.map +1 -0
  180. package/lib/templates/SearchTemplate.js +41 -0
  181. package/lib/templates/SearchTemplate.js.map +1 -0
  182. package/lib/templates/TabBarTemplate.d.ts +27 -0
  183. package/lib/templates/TabBarTemplate.d.ts.map +1 -0
  184. package/lib/templates/TabBarTemplate.js +26 -0
  185. package/lib/templates/TabBarTemplate.js.map +1 -0
  186. package/lib/templates/Template.d.ts +83 -0
  187. package/lib/templates/Template.d.ts.map +1 -0
  188. package/lib/templates/Template.js +71 -0
  189. package/lib/templates/Template.js.map +1 -0
  190. package/lib/templates/VoiceControlTemplate.d.ts +18 -0
  191. package/lib/templates/VoiceControlTemplate.d.ts.map +1 -0
  192. package/lib/templates/VoiceControlTemplate.js +20 -0
  193. package/lib/templates/VoiceControlTemplate.js.map +1 -0
  194. package/lib/templates/android/AndroidNavigationBaseTemplate.d.ts +19 -0
  195. package/lib/templates/android/AndroidNavigationBaseTemplate.d.ts.map +1 -0
  196. package/lib/templates/android/AndroidNavigationBaseTemplate.js +29 -0
  197. package/lib/templates/android/AndroidNavigationBaseTemplate.js.map +1 -0
  198. package/lib/templates/android/MessageTemplate.d.ts +16 -0
  199. package/lib/templates/android/MessageTemplate.d.ts.map +1 -0
  200. package/lib/templates/android/MessageTemplate.js +11 -0
  201. package/lib/templates/android/MessageTemplate.js.map +1 -0
  202. package/lib/templates/android/NavigationTemplate.d.ts +44 -0
  203. package/lib/templates/android/NavigationTemplate.d.ts.map +1 -0
  204. package/lib/templates/android/NavigationTemplate.js +17 -0
  205. package/lib/templates/android/NavigationTemplate.js.map +1 -0
  206. package/lib/templates/android/PaneTemplate.d.ts +20 -0
  207. package/lib/templates/android/PaneTemplate.d.ts.map +1 -0
  208. package/lib/templates/android/PaneTemplate.js +17 -0
  209. package/lib/templates/android/PaneTemplate.js.map +1 -0
  210. package/lib/templates/android/PlaceListMapTemplate.d.ts +78 -0
  211. package/lib/templates/android/PlaceListMapTemplate.d.ts.map +1 -0
  212. package/lib/templates/android/PlaceListMapTemplate.js +25 -0
  213. package/lib/templates/android/PlaceListMapTemplate.js.map +1 -0
  214. package/lib/templates/android/PlaceListNavigationTemplate.d.ts +51 -0
  215. package/lib/templates/android/PlaceListNavigationTemplate.d.ts.map +1 -0
  216. package/lib/templates/android/PlaceListNavigationTemplate.js +20 -0
  217. package/lib/templates/android/PlaceListNavigationTemplate.js.map +1 -0
  218. package/lib/templates/android/RoutePreviewNavigationTemplate.d.ts +60 -0
  219. package/lib/templates/android/RoutePreviewNavigationTemplate.d.ts.map +1 -0
  220. package/lib/templates/android/RoutePreviewNavigationTemplate.js +23 -0
  221. package/lib/templates/android/RoutePreviewNavigationTemplate.js.map +1 -0
  222. package/lib/tsconfig.tsbuildinfo +1 -0
  223. package/package.json +49 -0
  224. package/react-native-carplay.podspec +21 -0
  225. package/src/CarPlay.ts +320 -0
  226. package/src/index.ts +50 -0
  227. package/src/interfaces/Action.ts +15 -0
  228. package/src/interfaces/AlertAction.ts +5 -0
  229. package/src/interfaces/BarButton.ts +41 -0
  230. package/src/interfaces/CarColor.ts +1 -0
  231. package/src/interfaces/GridButton.ts +25 -0
  232. package/src/interfaces/Header.ts +16 -0
  233. package/src/interfaces/ListItem.ts +61 -0
  234. package/src/interfaces/ListItemUpdate.ts +14 -0
  235. package/src/interfaces/ListSection.ts +21 -0
  236. package/src/interfaces/Maneuver.ts +30 -0
  237. package/src/interfaces/MapButton.ts +27 -0
  238. package/src/interfaces/NavigationAlert.ts +46 -0
  239. package/src/interfaces/NavigationInfo.ts +19 -0
  240. package/src/interfaces/NavigationStep.ts +17 -0
  241. package/src/interfaces/Pane.ts +29 -0
  242. package/src/interfaces/PauseReason.ts +7 -0
  243. package/src/interfaces/Place.ts +12 -0
  244. package/src/interfaces/TextConfiguration.ts +5 -0
  245. package/src/interfaces/TimeRemainingColor.ts +1 -0
  246. package/src/interfaces/TravelEstimates.ts +39 -0
  247. package/src/interfaces/VoiceControlState.ts +8 -0
  248. package/src/navigation/NavigationSession.ts +57 -0
  249. package/src/navigation/Trip.ts +36 -0
  250. package/src/templates/ActionSheetTemplate.ts +21 -0
  251. package/src/templates/AlertTemplate.ts +20 -0
  252. package/src/templates/ContactTemplate.ts +45 -0
  253. package/src/templates/GridTemplate.ts +45 -0
  254. package/src/templates/InformationTemplate.ts +42 -0
  255. package/src/templates/ListTemplate.ts +150 -0
  256. package/src/templates/MapTemplate.ts +231 -0
  257. package/src/templates/NowPlayingTemplate.ts +38 -0
  258. package/src/templates/PointOfInterestTemplate.ts +42 -0
  259. package/src/templates/SearchTemplate.ts +70 -0
  260. package/src/templates/TabBarTemplate.ts +56 -0
  261. package/src/templates/Template.ts +165 -0
  262. package/src/templates/VoiceControlTemplate.ts +25 -0
  263. package/src/templates/android/AndroidNavigationBaseTemplate.ts +46 -0
  264. package/src/templates/android/MessageTemplate.ts +19 -0
  265. package/src/templates/android/NavigationTemplate.ts +50 -0
  266. package/src/templates/android/PaneTemplate.ts +26 -0
  267. package/src/templates/android/PlaceListMapTemplate.ts +94 -0
  268. package/src/templates/android/PlaceListNavigationTemplate.ts +57 -0
  269. package/src/templates/android/RoutePreviewNavigationTemplate.ts +66 -0
@@ -0,0 +1,174 @@
1
+ package org.birkir.carplay.utils
2
+
3
+ import android.util.Log
4
+ import com.facebook.react.bridge.Arguments
5
+ import com.facebook.react.bridge.ReactContext
6
+ import com.facebook.react.bridge.WritableMap
7
+ import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter
8
+
9
+
10
+ class EventEmitter(
11
+ private var reactContext: ReactContext? = null,
12
+ private var templateId: String? = null
13
+ ) {
14
+
15
+ companion object {
16
+ const val DidConnect = "didConnect"
17
+ const val DidDisconnect = "didDisconnect"
18
+
19
+ // interface
20
+ const val BarButtonPressed = "barButtonPressed"
21
+ const val BackButtonPressed = "backButtonPressed"
22
+ const val DidAppear = "didAppear"
23
+ const val DidDisappear = "didDisappear"
24
+ const val WillAppear = "willAppear"
25
+ const val WillDisappear = "willDisappear"
26
+ const val ButtonPressed = "buttonPressed"
27
+
28
+ // grid
29
+ const val GridButtonPressed = "gridButtonPressed"
30
+
31
+ // information
32
+ const val ActionButtonPressed = "actionButtonPressed"
33
+
34
+ // list
35
+ const val DidSelectListItem = "didSelectListItem"
36
+
37
+ // search
38
+ const val UpdatedSearchText = "updatedSearchText"
39
+ const val SearchButtonPressed = "searchButtonPressed"
40
+ const val SelectedResult = "selectedResult"
41
+
42
+ // tab bar
43
+ const val DidSelectTemplate = "didSelectTemplate"
44
+
45
+ // now playing
46
+ const val UpNextButtonPressed = "upNextButtonPressed"
47
+ const val AlbumArtistButtonPressed = "albumArtistButtonPressed"
48
+
49
+ // poi
50
+ const val DidSelectPointOfInterest = "didSelectPointOfInterest"
51
+
52
+ // map
53
+ const val MapButtonPressed = "mapButtonPressed"
54
+ const val DidUpdatePanGestureWithTranslation = "didUpdatePanGestureWithTranslation"
55
+ const val DidEndPanGestureWithVelocity = "didEndPanGestureWithVelocity"
56
+ const val PanBeganWithDirection = "panBeganWithDirection"
57
+ const val PanEndedWithDirection = "panEndedWithDirection"
58
+ const val PanWithDirection = "panWithDirection"
59
+ const val DidBeginPanGesture = "didBeginPanGesture"
60
+ const val DidDismissPanningInterface = "didDismissPanningInterface"
61
+ const val WillDismissPanningInterface = "willDismissPanningInterface"
62
+ const val DidShowPanningInterface = "didShowPanningInterface"
63
+ const val DidDismissNavigationAlert = "didDismissNavigationAlert"
64
+ const val WillDismissNavigationAlert = "willDismissNavigationAlert"
65
+ const val DidShowNavigationAlert = "didShowNavigationAlert"
66
+ const val WillShowNavigationAlert = "willShowNavigationAlert"
67
+ const val DidCancelNavigation = "didCancelNavigation"
68
+ const val AlertActionPressed = "alertActionPressed"
69
+ const val SelectedPreviewForTrip = "selectedPreviewForTrip"
70
+ const val StartedTrip = "startedTrip"
71
+ }
72
+
73
+ fun didConnect() {
74
+ Log.d("EventEmitter", "Did connect")
75
+ emit(DidConnect)
76
+ }
77
+
78
+ fun didDisconnect() {
79
+ emit(DidDisconnect)
80
+ }
81
+
82
+ fun buttonPressed(buttonId: String) {
83
+ emit(ButtonPressed, Arguments.createMap().apply {
84
+ putString("buttonId", buttonId)
85
+ })
86
+ }
87
+
88
+ fun barButtonPressed(templateId: String, buttonId: String) {
89
+ emit(BarButtonPressed, Arguments.createMap().apply {
90
+ putString("buttonId", buttonId)
91
+ })
92
+ }
93
+
94
+ fun backButtonPressed(templateId: String?) {
95
+ emit(BackButtonPressed, Arguments.createMap().apply {
96
+ templateId?.let { putString("templateId", templateId) }
97
+ })
98
+ }
99
+
100
+ fun didSelectListItem(id: String, index: Int) {
101
+ emit(DidSelectListItem, Arguments.createMap().apply {
102
+ putString("id", id)
103
+ putInt("index", index)
104
+ })
105
+ }
106
+
107
+ fun didSelectPointOfInterest(id: String, index: Int) {
108
+ val event = Arguments.createMap()
109
+ event.putString("id", id)
110
+ event.putInt("index", index)
111
+ emit(DidSelectPointOfInterest, event)
112
+ }
113
+
114
+ fun didSelectTemplate(selectedTemplateId: String) {
115
+ emit(DidSelectTemplate, Arguments.createMap().apply {
116
+ putString("selectedTemplateId", selectedTemplateId)
117
+ })
118
+ }
119
+
120
+ fun updatedSearchText(searchText: String) {
121
+ emit(UpdatedSearchText, Arguments.createMap().apply {
122
+ putString("searchText", searchText)
123
+ })
124
+ }
125
+
126
+ fun searchButtonPressed(searchText: String) {
127
+ emit(SearchButtonPressed, Arguments.createMap().apply {
128
+ putString("searchText", searchText)
129
+ })
130
+ }
131
+
132
+ fun alertActionPressed(type: String, reason: String? = null) {
133
+ emit(AlertActionPressed, Arguments.createMap().apply {
134
+ putString("type", type);
135
+ reason?.let { putString("reason", reason) }
136
+ });
137
+ }
138
+
139
+ fun selectedResult(index: Int, id: String?) {
140
+ emit(SelectedResult, Arguments.createMap().apply {
141
+ id?.let { putString("id", id) }
142
+ putInt("index", index)
143
+ })
144
+ }
145
+
146
+ fun gridButtonPressed(id: String, index: Int) {
147
+ val event = Arguments.createMap()
148
+ event.putString("id", id)
149
+ event.putInt("index", index)
150
+ emit(GridButtonPressed, event)
151
+ }
152
+
153
+ fun didShowPanningInterface() {
154
+ emit(DidShowPanningInterface)
155
+ }
156
+
157
+ fun didDismissPanningInterface() {
158
+ emit(DidDismissPanningInterface)
159
+ }
160
+
161
+ private fun emit(eventName: String, data: WritableMap = Arguments.createMap()) {
162
+ if (reactContext == null) {
163
+ Log.e("RNCarPlay", "Could not send event $eventName. React context is null!")
164
+ return
165
+ }
166
+ if (templateId != null && !data.hasKey("templateId")) {
167
+ data.putString("templateId", templateId)
168
+ }
169
+ reactContext!!
170
+ .getJSModule(RCTDeviceEventEmitter::class.java)
171
+ .emit(eventName, data)
172
+ }
173
+
174
+ }
@@ -0,0 +1,75 @@
1
+ package org.birkir.carplay.utils
2
+
3
+ import android.app.Presentation
4
+ import android.content.Context
5
+ import android.hardware.display.DisplayManager
6
+ import android.os.Bundle
7
+ import android.util.Log
8
+ import android.view.Display
9
+ import android.view.ViewGroup
10
+ import androidx.car.app.AppManager
11
+ import androidx.car.app.CarContext
12
+ import androidx.car.app.SurfaceCallback
13
+ import androidx.car.app.SurfaceContainer
14
+ import com.facebook.react.ReactApplication
15
+ import com.facebook.react.ReactRootView
16
+
17
+ /**
18
+ * Renders the view tree into a surface using VirtualDisplay. It runs the ReactNative component registered
19
+ */
20
+ class VirtualRenderer(private val context: CarContext, private val moduleName: String) {
21
+
22
+ private var rootView: ReactRootView? = null
23
+
24
+ init {
25
+ context.getCarService(AppManager::class.java).setSurfaceCallback(object : SurfaceCallback {
26
+ override fun onSurfaceAvailable(surfaceContainer: SurfaceContainer) {
27
+ val surface = surfaceContainer.surface
28
+ if (surface == null) {
29
+ Log.w(TAG, "surface is null")
30
+ } else {
31
+ renderPresentation(surfaceContainer)
32
+ }
33
+ }
34
+ })
35
+ }
36
+
37
+ private fun renderPresentation(container: SurfaceContainer) {
38
+ val manager = context.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
39
+ val display = manager.createVirtualDisplay(
40
+ "AndroidAutoMapTemplate",
41
+ container.width,
42
+ container.height,
43
+ container.dpi,
44
+ container.surface,
45
+ DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESENTATION,
46
+ )
47
+ val presentation = MapPresentation(context, display.display, moduleName)
48
+ presentation.show()
49
+ }
50
+
51
+ inner class MapPresentation(context: Context, display: Display, private val moduleName: String) :
52
+ Presentation(context, display) {
53
+ override fun onCreate(savedInstanceState: Bundle?) {
54
+ super.onCreate(savedInstanceState)
55
+ val instanceManager =
56
+ (context.applicationContext as ReactApplication).reactNativeHost.reactInstanceManager
57
+ if (rootView == null) {
58
+ Log.d(TAG, "onCreate: rootView is null, initializing rootView")
59
+ rootView = ReactRootView(context).apply {
60
+ startReactApplication(instanceManager, moduleName)
61
+ runApplication()
62
+ }
63
+ } else {
64
+ (rootView?.parent as? ViewGroup)?.removeView(rootView)
65
+ }
66
+ rootView?.let {
67
+ setContentView(it)
68
+ }
69
+ }
70
+ }
71
+
72
+ companion object {
73
+ const val TAG = "VirtualRenderer"
74
+ }
75
+ }
@@ -0,0 +1,18 @@
1
+ #import <CoreLocation/CoreLocation.h>
2
+ #import <MapKit/MapKit.h>
3
+ #import <CarPlay/CarPlay.h>
4
+ #import <React/RCTConvert.h>
5
+
6
+ @interface RCTConvert (RNCarPlay)
7
+
8
+ + (CPTripEstimateStyle)CPTripEstimateStyle:(id)json;
9
+ + (CPPanDirection)CPPanDirection:(id)json;
10
+ + (CPAssistantCellPosition)CPAssistantCellPosition:(id)json;
11
+ + (CPAssistantCellVisibility)CPAssistantCellVisibility:(id)json;
12
+ + (CPAssistantCellActionType)CPAssistantCellActionType:(id)json;
13
+ + (CPMapButton*)CPMapButton:(id)json withHandler:(void (^)(CPMapButton * _Nonnull mapButton))handler;
14
+ + (CPRouteChoice*)CPRouteChoice:(id)json;
15
+ + (MKMapItem*)MKMapItem:(id)json;
16
+ + (CPPointOfInterest*)CPPointOfInterest:(id)json;
17
+ + (CPAlertActionStyle)CPAlertActionStyle:(id)json;
18
+ @end
@@ -0,0 +1,96 @@
1
+ #import "RCTConvert+RNCarPlay.h"
2
+ #import <React/RCTConvert+CoreLocation.h>
3
+ #import <Availability.h>
4
+
5
+ @implementation RCTConvert (RNCarPlay)
6
+
7
+ RCT_ENUM_CONVERTER(CPTripEstimateStyle, (@{
8
+ @"light": @(CPTripEstimateStyleLight),
9
+ @"dark": @(CPTripEstimateStyleDark)
10
+ }),
11
+ CPTripEstimateStyleDark,
12
+ integerValue)
13
+
14
+ RCT_ENUM_CONVERTER(CPPanDirection, (@{
15
+ @"up": @(CPPanDirectionUp),
16
+ @"right": @(CPPanDirectionRight),
17
+ @"bottom": @(CPPanDirectionDown),
18
+ @"left": @(CPPanDirectionLeft),
19
+ @"none": @(CPPanDirectionNone)
20
+ }), CPPanDirectionNone, integerValue)
21
+
22
+ RCT_ENUM_CONVERTER(CPAssistantCellPosition, (@{
23
+ @"top": @(CPAssistantCellPositionTop),
24
+ @"bottom": @(CPAssistantCellPositionBottom)
25
+ }), CPAssistantCellPositionTop, integerValue)
26
+
27
+ RCT_ENUM_CONVERTER(CPAssistantCellVisibility, (@{
28
+ @"off": @(CPAssistantCellVisibilityOff),
29
+ @"always": @(CPAssistantCellVisibilityAlways),
30
+ @"limited": @(CPAssistantCellVisibilityWhileLimitedUIActive)
31
+ }), CPAssistantCellVisibilityOff, integerValue)
32
+
33
+ RCT_ENUM_CONVERTER(CPAssistantCellActionType, (@{
34
+ @"playMedia": @(CPAssistantCellActionTypePlayMedia),
35
+ @"startCall": @(CPAssistantCellActionTypeStartCall)
36
+ }), CPAssistantCellActionTypeStartCall, integerValue)
37
+
38
+
39
+ + (CPMapButton*)CPMapButton:(id)json withHandler:(void (^)(CPMapButton * _Nonnull mapButton))handler {
40
+ CPMapButton *mapButton = [[CPMapButton alloc] initWithHandler:handler];
41
+
42
+ if ([json objectForKey:@"image"]) {
43
+ [mapButton setImage:[RCTConvert UIImage:json[@"image"]]];
44
+ }
45
+
46
+ if ([json objectForKey:@"focusedImage"]) {
47
+ [mapButton setImage:[RCTConvert UIImage:json[@"focusedImage"]]];
48
+ }
49
+
50
+ if ([json objectForKey:@"disabled"]) {
51
+ [mapButton setEnabled:![RCTConvert BOOL:json[@"disabled"]]];
52
+ }
53
+
54
+ if ([json objectForKey:@"hidden"]) {
55
+ [mapButton setHidden:[RCTConvert BOOL:json[@"hidden"]]];
56
+ }
57
+
58
+ return mapButton;
59
+ }
60
+
61
+ + (MKMapItem*)MKMapItem:(id)json {
62
+ CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake([RCTConvert double:json[@"latitude"]], [RCTConvert double:json[@"longitude"]]);
63
+ NSString *name = [RCTConvert NSString:json[@"name"]];
64
+ MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate];
65
+ MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
66
+ mapItem.name = name;
67
+ return mapItem;
68
+ }
69
+
70
+ + (CPRouteChoice*)CPRouteChoice:(id)json {
71
+ return [[CPRouteChoice alloc] initWithSummaryVariants:[RCTConvert NSStringArray:json[@"additionalInformationVariants"]] additionalInformationVariants:[RCTConvert NSStringArray:json[@"selectionSummaryVariants"]] selectionSummaryVariants:[RCTConvert NSStringArray:json[@"summaryVariants"]]];
72
+ }
73
+
74
+ + (CPPointOfInterest*)CPPointOfInterest:(id)json {
75
+ MKMapItem *location = [RCTConvert MKMapItem:json[@"location"]];
76
+ NSString *title = [RCTConvert NSString:json[@"title"]];
77
+ NSString *subtitle = [RCTConvert NSString:json[@"subtitle"]];
78
+ NSString *summary = [RCTConvert NSString:json[@"summary"]];
79
+ NSString *detailTitle = [RCTConvert NSString:json[@"detailTitle"]];
80
+ NSString *detailSubtitle = [RCTConvert NSString:json[@"detailSubtitle"]];
81
+ NSString *detailSummary = [RCTConvert NSString:json[@"detailSummary"]];
82
+
83
+ CPPointOfInterest *poi = [[CPPointOfInterest alloc] initWithLocation:location title:title subtitle:subtitle summary:summary detailTitle:detailTitle detailSubtitle:detailSubtitle detailSummary:detailSummary pinImage:nil];
84
+ return poi;
85
+ }
86
+
87
+ + (CPAlertActionStyle)CPAlertActionStyle:(NSString*) json {
88
+ if ([json isEqualToString:@"cancel"]) {
89
+ return CPAlertActionStyleCancel;
90
+ } else if ([json isEqualToString:@"destructive"]) {
91
+ return CPAlertActionStyleDestructive;
92
+ }
93
+ return CPAlertActionStyleDefault;
94
+ }
95
+
96
+ @end
@@ -0,0 +1,24 @@
1
+ #import <Foundation/Foundation.h>
2
+ #import <CarPlay/CarPlay.h>
3
+
4
+ @interface RNCPStore : NSObject {
5
+ CPInterfaceController *interfaceController;
6
+ CPWindow *window;
7
+ CPTemplateApplicationScene *scene;
8
+ }
9
+
10
+ @property (nonatomic, retain) CPInterfaceController *interfaceController;
11
+ @property (nonatomic, retain) CPWindow *window;
12
+ @property (nonatomic, retain) CPTemplateApplicationScene *scene;
13
+
14
+ + (id)sharedManager;
15
+ - (CPTemplate*) findTemplateById: (NSString*)templateId;
16
+ - (NSString*) setTemplate:(NSString*)templateId template:(CPTemplate*)carPlayTemplate;
17
+ - (CPTrip*) findTripById: (NSString*)tripId;
18
+ - (NSString*) setTrip:(NSString*)tripId trip:(CPTrip*)trip;
19
+ - (CPNavigationSession*) findNavigationSessionById:(NSString*)navigationSessionId;
20
+ - (NSString*) setNavigationSession:(NSString*)navigationSessionId navigationSession:(CPNavigationSession*)navigationSession;
21
+ - (Boolean) isConnected;
22
+ - (void) setConnected:(Boolean) isConnected;
23
+
24
+ @end
@@ -0,0 +1,68 @@
1
+ #import "RNCPStore.h"
2
+
3
+ @implementation RNCPStore {
4
+ NSMutableDictionary* _templatesStore;
5
+ NSMutableDictionary* _navigationSessionsStore;
6
+ NSMutableDictionary* _tripsStore;
7
+ Boolean _connected;
8
+ }
9
+
10
+ @synthesize window;
11
+ @synthesize interfaceController;
12
+
13
+ -(instancetype)init {
14
+ if (self = [super init]) {
15
+ _templatesStore = [[NSMutableDictionary alloc] init];
16
+ _navigationSessionsStore = [[NSMutableDictionary alloc] init];
17
+ _tripsStore = [[NSMutableDictionary alloc] init];
18
+ _connected = false;
19
+ }
20
+
21
+ return self;
22
+ }
23
+
24
+ + (RNCPStore*) sharedManager {
25
+ static RNCPStore *shared = nil;
26
+ static dispatch_once_t onceToken;
27
+ dispatch_once(&onceToken, ^{
28
+ shared = [[self alloc] init];
29
+ });
30
+ return shared;
31
+ }
32
+
33
+ - (void) setConnected:(Boolean) isConnected {
34
+ _connected = isConnected;
35
+ }
36
+
37
+ - (Boolean) isConnected {
38
+ return _connected;
39
+ }
40
+
41
+ - (CPTemplate*) findTemplateById:(NSString*)templateId {
42
+ return [_templatesStore objectForKey:templateId];
43
+ }
44
+
45
+ - (NSString*) setTemplate:(NSString*)templateId template:(CPTemplate*)carPlayTemplate {
46
+ [_templatesStore setObject:carPlayTemplate forKey:templateId];
47
+ return templateId;
48
+ }
49
+
50
+ - (CPTrip*) findTripById:(NSString*)tripId {
51
+ return [_tripsStore objectForKey:tripId];
52
+ }
53
+
54
+ - (NSString*) setTrip:(NSString*)tripId trip:(CPTrip*)trip {
55
+ [_tripsStore setObject:trip forKey:tripId];
56
+ return tripId;
57
+ }
58
+
59
+ - (CPNavigationSession*) findNavigationSessionById:(NSString*)navigationSessionId {
60
+ return [_navigationSessionsStore objectForKey:navigationSessionId];
61
+ }
62
+
63
+ - (NSString*) setNavigationSession:(NSString*)navigationSessionId navigationSession:(CPNavigationSession*)navigationSession {
64
+ [_navigationSessionsStore setObject:navigationSession forKey:navigationSessionId];
65
+ return navigationSessionId;
66
+ }
67
+
68
+ @end
@@ -0,0 +1,29 @@
1
+ #import <Foundation/Foundation.h>
2
+ #import <CarPlay/CarPlay.h>
3
+ #import <React/RCTBridgeModule.h>
4
+ #import <React/RCTEventEmitter.h>
5
+ #import "RCTConvert+RNCarPlay.h"
6
+ #import "RNCPStore.h"
7
+
8
+ typedef void(^SearchResultUpdateBlock)(NSArray<CPListItem *> * _Nonnull);
9
+ typedef void(^SelectedResultBlock)(void);
10
+
11
+ @interface RNCarPlay : RCTEventEmitter<RCTBridgeModule,CPPointOfInterestTemplateDelegate, CPInterfaceControllerDelegate, CPSearchTemplateDelegate, CPListTemplateDelegate, CPMapTemplateDelegate, CPTabBarTemplateDelegate, CPNowPlayingTemplateObserver> {
12
+ CPInterfaceController *interfaceController;
13
+ CPWindow *window;
14
+ SearchResultUpdateBlock searchResultBlock;
15
+ SelectedResultBlock selectedResultBlock;
16
+ BOOL isNowPlayingActive;
17
+ }
18
+
19
+ @property (nonatomic, retain) CPInterfaceController *interfaceController;
20
+ @property (nonatomic, retain) CPWindow *window;
21
+ @property (nonatomic, copy) SearchResultUpdateBlock searchResultBlock;
22
+ @property (nonatomic, copy) SelectedResultBlock selectedResultBlock;
23
+ @property (nonatomic) BOOL isNowPlayingActive;
24
+
25
+ + (void) connectWithInterfaceController:(CPInterfaceController*)interfaceController window:(CPWindow*)window scene:(CPTemplateApplicationScene*)scene;
26
+ + (void) disconnect;
27
+ - (NSArray<CPListSection*>*) parseSections:(NSArray*)sections;
28
+
29
+ @end