@maydon_tech/react-native-nitro-maps 0.1.4 → 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.
- package/LICENSE +1 -1
- package/NitroMap.podspec +1 -1
- package/README.md +82 -9
- package/android/CMakeLists.txt +4 -1
- package/android/gradle.properties +4 -4
- package/android/src/main/cpp/ClusterEngineJNI.cpp +198 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMap.kt +397 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMapConfig.kt +53 -0
- package/android/src/main/{java → kotlin}/com/margelo/nitro/nitromap/NitroMapPackage.kt +4 -4
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMapView.kt +73 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/UserLocationManager.kt +295 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/ClusterIconRenderer.kt +111 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/ClusteringManager.kt +104 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/NitroClusterEngine.kt +166 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/MarkerIconFactory.kt +303 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/MarkerSelectionHandler.kt +72 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/PriceMarkerRenderer.kt +159 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/MapProviderFactory.kt +24 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/MapProviderInterface.kt +128 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapDelegate.kt +317 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Clustering.kt +524 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Markers.kt +358 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Overlays.kt +272 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+UserLocation.kt +296 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider.kt +815 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/MarkerTagData.kt +19 -0
- package/ios/Location/NitroLocationManager.swift +116 -0
- package/ios/MarkerRenderer/MarkerIconFactory.swift +1 -3
- package/ios/MarkerRenderer/PriceMarkerRenderer.swift +10 -6
- package/ios/NitroMap.swift +279 -13
- package/ios/NitroMapConfig/NitroMapConfig.swift +45 -0
- package/ios/Providers/{GoogleMapDelegate.swift → Google/GoogleMapDelegate.swift} +48 -23
- package/ios/Providers/Google/GoogleMapProvider+Camera.swift +180 -0
- package/ios/Providers/Google/GoogleMapProvider+Clustering.swift +541 -0
- package/ios/Providers/Google/GoogleMapProvider+Markers.swift +270 -0
- package/ios/Providers/Google/GoogleMapProvider+Overlays.swift +245 -0
- package/ios/Providers/Google/GoogleMapProvider+UserLocation.swift +180 -0
- package/ios/Providers/Google/GoogleMapProvider.swift +342 -0
- package/ios/Providers/MapProviderFactory.swift +17 -0
- package/ios/Providers/MapProviderProtocol.swift +48 -1
- package/ios/Shared/ClusterConfig+Factory.swift +2 -2
- package/ios/Shared/MapStyleProvider.swift +6 -4
- package/ios/Shared/MarkerSelectionHandler.swift +4 -1
- package/ios/Utils/ColorValueExtension.swift +46 -67
- package/lib/module/components/ImageMarker.js +39 -29
- package/lib/module/components/ImageMarker.js.map +1 -1
- package/lib/module/components/Marker.js +118 -0
- package/lib/module/components/Marker.js.map +1 -0
- package/lib/module/components/NitroCircle.js +92 -0
- package/lib/module/components/NitroCircle.js.map +1 -0
- package/lib/module/components/NitroMap.js +216 -76
- package/lib/module/components/NitroMap.js.map +1 -1
- package/lib/module/components/NitroPolygon.js +135 -0
- package/lib/module/components/NitroPolygon.js.map +1 -0
- package/lib/module/components/NitroPolyline.js +115 -0
- package/lib/module/components/NitroPolyline.js.map +1 -0
- package/lib/module/components/PriceMarker.js +16 -29
- package/lib/module/components/PriceMarker.js.map +1 -1
- package/lib/module/context/NitroMapContext.js.map +1 -1
- package/lib/module/hooks/useNitroCircle.js +18 -0
- package/lib/module/hooks/useNitroCircle.js.map +1 -0
- package/lib/module/hooks/useNitroMarker.js +26 -9
- package/lib/module/hooks/useNitroMarker.js.map +1 -1
- package/lib/module/hooks/useNitroOverlay.js +59 -0
- package/lib/module/hooks/useNitroOverlay.js.map +1 -0
- package/lib/module/hooks/useNitroPolygon.js +18 -0
- package/lib/module/hooks/useNitroPolygon.js.map +1 -0
- package/lib/module/hooks/useNitroPolyline.js +18 -0
- package/lib/module/hooks/useNitroPolyline.js.map +1 -0
- package/lib/module/index.js +5 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/types/overlay.js +4 -0
- package/lib/module/types/overlay.js.map +1 -0
- package/lib/module/types/theme.js +4 -0
- package/lib/module/types/theme.js.map +1 -0
- package/lib/module/utils/colors.js +41 -13
- package/lib/module/utils/colors.js.map +1 -1
- package/lib/module/utils/validation.js +45 -0
- package/lib/module/utils/validation.js.map +1 -0
- package/lib/typescript/src/components/ImageMarker.d.ts.map +1 -1
- package/lib/typescript/src/components/Marker.d.ts +34 -0
- package/lib/typescript/src/components/Marker.d.ts.map +1 -0
- package/lib/typescript/src/components/NitroCircle.d.ts +70 -0
- package/lib/typescript/src/components/NitroCircle.d.ts.map +1 -0
- package/lib/typescript/src/components/NitroMap.d.ts +60 -3
- package/lib/typescript/src/components/NitroMap.d.ts.map +1 -1
- package/lib/typescript/src/components/NitroPolygon.d.ts +86 -0
- package/lib/typescript/src/components/NitroPolygon.d.ts.map +1 -0
- package/lib/typescript/src/components/NitroPolyline.d.ts +84 -0
- package/lib/typescript/src/components/NitroPolyline.d.ts.map +1 -0
- package/lib/typescript/src/components/PriceMarker.d.ts +0 -5
- package/lib/typescript/src/components/PriceMarker.d.ts.map +1 -1
- package/lib/typescript/src/context/NitroMapContext.d.ts +2 -0
- package/lib/typescript/src/context/NitroMapContext.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useNitroCircle.d.ts +7 -0
- package/lib/typescript/src/hooks/useNitroCircle.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useNitroMarker.d.ts +20 -0
- package/lib/typescript/src/hooks/useNitroMarker.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useNitroOverlay.d.ts +26 -0
- package/lib/typescript/src/hooks/useNitroOverlay.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useNitroPolygon.d.ts +7 -0
- package/lib/typescript/src/hooks/useNitroPolygon.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useNitroPolyline.d.ts +7 -0
- package/lib/typescript/src/hooks/useNitroPolyline.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +15 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/specs/NitroMap.nitro.d.ts +248 -6
- package/lib/typescript/src/specs/NitroMap.nitro.d.ts.map +1 -1
- package/lib/typescript/src/types/map.d.ts +34 -4
- package/lib/typescript/src/types/map.d.ts.map +1 -1
- package/lib/typescript/src/types/marker.d.ts +24 -36
- package/lib/typescript/src/types/marker.d.ts.map +1 -1
- package/lib/typescript/src/types/overlay.d.ts +75 -0
- package/lib/typescript/src/types/overlay.d.ts.map +1 -0
- package/lib/typescript/src/types/theme.d.ts +93 -0
- package/lib/typescript/src/types/theme.d.ts.map +1 -0
- package/lib/typescript/src/utils/colors.d.ts +6 -8
- package/lib/typescript/src/utils/colors.d.ts.map +1 -1
- package/lib/typescript/src/utils/validation.d.ts +12 -0
- package/lib/typescript/src/utils/validation.d.ts.map +1 -0
- package/nitrogen/generated/android/c++/JCircleData.hpp +94 -0
- package/nitrogen/generated/android/c++/JClusterConfig.hpp +5 -7
- package/nitrogen/generated/android/c++/JFunc_void_UserLocationChangeEvent.hpp +79 -0
- package/nitrogen/generated/android/c++/JFunc_void_UserTrackingMode.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +76 -0
- package/nitrogen/generated/android/c++/JHybridNitroMapSpec.cpp +328 -21
- package/nitrogen/generated/android/c++/JHybridNitroMapSpec.hpp +53 -2
- package/nitrogen/generated/android/c++/JMarkerAnimation.hpp +3 -6
- package/nitrogen/generated/android/c++/JMarkerData.hpp +15 -3
- package/nitrogen/generated/android/c++/JPolygonData.hpp +149 -0
- package/nitrogen/generated/android/c++/JPolylineData.hpp +113 -0
- package/nitrogen/generated/android/c++/JUserLocationChangeEvent.hpp +70 -0
- package/nitrogen/generated/android/c++/JUserTrackingMode.hpp +62 -0
- package/nitrogen/generated/android/c++/views/JHybridNitroMapStateUpdater.cpp +72 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/CircleData.kt +62 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ClusterConfig.kt +4 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_UserLocationChangeEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_UserTrackingMode.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_std__string.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/HybridNitroMapSpec.kt +228 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerAnimation.kt +1 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerData.kt +12 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/PolygonData.kt +62 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/PolylineData.kt +62 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/UserLocationChangeEvent.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/{ClusterAnimationStyle.kt → UserTrackingMode.kt} +6 -8
- package/nitrogen/generated/android/nitromapOnLoad.cpp +6 -0
- package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Bridge.cpp +24 -0
- package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Bridge.hpp +175 -17
- package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Umbrella.hpp +15 -3
- package/nitrogen/generated/ios/c++/HybridNitroMapSpecSwift.hpp +249 -16
- package/nitrogen/generated/ios/c++/views/HybridNitroMapComponent.mm +90 -5
- package/nitrogen/generated/ios/swift/CircleData.swift +143 -0
- package/nitrogen/generated/ios/swift/ClusterConfig.swift +22 -15
- package/nitrogen/generated/ios/swift/Func_void_UserLocationChangeEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_UserTrackingMode.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
- package/nitrogen/generated/ios/swift/HybridNitroMapSpec.swift +35 -1
- package/nitrogen/generated/ios/swift/HybridNitroMapSpec_cxx.swift +582 -8
- package/nitrogen/generated/ios/swift/MarkerAnimation.swift +4 -8
- package/nitrogen/generated/ios/swift/MarkerData.swift +54 -2
- package/nitrogen/generated/ios/swift/PolygonData.swift +179 -0
- package/nitrogen/generated/ios/swift/PolylineData.swift +155 -0
- package/nitrogen/generated/ios/swift/UserLocationChangeEvent.swift +69 -0
- package/nitrogen/generated/ios/swift/UserTrackingMode.swift +44 -0
- package/nitrogen/generated/shared/c++/CircleData.hpp +113 -0
- package/nitrogen/generated/shared/c++/ClusterConfig.hpp +5 -8
- package/nitrogen/generated/shared/c++/HybridNitroMapSpec.cpp +53 -2
- package/nitrogen/generated/shared/c++/HybridNitroMapSpec.hpp +75 -6
- package/nitrogen/generated/shared/c++/MarkerAnimation.hpp +4 -8
- package/nitrogen/generated/shared/c++/MarkerData.hpp +14 -2
- package/nitrogen/generated/shared/c++/PolygonData.hpp +114 -0
- package/nitrogen/generated/shared/c++/PolylineData.hpp +114 -0
- package/nitrogen/generated/shared/c++/UserLocationChangeEvent.hpp +88 -0
- package/nitrogen/generated/shared/c++/UserTrackingMode.hpp +80 -0
- package/nitrogen/generated/shared/c++/views/HybridNitroMapComponent.cpp +216 -12
- package/nitrogen/generated/shared/c++/views/HybridNitroMapComponent.hpp +23 -1
- package/nitrogen/generated/shared/json/NitroMapConfig.json +18 -1
- package/package.json +36 -5
- package/src/components/ImageMarker.tsx +58 -42
- package/src/components/Marker.tsx +161 -0
- package/src/components/NitroCircle.tsx +183 -0
- package/src/components/NitroMap.tsx +328 -78
- package/src/components/NitroPolygon.tsx +229 -0
- package/src/components/NitroPolyline.tsx +208 -0
- package/src/components/PriceMarker.tsx +23 -48
- package/src/context/NitroMapContext.tsx +4 -0
- package/src/hooks/useNitroCircle.ts +25 -0
- package/src/hooks/useNitroMarker.ts +49 -10
- package/src/hooks/useNitroOverlay.ts +68 -0
- package/src/hooks/useNitroPolygon.ts +25 -0
- package/src/hooks/useNitroPolyline.ts +25 -0
- package/src/index.tsx +23 -2
- package/src/specs/NitroMap.nitro.ts +294 -5
- package/src/types/map.ts +36 -4
- package/src/types/marker.ts +24 -44
- package/src/types/overlay.ts +77 -0
- package/src/types/theme.ts +101 -0
- package/src/utils/colors.ts +48 -16
- package/src/utils/validation.ts +69 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/ClusterIconGenerator.kt +0 -108
- package/android/src/main/java/com/margelo/nitro/nitromap/ColorUtils.kt +0 -63
- package/android/src/main/java/com/margelo/nitro/nitromap/HybridNitroMap.kt +0 -408
- package/android/src/main/java/com/margelo/nitro/nitromap/HybridNitroMapConfig.kt +0 -68
- package/android/src/main/java/com/margelo/nitro/nitromap/MarkerIconCache.kt +0 -176
- package/android/src/main/java/com/margelo/nitro/nitromap/MarkerIconFactory.kt +0 -252
- package/android/src/main/java/com/margelo/nitro/nitromap/clustering/NitroClusterEngine.kt +0 -252
- package/android/src/main/java/com/margelo/nitro/nitromap/clustering/QuadTree.kt +0 -195
- package/android/src/main/java/com/margelo/nitro/nitromap/providers/GoogleMapProvider.kt +0 -912
- package/android/src/main/java/com/margelo/nitro/nitromap/providers/MapProviderInterface.kt +0 -70
- package/cpp/QuadTree.hpp +0 -246
- package/ios/NitroMapConfig/HybridNitroMapConfig.swift +0 -33
- package/ios/Providers/GoogleMapProvider+Camera.swift +0 -164
- package/ios/Providers/GoogleMapProvider.swift +0 -924
- package/nitrogen/generated/android/c++/JClusterAnimationStyle.hpp +0 -68
- package/nitrogen/generated/ios/swift/ClusterAnimationStyle.swift +0 -52
- 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
|
-
}
|