@maydon_tech/react-native-nitro-maps 0.1.3 → 0.2.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.
Files changed (218) hide show
  1. package/LICENSE +1 -1
  2. package/NitroMap.podspec +1 -1
  3. package/README.md +82 -9
  4. package/android/CMakeLists.txt +4 -1
  5. package/android/gradle.properties +4 -4
  6. package/android/src/main/cpp/ClusterEngineJNI.cpp +198 -0
  7. package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMap.kt +397 -0
  8. package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMapConfig.kt +53 -0
  9. package/android/src/main/{java → kotlin}/com/margelo/nitro/nitromap/NitroMapPackage.kt +4 -4
  10. package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMapView.kt +73 -0
  11. package/android/src/main/kotlin/com/margelo/nitro/nitromap/UserLocationManager.kt +295 -0
  12. package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/ClusterIconRenderer.kt +111 -0
  13. package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/ClusteringManager.kt +104 -0
  14. package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/NitroClusterEngine.kt +166 -0
  15. package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/MarkerIconFactory.kt +303 -0
  16. package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/MarkerSelectionHandler.kt +72 -0
  17. package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/PriceMarkerRenderer.kt +159 -0
  18. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/MapProviderFactory.kt +24 -0
  19. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/MapProviderInterface.kt +128 -0
  20. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapDelegate.kt +317 -0
  21. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Clustering.kt +524 -0
  22. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Markers.kt +358 -0
  23. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Overlays.kt +272 -0
  24. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+UserLocation.kt +296 -0
  25. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider.kt +815 -0
  26. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/MarkerTagData.kt +19 -0
  27. package/ios/Clustering/ClusterIconRenderer.swift +3 -3
  28. package/ios/Location/NitroLocationManager.swift +116 -0
  29. package/ios/MarkerRenderer/MarkerIconFactory.swift +1 -3
  30. package/ios/MarkerRenderer/PriceMarkerRenderer.swift +10 -6
  31. package/ios/NitroMap.swift +279 -13
  32. package/ios/NitroMapConfig/NitroMapConfig.swift +45 -0
  33. package/ios/Providers/{GoogleMapDelegate.swift → Google/GoogleMapDelegate.swift} +48 -23
  34. package/ios/Providers/Google/GoogleMapProvider+Camera.swift +180 -0
  35. package/ios/Providers/Google/GoogleMapProvider+Clustering.swift +541 -0
  36. package/ios/Providers/Google/GoogleMapProvider+Markers.swift +270 -0
  37. package/ios/Providers/Google/GoogleMapProvider+Overlays.swift +245 -0
  38. package/ios/Providers/Google/GoogleMapProvider+UserLocation.swift +180 -0
  39. package/ios/Providers/Google/GoogleMapProvider.swift +342 -0
  40. package/ios/Providers/MapProviderFactory.swift +17 -0
  41. package/ios/Providers/MapProviderProtocol.swift +48 -1
  42. package/ios/Shared/ClusterConfig+Factory.swift +2 -2
  43. package/ios/Shared/MapStyleProvider.swift +6 -4
  44. package/ios/Shared/MarkerSelectionHandler.swift +4 -1
  45. package/ios/Utils/ColorValueExtension.swift +46 -67
  46. package/lib/module/components/ImageMarker.js +39 -29
  47. package/lib/module/components/ImageMarker.js.map +1 -1
  48. package/lib/module/components/Marker.js +118 -0
  49. package/lib/module/components/Marker.js.map +1 -0
  50. package/lib/module/components/NitroCircle.js +92 -0
  51. package/lib/module/components/NitroCircle.js.map +1 -0
  52. package/lib/module/components/NitroMap.js +216 -76
  53. package/lib/module/components/NitroMap.js.map +1 -1
  54. package/lib/module/components/NitroPolygon.js +135 -0
  55. package/lib/module/components/NitroPolygon.js.map +1 -0
  56. package/lib/module/components/NitroPolyline.js +115 -0
  57. package/lib/module/components/NitroPolyline.js.map +1 -0
  58. package/lib/module/components/PriceMarker.js +16 -29
  59. package/lib/module/components/PriceMarker.js.map +1 -1
  60. package/lib/module/context/NitroMapContext.js.map +1 -1
  61. package/lib/module/hooks/useNitroCircle.js +18 -0
  62. package/lib/module/hooks/useNitroCircle.js.map +1 -0
  63. package/lib/module/hooks/useNitroMarker.js +26 -9
  64. package/lib/module/hooks/useNitroMarker.js.map +1 -1
  65. package/lib/module/hooks/useNitroOverlay.js +59 -0
  66. package/lib/module/hooks/useNitroOverlay.js.map +1 -0
  67. package/lib/module/hooks/useNitroPolygon.js +18 -0
  68. package/lib/module/hooks/useNitroPolygon.js.map +1 -0
  69. package/lib/module/hooks/useNitroPolyline.js +18 -0
  70. package/lib/module/hooks/useNitroPolyline.js.map +1 -0
  71. package/lib/module/index.js +5 -0
  72. package/lib/module/index.js.map +1 -1
  73. package/lib/module/types/overlay.js +4 -0
  74. package/lib/module/types/overlay.js.map +1 -0
  75. package/lib/module/types/theme.js +4 -0
  76. package/lib/module/types/theme.js.map +1 -0
  77. package/lib/module/utils/colors.js +41 -13
  78. package/lib/module/utils/colors.js.map +1 -1
  79. package/lib/module/utils/validation.js +45 -0
  80. package/lib/module/utils/validation.js.map +1 -0
  81. package/lib/typescript/src/components/ImageMarker.d.ts.map +1 -1
  82. package/lib/typescript/src/components/Marker.d.ts +34 -0
  83. package/lib/typescript/src/components/Marker.d.ts.map +1 -0
  84. package/lib/typescript/src/components/NitroCircle.d.ts +70 -0
  85. package/lib/typescript/src/components/NitroCircle.d.ts.map +1 -0
  86. package/lib/typescript/src/components/NitroMap.d.ts +60 -3
  87. package/lib/typescript/src/components/NitroMap.d.ts.map +1 -1
  88. package/lib/typescript/src/components/NitroPolygon.d.ts +86 -0
  89. package/lib/typescript/src/components/NitroPolygon.d.ts.map +1 -0
  90. package/lib/typescript/src/components/NitroPolyline.d.ts +84 -0
  91. package/lib/typescript/src/components/NitroPolyline.d.ts.map +1 -0
  92. package/lib/typescript/src/components/PriceMarker.d.ts +0 -5
  93. package/lib/typescript/src/components/PriceMarker.d.ts.map +1 -1
  94. package/lib/typescript/src/context/NitroMapContext.d.ts +2 -0
  95. package/lib/typescript/src/context/NitroMapContext.d.ts.map +1 -1
  96. package/lib/typescript/src/hooks/useNitroCircle.d.ts +7 -0
  97. package/lib/typescript/src/hooks/useNitroCircle.d.ts.map +1 -0
  98. package/lib/typescript/src/hooks/useNitroMarker.d.ts +20 -0
  99. package/lib/typescript/src/hooks/useNitroMarker.d.ts.map +1 -1
  100. package/lib/typescript/src/hooks/useNitroOverlay.d.ts +26 -0
  101. package/lib/typescript/src/hooks/useNitroOverlay.d.ts.map +1 -0
  102. package/lib/typescript/src/hooks/useNitroPolygon.d.ts +7 -0
  103. package/lib/typescript/src/hooks/useNitroPolygon.d.ts.map +1 -0
  104. package/lib/typescript/src/hooks/useNitroPolyline.d.ts +7 -0
  105. package/lib/typescript/src/hooks/useNitroPolyline.d.ts.map +1 -0
  106. package/lib/typescript/src/index.d.ts +15 -2
  107. package/lib/typescript/src/index.d.ts.map +1 -1
  108. package/lib/typescript/src/specs/NitroMap.nitro.d.ts +248 -6
  109. package/lib/typescript/src/specs/NitroMap.nitro.d.ts.map +1 -1
  110. package/lib/typescript/src/types/map.d.ts +34 -4
  111. package/lib/typescript/src/types/map.d.ts.map +1 -1
  112. package/lib/typescript/src/types/marker.d.ts +24 -36
  113. package/lib/typescript/src/types/marker.d.ts.map +1 -1
  114. package/lib/typescript/src/types/overlay.d.ts +75 -0
  115. package/lib/typescript/src/types/overlay.d.ts.map +1 -0
  116. package/lib/typescript/src/types/theme.d.ts +93 -0
  117. package/lib/typescript/src/types/theme.d.ts.map +1 -0
  118. package/lib/typescript/src/utils/colors.d.ts +6 -8
  119. package/lib/typescript/src/utils/colors.d.ts.map +1 -1
  120. package/lib/typescript/src/utils/validation.d.ts +12 -0
  121. package/lib/typescript/src/utils/validation.d.ts.map +1 -0
  122. package/nitrogen/generated/android/c++/JCircleData.hpp +94 -0
  123. package/nitrogen/generated/android/c++/JClusterConfig.hpp +5 -7
  124. package/nitrogen/generated/android/c++/JFunc_void_UserLocationChangeEvent.hpp +79 -0
  125. package/nitrogen/generated/android/c++/JFunc_void_UserTrackingMode.hpp +77 -0
  126. package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +76 -0
  127. package/nitrogen/generated/android/c++/JHybridNitroMapSpec.cpp +328 -21
  128. package/nitrogen/generated/android/c++/JHybridNitroMapSpec.hpp +53 -2
  129. package/nitrogen/generated/android/c++/JMarkerAnimation.hpp +3 -6
  130. package/nitrogen/generated/android/c++/JMarkerData.hpp +15 -3
  131. package/nitrogen/generated/android/c++/JPolygonData.hpp +149 -0
  132. package/nitrogen/generated/android/c++/JPolylineData.hpp +113 -0
  133. package/nitrogen/generated/android/c++/JUserLocationChangeEvent.hpp +70 -0
  134. package/nitrogen/generated/android/c++/JUserTrackingMode.hpp +62 -0
  135. package/nitrogen/generated/android/c++/views/JHybridNitroMapStateUpdater.cpp +72 -4
  136. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/CircleData.kt +62 -0
  137. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ClusterConfig.kt +4 -4
  138. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_UserLocationChangeEvent.kt +80 -0
  139. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_UserTrackingMode.kt +80 -0
  140. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_std__string.kt +80 -0
  141. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/HybridNitroMapSpec.kt +228 -2
  142. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerAnimation.kt +1 -2
  143. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerData.kt +12 -3
  144. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/PolygonData.kt +62 -0
  145. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/PolylineData.kt +62 -0
  146. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/UserLocationChangeEvent.kt +47 -0
  147. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/{ClusterAnimationStyle.kt → UserTrackingMode.kt} +6 -8
  148. package/nitrogen/generated/android/nitromapOnLoad.cpp +6 -0
  149. package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Bridge.cpp +24 -0
  150. package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Bridge.hpp +175 -17
  151. package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Umbrella.hpp +15 -3
  152. package/nitrogen/generated/ios/c++/HybridNitroMapSpecSwift.hpp +249 -16
  153. package/nitrogen/generated/ios/c++/views/HybridNitroMapComponent.mm +90 -5
  154. package/nitrogen/generated/ios/swift/CircleData.swift +143 -0
  155. package/nitrogen/generated/ios/swift/ClusterConfig.swift +22 -15
  156. package/nitrogen/generated/ios/swift/Func_void_UserLocationChangeEvent.swift +47 -0
  157. package/nitrogen/generated/ios/swift/Func_void_UserTrackingMode.swift +47 -0
  158. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
  159. package/nitrogen/generated/ios/swift/HybridNitroMapSpec.swift +35 -1
  160. package/nitrogen/generated/ios/swift/HybridNitroMapSpec_cxx.swift +582 -8
  161. package/nitrogen/generated/ios/swift/MarkerAnimation.swift +4 -8
  162. package/nitrogen/generated/ios/swift/MarkerData.swift +54 -2
  163. package/nitrogen/generated/ios/swift/PolygonData.swift +179 -0
  164. package/nitrogen/generated/ios/swift/PolylineData.swift +155 -0
  165. package/nitrogen/generated/ios/swift/UserLocationChangeEvent.swift +69 -0
  166. package/nitrogen/generated/ios/swift/UserTrackingMode.swift +44 -0
  167. package/nitrogen/generated/shared/c++/CircleData.hpp +113 -0
  168. package/nitrogen/generated/shared/c++/ClusterConfig.hpp +5 -8
  169. package/nitrogen/generated/shared/c++/HybridNitroMapSpec.cpp +53 -2
  170. package/nitrogen/generated/shared/c++/HybridNitroMapSpec.hpp +75 -6
  171. package/nitrogen/generated/shared/c++/MarkerAnimation.hpp +4 -8
  172. package/nitrogen/generated/shared/c++/MarkerData.hpp +14 -2
  173. package/nitrogen/generated/shared/c++/PolygonData.hpp +114 -0
  174. package/nitrogen/generated/shared/c++/PolylineData.hpp +114 -0
  175. package/nitrogen/generated/shared/c++/UserLocationChangeEvent.hpp +88 -0
  176. package/nitrogen/generated/shared/c++/UserTrackingMode.hpp +80 -0
  177. package/nitrogen/generated/shared/c++/views/HybridNitroMapComponent.cpp +216 -12
  178. package/nitrogen/generated/shared/c++/views/HybridNitroMapComponent.hpp +23 -1
  179. package/nitrogen/generated/shared/json/NitroMapConfig.json +18 -1
  180. package/package.json +36 -5
  181. package/src/components/ImageMarker.tsx +58 -42
  182. package/src/components/Marker.tsx +161 -0
  183. package/src/components/NitroCircle.tsx +183 -0
  184. package/src/components/NitroMap.tsx +328 -78
  185. package/src/components/NitroPolygon.tsx +229 -0
  186. package/src/components/NitroPolyline.tsx +208 -0
  187. package/src/components/PriceMarker.tsx +23 -48
  188. package/src/context/NitroMapContext.tsx +4 -0
  189. package/src/hooks/useNitroCircle.ts +25 -0
  190. package/src/hooks/useNitroMarker.ts +49 -10
  191. package/src/hooks/useNitroOverlay.ts +68 -0
  192. package/src/hooks/useNitroPolygon.ts +25 -0
  193. package/src/hooks/useNitroPolyline.ts +25 -0
  194. package/src/index.tsx +23 -2
  195. package/src/specs/NitroMap.nitro.ts +294 -5
  196. package/src/types/map.ts +36 -4
  197. package/src/types/marker.ts +24 -44
  198. package/src/types/overlay.ts +77 -0
  199. package/src/types/theme.ts +101 -0
  200. package/src/utils/colors.ts +48 -16
  201. package/src/utils/validation.ts +69 -0
  202. package/android/src/main/java/com/margelo/nitro/nitromap/ClusterIconGenerator.kt +0 -108
  203. package/android/src/main/java/com/margelo/nitro/nitromap/ColorUtils.kt +0 -63
  204. package/android/src/main/java/com/margelo/nitro/nitromap/HybridNitroMap.kt +0 -408
  205. package/android/src/main/java/com/margelo/nitro/nitromap/HybridNitroMapConfig.kt +0 -68
  206. package/android/src/main/java/com/margelo/nitro/nitromap/MarkerIconCache.kt +0 -176
  207. package/android/src/main/java/com/margelo/nitro/nitromap/MarkerIconFactory.kt +0 -252
  208. package/android/src/main/java/com/margelo/nitro/nitromap/clustering/NitroClusterEngine.kt +0 -252
  209. package/android/src/main/java/com/margelo/nitro/nitromap/clustering/QuadTree.kt +0 -195
  210. package/android/src/main/java/com/margelo/nitro/nitromap/providers/GoogleMapProvider.kt +0 -912
  211. package/android/src/main/java/com/margelo/nitro/nitromap/providers/MapProviderInterface.kt +0 -70
  212. package/cpp/QuadTree.hpp +0 -246
  213. package/ios/NitroMapConfig/HybridNitroMapConfig.swift +0 -33
  214. package/ios/Providers/GoogleMapProvider+Camera.swift +0 -164
  215. package/ios/Providers/GoogleMapProvider.swift +0 -924
  216. package/nitrogen/generated/android/c++/JClusterAnimationStyle.hpp +0 -68
  217. package/nitrogen/generated/ios/swift/ClusterAnimationStyle.swift +0 -52
  218. package/nitrogen/generated/shared/c++/ClusterAnimationStyle.hpp +0 -88
@@ -1,408 +0,0 @@
1
- package com.margelo.nitro.nitromap
2
-
3
- import android.view.View
4
- import com.facebook.proguard.annotations.DoNotStrip
5
- import com.facebook.react.uimanager.ThemedReactContext
6
- import com.margelo.nitro.core.Promise
7
- import com.margelo.nitro.nitromap.providers.GoogleMapProvider
8
- import com.margelo.nitro.nitromap.providers.MapProviderInterface
9
-
10
- /**
11
- * HybridNitroMap - Pure facade that delegates all operations to Google Maps provider.
12
- *
13
- * This class serves as the bridge between React Native and native map implementations.
14
- * Currently only Google Maps is supported. Additional providers will be added
15
- * once Google Maps is solid on both platforms.
16
- */
17
- @DoNotStrip
18
- class HybridNitroMap(val context: ThemedReactContext) : HybridNitroMapSpec() {
19
-
20
- // ============================================================================
21
- // MARK: - Provider Management
22
- // ============================================================================
23
-
24
- private var currentProvider: MapProviderInterface
25
- private var _provider: MapProvider = MapProvider.GOOGLE
26
-
27
- // Container for provider views
28
- private val containerView: android.widget.FrameLayout = android.widget.FrameLayout(context)
29
-
30
- override val view: View
31
- get() = containerView
32
-
33
- @get:DoNotStrip
34
- @set:DoNotStrip
35
- override var provider: MapProvider?
36
- get() = _provider
37
- set(value) {
38
- if (value != null && value != _provider) {
39
- _provider = value
40
- switchProvider(value)
41
- }
42
- }
43
-
44
- init {
45
- // Initialize with default provider
46
- currentProvider = createProvider(_provider)
47
- setupProvider(currentProvider)
48
- }
49
-
50
- private fun createProvider(providerType: MapProvider): MapProviderInterface {
51
- // Currently only Google Maps is supported
52
- return GoogleMapProvider(context)
53
- }
54
-
55
- private fun setupProvider(provider: MapProviderInterface) {
56
- // Forward all callbacks
57
- provider.onMapReady = _onMapReady
58
- provider.onPress = _onPress
59
- provider.onLongPress = _onLongPress
60
- provider.onRegionChange = _onRegionChange
61
- provider.onRegionChangeComplete = _onRegionChangeComplete
62
- provider.onMarkerPress = _onMarkerPress
63
- provider.onMarkerDragStart = _onMarkerDragStart
64
- provider.onMarkerDrag = _onMarkerDrag
65
- provider.onMarkerDragEnd = _onMarkerDragEnd
66
- provider.onClusterPress = _onClusterPress
67
- provider.onError = _onError
68
-
69
- // Forward all properties
70
- provider.initialRegion = _initialRegion
71
- provider.showsUserLocation = _showsUserLocation
72
- provider.showsMyLocationButton = _showsMyLocationButton
73
- provider.zoomEnabled = _zoomEnabled
74
- provider.scrollEnabled = _scrollEnabled
75
- provider.rotateEnabled = _rotateEnabled
76
- provider.pitchEnabled = _pitchEnabled
77
- provider.mapType = _mapType
78
- provider.clusterConfig = _clusterConfig
79
- provider.darkMode = _darkMode
80
- provider.customMapStyle = _customMapStyle
81
-
82
- // Setup the provider
83
- provider.setup()
84
-
85
- // Add provider view to container
86
- containerView.addView(
87
- provider.mapView,
88
- android.widget.FrameLayout.LayoutParams(
89
- android.widget.FrameLayout.LayoutParams.MATCH_PARENT,
90
- android.widget.FrameLayout.LayoutParams.MATCH_PARENT
91
- )
92
- )
93
- }
94
-
95
- private fun switchProvider(newProviderType: MapProvider) {
96
- // Remove current provider view
97
- containerView.removeAllViews()
98
-
99
- // Cleanup old provider
100
- currentProvider.onDestroy()
101
-
102
- // Create and setup new provider
103
- currentProvider = createProvider(newProviderType)
104
- setupProvider(currentProvider)
105
- }
106
-
107
- // ============================================================================
108
- // MARK: - Properties (stored locally, forwarded to provider)
109
- // ============================================================================
110
-
111
- private var _initialRegion: Region? = null
112
- override var initialRegion: Region?
113
- get() = _initialRegion
114
- set(value) {
115
- _initialRegion = value
116
- currentProvider.initialRegion = value
117
- }
118
-
119
- private var _showsUserLocation: Boolean? = null
120
- override var showsUserLocation: Boolean?
121
- get() = _showsUserLocation
122
- set(value) {
123
- _showsUserLocation = value
124
- currentProvider.showsUserLocation = value
125
- }
126
-
127
- private var _showsMyLocationButton: Boolean? = null
128
- override var showsMyLocationButton: Boolean?
129
- get() = _showsMyLocationButton
130
- set(value) {
131
- _showsMyLocationButton = value
132
- currentProvider.showsMyLocationButton = value
133
- }
134
-
135
- private var _zoomEnabled: Boolean? = null
136
- override var zoomEnabled: Boolean?
137
- get() = _zoomEnabled
138
- set(value) {
139
- _zoomEnabled = value
140
- currentProvider.zoomEnabled = value
141
- }
142
-
143
- private var _scrollEnabled: Boolean? = null
144
- override var scrollEnabled: Boolean?
145
- get() = _scrollEnabled
146
- set(value) {
147
- _scrollEnabled = value
148
- currentProvider.scrollEnabled = value
149
- }
150
-
151
- private var _rotateEnabled: Boolean? = null
152
- override var rotateEnabled: Boolean?
153
- get() = _rotateEnabled
154
- set(value) {
155
- _rotateEnabled = value
156
- currentProvider.rotateEnabled = value
157
- }
158
-
159
- private var _pitchEnabled: Boolean? = null
160
- override var pitchEnabled: Boolean?
161
- get() = _pitchEnabled
162
- set(value) {
163
- _pitchEnabled = value
164
- currentProvider.pitchEnabled = value
165
- }
166
-
167
- private var _mapType: MapType? = null
168
- override var mapType: MapType?
169
- get() = _mapType
170
- set(value) {
171
- _mapType = value
172
- currentProvider.mapType = value
173
- }
174
-
175
- private var _clusterConfig: ClusterConfig? = null
176
- override var clusterConfig: ClusterConfig?
177
- get() = _clusterConfig
178
- set(value) {
179
- _clusterConfig = value
180
- currentProvider.clusterConfig = value
181
- }
182
-
183
- private var _customMapStyle: Array<MapStyleElement>? = null
184
- override var customMapStyle: Array<MapStyleElement>?
185
- get() = _customMapStyle
186
- set(value) {
187
- _customMapStyle = value
188
- currentProvider.customMapStyle = value
189
- }
190
-
191
- private var _darkMode: Boolean? = false
192
- @get:DoNotStrip
193
- @set:DoNotStrip
194
- override var darkMode: Boolean?
195
- get() = _darkMode
196
- set(value) {
197
- _darkMode = value
198
- currentProvider.darkMode = value
199
- }
200
-
201
- // ============================================================================
202
- // MARK: - Callbacks (stored locally, forwarded to provider)
203
- // ============================================================================
204
-
205
- private var _onPress: ((event: MapPressEvent) -> Unit)? = null
206
- override var onPress: ((event: MapPressEvent) -> Unit)?
207
- get() = _onPress
208
- set(value) {
209
- _onPress = value
210
- currentProvider.onPress = value
211
- }
212
-
213
- private var _onLongPress: ((event: MapPressEvent) -> Unit)? = null
214
- override var onLongPress: ((event: MapPressEvent) -> Unit)?
215
- get() = _onLongPress
216
- set(value) {
217
- _onLongPress = value
218
- currentProvider.onLongPress = value
219
- }
220
-
221
- private var _onMapReady: (() -> Unit)? = null
222
- override var onMapReady: (() -> Unit)?
223
- get() = _onMapReady
224
- set(value) {
225
- _onMapReady = value
226
- currentProvider.onMapReady = value
227
- }
228
-
229
- private var _onRegionChange: ((region: RegionChangeEvent) -> Unit)? = null
230
- override var onRegionChange: ((region: RegionChangeEvent) -> Unit)?
231
- get() = _onRegionChange
232
- set(value) {
233
- _onRegionChange = value
234
- currentProvider.onRegionChange = value
235
- }
236
-
237
- private var _onRegionChangeComplete: ((region: RegionChangeEvent) -> Unit)? = null
238
- override var onRegionChangeComplete: ((region: RegionChangeEvent) -> Unit)?
239
- get() = _onRegionChangeComplete
240
- set(value) {
241
- _onRegionChangeComplete = value
242
- currentProvider.onRegionChangeComplete = value
243
- }
244
-
245
- private var _onMarkerPress: ((event: MarkerPressEvent) -> Unit)? = null
246
- override var onMarkerPress: ((event: MarkerPressEvent) -> Unit)?
247
- get() = _onMarkerPress
248
- set(value) {
249
- _onMarkerPress = value
250
- currentProvider.onMarkerPress = value
251
- }
252
-
253
- private var _onMarkerDragStart: ((event: MarkerDragEvent) -> Unit)? = null
254
- override var onMarkerDragStart: ((event: MarkerDragEvent) -> Unit)?
255
- get() = _onMarkerDragStart
256
- set(value) {
257
- _onMarkerDragStart = value
258
- currentProvider.onMarkerDragStart = value
259
- }
260
-
261
- private var _onMarkerDrag: ((event: MarkerDragEvent) -> Unit)? = null
262
- override var onMarkerDrag: ((event: MarkerDragEvent) -> Unit)?
263
- get() = _onMarkerDrag
264
- set(value) {
265
- _onMarkerDrag = value
266
- currentProvider.onMarkerDrag = value
267
- }
268
-
269
- private var _onMarkerDragEnd: ((event: MarkerDragEvent) -> Unit)? = null
270
- override var onMarkerDragEnd: ((event: MarkerDragEvent) -> Unit)?
271
- get() = _onMarkerDragEnd
272
- set(value) {
273
- _onMarkerDragEnd = value
274
- currentProvider.onMarkerDragEnd = value
275
- }
276
-
277
- private var _onClusterPress: ((event: ClusterPressEvent) -> Unit)? = null
278
- override var onClusterPress: ((event: ClusterPressEvent) -> Unit)?
279
- get() = _onClusterPress
280
- set(value) {
281
- _onClusterPress = value
282
- currentProvider.onClusterPress = value
283
- }
284
-
285
- private var _onError: ((error: MapError) -> Unit)? = null
286
- override var onError: ((error: MapError) -> Unit)?
287
- get() = _onError
288
- set(value) {
289
- _onError = value
290
- currentProvider.onError = value
291
- }
292
-
293
- // ============================================================================
294
- // MARK: - Marker Methods (delegated to provider)
295
- // ============================================================================
296
-
297
- override fun addMarker(marker: MarkerData) {
298
- currentProvider.addMarker(marker)
299
- }
300
-
301
- override fun addMarkers(markers: Array<MarkerData>) {
302
- currentProvider.addMarkers(markers)
303
- }
304
-
305
- override fun updateMarker(marker: MarkerData) {
306
- currentProvider.updateMarker(marker)
307
- }
308
-
309
- override fun removeMarker(id: String) {
310
- currentProvider.removeMarker(id)
311
- }
312
-
313
- override fun clearMarkers() {
314
- currentProvider.clearMarkers()
315
- }
316
-
317
- override fun selectMarker(id: String) {
318
- currentProvider.selectMarker(id)
319
- }
320
-
321
- // ============================================================================
322
- // MARK: - Clustering Methods (delegated to provider)
323
- // ============================================================================
324
-
325
- override fun setClusteringEnabled(enabled: Boolean) {
326
- currentProvider.setClusteringEnabled(enabled)
327
- }
328
-
329
- override fun refreshClusters() {
330
- currentProvider.refreshClusters()
331
- }
332
-
333
- // ============================================================================
334
- // MARK: - Camera Methods (delegated to provider)
335
- // ============================================================================
336
-
337
- override fun animateToRegion(region: Region, duration: Double?) {
338
- currentProvider.animateToRegion(region, duration ?: 300.0)
339
- }
340
-
341
- override fun fitToCoordinates(
342
- coordinates: Array<Coordinate>,
343
- edgePadding: EdgePadding?,
344
- animated: Boolean?
345
- ) {
346
- currentProvider.fitToCoordinates(
347
- coordinates,
348
- edgePadding ?: EdgePadding(50.0, 50.0, 50.0, 50.0),
349
- animated ?: true
350
- )
351
- }
352
-
353
- override fun animateCamera(camera: Camera, duration: Double?) {
354
- currentProvider.animateCamera(camera, duration ?: 300.0)
355
- }
356
-
357
- override fun setCamera(camera: Camera) {
358
- currentProvider.setCamera(camera)
359
- }
360
-
361
- override fun getCamera(): Promise<Camera> {
362
- return currentProvider.getCamera()
363
- }
364
-
365
- override fun getMapBoundaries(): Promise<MapBoundaries> {
366
- return currentProvider.getMapBoundaries()
367
- }
368
-
369
- // ============================================================================
370
- // MARK: - Styling Methods (delegated to provider)
371
- // ============================================================================
372
-
373
- override fun setMapStyle(style: Array<MapStyleElement>?) {
374
- currentProvider.setMapStyle(style)
375
- }
376
-
377
- override fun setIsDarkMode(enabled: Boolean) {
378
- currentProvider.setIsDarkMode(enabled)
379
- }
380
-
381
- // ============================================================================
382
- // MARK: - Lifecycle Methods (delegated to provider)
383
- // ============================================================================
384
-
385
- override fun beforeUpdate() {
386
- // No-op: Properties are applied via setters
387
- }
388
-
389
- override fun afterUpdate() {
390
- // No-op: Properties are applied via setters
391
- }
392
-
393
- fun onResume() {
394
- currentProvider.onResume()
395
- }
396
-
397
- fun onPause() {
398
- currentProvider.onPause()
399
- }
400
-
401
- fun onDestroy() {
402
- currentProvider.onDestroy()
403
- }
404
-
405
- fun onLowMemory() {
406
- // Providers can implement if needed
407
- }
408
- }
@@ -1,68 +0,0 @@
1
- package com.margelo.nitro.nitromap
2
-
3
- import android.content.Context
4
- import android.content.pm.ApplicationInfo
5
- import android.content.pm.PackageManager
6
- import android.os.Bundle
7
- import androidx.annotation.Keep
8
- import com.facebook.proguard.annotations.DoNotStrip
9
- import com.google.android.gms.maps.MapsInitializer
10
-
11
- @DoNotStrip
12
- @Keep
13
- class HybridNitroMapConfig : HybridNitroMapConfigSpec() {
14
-
15
- companion object {
16
- private var isInitialized = false
17
- private var applicationContext: Context? = null
18
- private var googleMapsApiKey: String? = null
19
-
20
- fun setContext(context: Context) {
21
- applicationContext = context.applicationContext
22
- }
23
-
24
- fun getGoogleMapsApiKey(): String? = googleMapsApiKey
25
- }
26
-
27
- override fun NitroMapInitialize(apiKey: String, provider: MapProvider) {
28
- if (isInitialized) {
29
- println("[NitroMap] Already initialized")
30
- return
31
- }
32
-
33
- val context =
34
- applicationContext
35
- ?: throw IllegalStateException(
36
- "[NitroMap] Context not set. Call setContext() first."
37
- )
38
-
39
- // Currently only Google Maps is supported
40
- googleMapsApiKey = apiKey
41
- injectGoogleMapsApiKey(context, apiKey)
42
- MapsInitializer.initialize(context, MapsInitializer.Renderer.LATEST) { renderer ->
43
- println("[NitroMap] Google Maps initialized with renderer: $renderer")
44
- }
45
-
46
- isInitialized = true
47
- }
48
-
49
- private fun injectGoogleMapsApiKey(context: Context, apiKey: String) {
50
- try {
51
- val appInfo: ApplicationInfo = context.packageManager.getApplicationInfo(
52
- context.packageName,
53
- PackageManager.GET_META_DATA
54
- )
55
- if (appInfo.metaData == null) {
56
- appInfo.metaData = Bundle()
57
- }
58
- appInfo.metaData.putString("com.google.android.geo.API_KEY", apiKey)
59
- println("[NitroMap] Google Maps API key injected successfully")
60
- } catch (e: Exception) {
61
- println("[NitroMap] Failed to inject Google Maps API key: ${e.message}")
62
- }
63
- }
64
-
65
- override fun IsNitroMapInitialized(): Boolean {
66
- return isInitialized
67
- }
68
- }
@@ -1,176 +0,0 @@
1
- package com.margelo.nitro.nitromap
2
-
3
- import android.graphics.Bitmap
4
- import android.util.LruCache
5
- import kotlin.math.roundToInt
6
-
7
- /**
8
- * Singleton cache for marker icon bitmaps using Flyweight pattern. Shares identical bitmaps across
9
- * markers to reduce memory usage.
10
- *
11
- * Memory savings: 10,000 markers × 100KB each = 1GB → ~50MB with caching
12
- */
13
- object MarkerIconCache {
14
-
15
- // Calculate max cache size as 1/8th of available memory, capped at 50MB
16
- private val maxMemory = Runtime.getRuntime().maxMemory() / 1024
17
- private val cacheSize = minOf((maxMemory / 8).toInt(), 50 * 1024) // 50MB max in KB
18
-
19
- // LRU cache for price marker bitmaps
20
- private val priceMarkerCache =
21
- object : LruCache<String, Bitmap>(cacheSize) {
22
- override fun sizeOf(key: String, bitmap: Bitmap): Int {
23
- // Size in KB
24
- return bitmap.byteCount / 1024
25
- }
26
-
27
- override fun entryRemoved(
28
- evicted: Boolean,
29
- key: String,
30
- oldValue: Bitmap,
31
- newValue: Bitmap?
32
- ) {
33
- // Recycle bitmap when evicted to free memory immediately
34
- if (evicted && !oldValue.isRecycled) {
35
- oldValue.recycle()
36
- }
37
- }
38
- }
39
-
40
- // Separate cache for image markers (URL/base64 images)
41
- private val imageMarkerCache =
42
- object : LruCache<String, Bitmap>(cacheSize / 2) {
43
- override fun sizeOf(key: String, bitmap: Bitmap): Int {
44
- return bitmap.byteCount / 1024
45
- }
46
-
47
- override fun entryRemoved(
48
- evicted: Boolean,
49
- key: String,
50
- oldValue: Bitmap,
51
- newValue: Bitmap?
52
- ) {
53
- if (evicted && !oldValue.isRecycled) {
54
- oldValue.recycle()
55
- }
56
- }
57
- }
58
-
59
- // Cache for cluster icons
60
- private val clusterCache =
61
- object : LruCache<String, Bitmap>(10 * 1024) { // 10MB
62
- override fun sizeOf(key: String, bitmap: Bitmap): Int {
63
- return bitmap.byteCount / 1024
64
- }
65
- }
66
-
67
- // Track cache stats for debugging
68
- private var hitCount = 0
69
- private var missCount = 0
70
-
71
- /** Get cached price marker bitmap or null if not cached */
72
- fun getPriceMarker(key: String): Bitmap? {
73
- val cached = priceMarkerCache.get(key)
74
- if (cached != null) {
75
- hitCount++
76
- if (hitCount % 1000 == 0) {
77
- logCacheStats()
78
- }
79
- }
80
- return cached
81
- }
82
-
83
- /** Cache a price marker bitmap */
84
- fun putPriceMarker(key: String, bitmap: Bitmap) {
85
- missCount++
86
- priceMarkerCache.put(key, bitmap)
87
- }
88
-
89
- /** Get cached image marker bitmap or null if not cached */
90
- fun getImageMarker(key: String): Bitmap? {
91
- return imageMarkerCache.get(key)
92
- }
93
-
94
- /** Cache an image marker bitmap */
95
- fun putImageMarker(key: String, bitmap: Bitmap) {
96
- imageMarkerCache.put(key, bitmap)
97
- }
98
-
99
- /** Get cached cluster icon or null if not cached */
100
- fun getClusterIcon(key: String): Bitmap? {
101
- return clusterCache.get(key)
102
- }
103
-
104
- /** Cache a cluster icon bitmap */
105
- fun putClusterIcon(key: String, bitmap: Bitmap) {
106
- clusterCache.put(key, bitmap)
107
- }
108
-
109
- /**
110
- * Generate normalized cache key for price markers. Identical prices share the same cached
111
- * bitmap (Flyweight pattern).
112
- */
113
- fun priceMarkerKey(price: String, currency: String, selected: Boolean): String {
114
- return "price_${price}_${currency}_${selected}"
115
- }
116
-
117
- /**
118
- * Generate normalized cache key for image markers. Rounds dimensions to reduce unique keys
119
- * (more cache hits).
120
- */
121
- fun imageMarkerKey(
122
- source: String,
123
- width: Double,
124
- height: Double,
125
- cornerRadius: Double
126
- ): String {
127
- // Round to nearest 5 to reduce unique textures
128
- val w = ((width / 5).roundToInt() * 5)
129
- val h = ((height / 5).roundToInt() * 5)
130
- val r = ((cornerRadius / 5).roundToInt() * 5)
131
- val sourceHash = source.hashCode()
132
- return "image_${sourceHash}_${w}_${h}_${r}"
133
- }
134
-
135
- /** Generate cache key for cluster icons */
136
- fun clusterKey(count: Int, backgroundColor: Int): String {
137
- // Bucket counts to reduce unique icons
138
- val bucket =
139
- when {
140
- count < 10 -> count
141
- count < 100 -> (count / 10) * 10
142
- count < 1000 -> (count / 100) * 100
143
- else -> (count / 1000) * 1000
144
- }
145
- return "cluster_${bucket}_${backgroundColor}"
146
- }
147
-
148
- /** Clear all caches (call on memory warning) */
149
- fun clear() {
150
- priceMarkerCache.evictAll()
151
- imageMarkerCache.evictAll()
152
- clusterCache.evictAll()
153
- hitCount = 0
154
- missCount = 0
155
- android.util.Log.d("MarkerIconCache", "Cache cleared")
156
- }
157
-
158
- /** Trim caches to specified level (0.0 to 1.0) */
159
- fun trimToLevel(level: Float) {
160
- val targetSize = (cacheSize * level).toInt()
161
- priceMarkerCache.trimToSize(targetSize)
162
- imageMarkerCache.trimToSize(targetSize / 2)
163
- }
164
-
165
- private fun logCacheStats() {
166
- val hitRate =
167
- if (hitCount + missCount > 0) {
168
- (hitCount * 100) / (hitCount + missCount)
169
- } else 0
170
- android.util.Log.d(
171
- "MarkerIconCache",
172
- "Cache stats: hits=$hitCount, misses=$missCount, hitRate=$hitRate%, " +
173
- "priceSize=${priceMarkerCache.size()}KB, imageSize=${imageMarkerCache.size()}KB"
174
- )
175
- }
176
- }