@maydon_tech/react-native-nitro-maps 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/NitroMap.podspec +42 -0
- package/README.md +172 -0
- package/android/CMakeLists.txt +27 -0
- package/android/build.gradle +141 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/cpp/cpp-adapter.cpp +6 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/ClusterIconGenerator.kt +108 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/ColorUtils.kt +63 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/HybridNitroMap.kt +408 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/HybridNitroMapConfig.kt +68 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/MarkerIconCache.kt +176 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/MarkerIconFactory.kt +252 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/NitroMapPackage.kt +33 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/clustering/NitroClusterEngine.kt +252 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/clustering/QuadTree.kt +195 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/providers/GoogleMapProvider.kt +912 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/providers/MapProviderInterface.kt +70 -0
- package/cpp/ClusterEngine.hpp +411 -0
- package/cpp/KDBush.hpp +238 -0
- package/cpp/QuadTree.hpp +246 -0
- package/ios/Clustering/ClusterEngineWrapper.h +58 -0
- package/ios/Clustering/ClusterEngineWrapper.mm +142 -0
- package/ios/Clustering/ClusterIconRenderer.swift +80 -0
- package/ios/Clustering/NitroClusterEngine.swift +117 -0
- package/ios/Clustering/NitroClusterIconGenerator.swift +35 -0
- package/ios/MarkerRenderer/MarkerIconFactory.swift +322 -0
- package/ios/MarkerRenderer/PriceMarkerRenderer.swift +140 -0
- package/ios/NitroMap.swift +332 -0
- package/ios/NitroMapConfig/HybridNitroMapConfig.swift +33 -0
- package/ios/Providers/GoogleMapDelegate.swift +310 -0
- package/ios/Providers/GoogleMapProvider+Camera.swift +164 -0
- package/ios/Providers/GoogleMapProvider.swift +924 -0
- package/ios/Providers/MapProviderProtocol.swift +78 -0
- package/ios/Shared/ClusterConfig+Factory.swift +58 -0
- package/ios/Shared/ClusteringManager.swift +211 -0
- package/ios/Shared/MapStyleProvider.swift +135 -0
- package/ios/Shared/MarkerSelectionHandler.swift +116 -0
- package/ios/Utils/ColorValueExtension.swift +54 -0
- package/lib/module/components/ImageMarker.js +146 -0
- package/lib/module/components/ImageMarker.js.map +1 -0
- package/lib/module/components/NitroMap.js +320 -0
- package/lib/module/components/NitroMap.js.map +1 -0
- package/lib/module/components/PriceMarker.js +165 -0
- package/lib/module/components/PriceMarker.js.map +1 -0
- package/lib/module/context/NitroMapContext.js +15 -0
- package/lib/module/context/NitroMapContext.js.map +1 -0
- package/lib/module/hooks/useNitroMarker.js +104 -0
- package/lib/module/hooks/useNitroMarker.js.map +1 -0
- package/lib/module/index.js +21 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/modules/index.js +4 -0
- package/lib/module/modules/index.js.map +1 -0
- package/lib/module/modules/module.js +30 -0
- package/lib/module/modules/module.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/specs/NitroMap.nitro.js +4 -0
- package/lib/module/specs/NitroMap.nitro.js.map +1 -0
- package/lib/module/specs/NitroMapConfig.nitro.js +4 -0
- package/lib/module/specs/NitroMapConfig.nitro.js.map +1 -0
- package/lib/module/types/map.js +2 -0
- package/lib/module/types/map.js.map +1 -0
- package/lib/module/types/marker.js +4 -0
- package/lib/module/types/marker.js.map +1 -0
- package/lib/module/utils/colors.js +147 -0
- package/lib/module/utils/colors.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/components/ImageMarker.d.ts +70 -0
- package/lib/typescript/src/components/ImageMarker.d.ts.map +1 -0
- package/lib/typescript/src/components/NitroMap.d.ts +14 -0
- package/lib/typescript/src/components/NitroMap.d.ts.map +1 -0
- package/lib/typescript/src/components/PriceMarker.d.ts +88 -0
- package/lib/typescript/src/components/PriceMarker.d.ts.map +1 -0
- package/lib/typescript/src/context/NitroMapContext.d.ts +16 -0
- package/lib/typescript/src/context/NitroMapContext.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useNitroMarker.d.ts +78 -0
- package/lib/typescript/src/hooks/useNitroMarker.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +12 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/modules/index.d.ts +2 -0
- package/lib/typescript/src/modules/index.d.ts.map +1 -0
- package/lib/typescript/src/modules/module.d.ts +22 -0
- package/lib/typescript/src/modules/module.d.ts.map +1 -0
- package/lib/typescript/src/specs/NitroMap.nitro.d.ts +227 -0
- package/lib/typescript/src/specs/NitroMap.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/NitroMapConfig.nitro.d.ts +10 -0
- package/lib/typescript/src/specs/NitroMapConfig.nitro.d.ts.map +1 -0
- package/lib/typescript/src/types/map.d.ts +154 -0
- package/lib/typescript/src/types/map.d.ts.map +1 -0
- package/lib/typescript/src/types/marker.d.ts +248 -0
- package/lib/typescript/src/types/marker.d.ts.map +1 -0
- package/lib/typescript/src/utils/colors.d.ts +82 -0
- package/lib/typescript/src/utils/colors.d.ts.map +1 -0
- package/nitro.json +21 -0
- package/nitrogen/generated/android/c++/JCamera.hpp +74 -0
- package/nitrogen/generated/android/c++/JClusterAnimationStyle.hpp +68 -0
- package/nitrogen/generated/android/c++/JClusterConfig.hpp +121 -0
- package/nitrogen/generated/android/c++/JClusterPressEvent.hpp +86 -0
- package/nitrogen/generated/android/c++/JClusterStrategy.hpp +59 -0
- package/nitrogen/generated/android/c++/JColorValue.cpp +26 -0
- package/nitrogen/generated/android/c++/JColorValue.hpp +70 -0
- package/nitrogen/generated/android/c++/JCoordinate.hpp +61 -0
- package/nitrogen/generated/android/c++/JEdgePadding.hpp +69 -0
- package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_ClusterPressEvent.hpp +81 -0
- package/nitrogen/generated/android/c++/JFunc_void_MapError.hpp +78 -0
- package/nitrogen/generated/android/c++/JFunc_void_MapPressEvent.hpp +81 -0
- package/nitrogen/generated/android/c++/JFunc_void_MarkerDragEvent.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_MarkerPressEvent.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_RegionChangeEvent.hpp +79 -0
- package/nitrogen/generated/android/c++/JHybridNitroMapConfigSpec.cpp +59 -0
- package/nitrogen/generated/android/c++/JHybridNitroMapConfigSpec.hpp +66 -0
- package/nitrogen/generated/android/c++/JHybridNitroMapSpec.cpp +593 -0
- package/nitrogen/generated/android/c++/JHybridNitroMapSpec.hpp +125 -0
- package/nitrogen/generated/android/c++/JImageMarkerConfig.hpp +86 -0
- package/nitrogen/generated/android/c++/JMapBoundaries.hpp +62 -0
- package/nitrogen/generated/android/c++/JMapError.hpp +61 -0
- package/nitrogen/generated/android/c++/JMapPressEvent.hpp +64 -0
- package/nitrogen/generated/android/c++/JMapProvider.hpp +62 -0
- package/nitrogen/generated/android/c++/JMapStyleElement.hpp +87 -0
- package/nitrogen/generated/android/c++/JMapStyler.hpp +78 -0
- package/nitrogen/generated/android/c++/JMapType.hpp +62 -0
- package/nitrogen/generated/android/c++/JMarkerAnimation.hpp +62 -0
- package/nitrogen/generated/android/c++/JMarkerColor.hpp +69 -0
- package/nitrogen/generated/android/c++/JMarkerConfig.hpp +77 -0
- package/nitrogen/generated/android/c++/JMarkerData.hpp +121 -0
- package/nitrogen/generated/android/c++/JMarkerDragEvent.hpp +63 -0
- package/nitrogen/generated/android/c++/JMarkerPressEvent.hpp +63 -0
- package/nitrogen/generated/android/c++/JMarkerStyle.hpp +62 -0
- package/nitrogen/generated/android/c++/JPoint.hpp +61 -0
- package/nitrogen/generated/android/c++/JPriceMarkerStyle.hpp +102 -0
- package/nitrogen/generated/android/c++/JRegion.hpp +69 -0
- package/nitrogen/generated/android/c++/JRegionChangeEvent.hpp +62 -0
- package/nitrogen/generated/android/c++/JVariant_String_MarkerColor.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_String_MarkerColor.hpp +70 -0
- package/nitrogen/generated/android/c++/views/JHybridNitroMapStateUpdater.cpp +144 -0
- package/nitrogen/generated/android/c++/views/JHybridNitroMapStateUpdater.hpp +49 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Camera.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ClusterAnimationStyle.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ClusterConfig.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ClusterPressEvent.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ClusterStrategy.kt +21 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ColorValue.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Coordinate.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/EdgePadding.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_ClusterPressEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_MapError.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_MapPressEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_MarkerDragEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_MarkerPressEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_RegionChangeEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/HybridNitroMapConfigSpec.kt +61 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/HybridNitroMapSpec.kt +342 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ImageMarkerConfig.kt +56 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MapBoundaries.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MapError.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MapPressEvent.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MapProvider.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MapStyleElement.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MapStyler.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MapType.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerAnimation.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerColor.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerConfig.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerData.kt +71 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerDragEvent.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerPressEvent.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerStyle.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Point.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/PriceMarkerStyle.kt +68 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Region.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/RegionChangeEvent.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Variant_String_MarkerColor.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/nitromapOnLoad.kt +35 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/views/HybridNitroMapManager.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/views/HybridNitroMapStateUpdater.kt +23 -0
- package/nitrogen/generated/android/nitromap+autolinking.cmake +87 -0
- package/nitrogen/generated/android/nitromap+autolinking.gradle +27 -0
- package/nitrogen/generated/android/nitromapOnLoad.cpp +70 -0
- package/nitrogen/generated/android/nitromapOnLoad.hpp +25 -0
- package/nitrogen/generated/ios/NitroMap+autolinking.rb +60 -0
- package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Bridge.cpp +130 -0
- package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Bridge.hpp +793 -0
- package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Umbrella.hpp +132 -0
- package/nitrogen/generated/ios/NitroMapAutolinking.mm +41 -0
- package/nitrogen/generated/ios/NitroMapAutolinking.swift +40 -0
- package/nitrogen/generated/ios/c++/HybridNitroMapConfigSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridNitroMapConfigSpecSwift.hpp +84 -0
- package/nitrogen/generated/ios/c++/HybridNitroMapSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridNitroMapSpecSwift.hpp +410 -0
- package/nitrogen/generated/ios/c++/views/HybridNitroMapComponent.mm +206 -0
- package/nitrogen/generated/ios/swift/Camera.swift +80 -0
- package/nitrogen/generated/ios/swift/ClusterAnimationStyle.swift +52 -0
- package/nitrogen/generated/ios/swift/ClusterConfig.swift +268 -0
- package/nitrogen/generated/ios/swift/ClusterPressEvent.swift +70 -0
- package/nitrogen/generated/ios/swift/ClusterStrategy.swift +40 -0
- package/nitrogen/generated/ios/swift/ColorValue.swift +18 -0
- package/nitrogen/generated/ios/swift/Coordinate.swift +47 -0
- package/nitrogen/generated/ios/swift/EdgePadding.swift +69 -0
- package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_Camera.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_ClusterPressEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_MapBoundaries.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_MapError.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_MapPressEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_MarkerDragEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_MarkerPressEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_RegionChangeEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +47 -0
- package/nitrogen/generated/ios/swift/HybridNitroMapConfigSpec.swift +57 -0
- package/nitrogen/generated/ios/swift/HybridNitroMapConfigSpec_cxx.swift +142 -0
- package/nitrogen/generated/ios/swift/HybridNitroMapSpec.swift +93 -0
- package/nitrogen/generated/ios/swift/HybridNitroMapSpec_cxx.swift +953 -0
- package/nitrogen/generated/ios/swift/ImageMarkerConfig.swift +166 -0
- package/nitrogen/generated/ios/swift/MapBoundaries.swift +47 -0
- package/nitrogen/generated/ios/swift/MapError.swift +47 -0
- package/nitrogen/generated/ios/swift/MapPressEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/MapProvider.swift +44 -0
- package/nitrogen/generated/ios/swift/MapStyleElement.swift +108 -0
- package/nitrogen/generated/ios/swift/MapStyler.swift +177 -0
- package/nitrogen/generated/ios/swift/MapType.swift +44 -0
- package/nitrogen/generated/ios/swift/MarkerAnimation.swift +44 -0
- package/nitrogen/generated/ios/swift/MarkerColor.swift +69 -0
- package/nitrogen/generated/ios/swift/MarkerConfig.swift +82 -0
- package/nitrogen/generated/ios/swift/MarkerData.swift +195 -0
- package/nitrogen/generated/ios/swift/MarkerDragEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/MarkerPressEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/MarkerStyle.swift +44 -0
- package/nitrogen/generated/ios/swift/Point.swift +47 -0
- package/nitrogen/generated/ios/swift/PriceMarkerStyle.swift +374 -0
- package/nitrogen/generated/ios/swift/Region.swift +69 -0
- package/nitrogen/generated/ios/swift/RegionChangeEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Variant_String_MarkerColor.swift +18 -0
- package/nitrogen/generated/shared/c++/Camera.hpp +92 -0
- package/nitrogen/generated/shared/c++/ClusterAnimationStyle.hpp +88 -0
- package/nitrogen/generated/shared/c++/ClusterConfig.hpp +140 -0
- package/nitrogen/generated/shared/c++/ClusterPressEvent.hpp +86 -0
- package/nitrogen/generated/shared/c++/ClusterStrategy.hpp +76 -0
- package/nitrogen/generated/shared/c++/Coordinate.hpp +79 -0
- package/nitrogen/generated/shared/c++/EdgePadding.hpp +87 -0
- package/nitrogen/generated/shared/c++/HybridNitroMapConfigSpec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridNitroMapConfigSpec.hpp +65 -0
- package/nitrogen/generated/shared/c++/HybridNitroMapSpec.cpp +82 -0
- package/nitrogen/generated/shared/c++/HybridNitroMapSpec.hpp +173 -0
- package/nitrogen/generated/shared/c++/ImageMarkerConfig.hpp +103 -0
- package/nitrogen/generated/shared/c++/MapBoundaries.hpp +80 -0
- package/nitrogen/generated/shared/c++/MapError.hpp +79 -0
- package/nitrogen/generated/shared/c++/MapPressEvent.hpp +83 -0
- package/nitrogen/generated/shared/c++/MapProvider.hpp +80 -0
- package/nitrogen/generated/shared/c++/MapStyleElement.hpp +87 -0
- package/nitrogen/generated/shared/c++/MapStyler.hpp +96 -0
- package/nitrogen/generated/shared/c++/MapType.hpp +80 -0
- package/nitrogen/generated/shared/c++/MarkerAnimation.hpp +80 -0
- package/nitrogen/generated/shared/c++/MarkerColor.hpp +87 -0
- package/nitrogen/generated/shared/c++/MarkerConfig.hpp +91 -0
- package/nitrogen/generated/shared/c++/MarkerData.hpp +131 -0
- package/nitrogen/generated/shared/c++/MarkerDragEvent.hpp +81 -0
- package/nitrogen/generated/shared/c++/MarkerPressEvent.hpp +81 -0
- package/nitrogen/generated/shared/c++/MarkerStyle.hpp +80 -0
- package/nitrogen/generated/shared/c++/Point.hpp +79 -0
- package/nitrogen/generated/shared/c++/PriceMarkerStyle.hpp +119 -0
- package/nitrogen/generated/shared/c++/Region.hpp +87 -0
- package/nitrogen/generated/shared/c++/RegionChangeEvent.hpp +80 -0
- package/nitrogen/generated/shared/c++/views/HybridNitroMapComponent.cpp +351 -0
- package/nitrogen/generated/shared/c++/views/HybridNitroMapComponent.hpp +141 -0
- package/nitrogen/generated/shared/json/NitroMapConfig.json +32 -0
- package/package.json +176 -0
- package/react-native.config.js +16 -0
- package/src/components/ImageMarker.tsx +254 -0
- package/src/components/NitroMap.tsx +433 -0
- package/src/components/PriceMarker.tsx +311 -0
- package/src/context/NitroMapContext.tsx +33 -0
- package/src/hooks/useNitroMarker.ts +198 -0
- package/src/index.tsx +62 -0
- package/src/modules/index.ts +6 -0
- package/src/modules/module.ts +45 -0
- package/src/specs/NitroMap.nitro.ts +292 -0
- package/src/specs/NitroMapConfig.nitro.ts +8 -0
- package/src/types/map.ts +166 -0
- package/src/types/marker.ts +267 -0
- package/src/utils/colors.ts +159 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 alisher rakhimov
|
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
in the Software without restriction, including without limitation the rights
|
|
7
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
furnished to do so, subject to the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be included in all
|
|
12
|
+
copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
SOFTWARE.
|
package/NitroMap.podspec
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require "json"
|
|
2
|
+
|
|
3
|
+
package = JSON.parse(File.read(File.join(__dir__, "package.json")))
|
|
4
|
+
|
|
5
|
+
Pod::Spec.new do |s|
|
|
6
|
+
s.name = "NitroMap"
|
|
7
|
+
s.version = package["version"]
|
|
8
|
+
s.summary = package["description"]
|
|
9
|
+
s.homepage = package["homepage"]
|
|
10
|
+
s.license = package["license"]
|
|
11
|
+
s.authors = package["author"]
|
|
12
|
+
|
|
13
|
+
s.platforms = { :ios => '16.0' }
|
|
14
|
+
s.source = { :git => "https://github.com/maydongroup/react-native-nitro-maps.git", :tag => "#{s.version}" }
|
|
15
|
+
|
|
16
|
+
s.source_files = [
|
|
17
|
+
"ios/**/*.{swift,h,m,mm}",
|
|
18
|
+
"cpp/**/*.{h,hpp,cpp}",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
# C++ settings for ClusterEngine
|
|
22
|
+
s.pod_target_xcconfig = {
|
|
23
|
+
'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17',
|
|
24
|
+
'CLANG_CXX_LIBRARY' => 'libc++',
|
|
25
|
+
'HEADER_SEARCH_PATHS' => '"${PODS_TARGET_SRCROOT}/cpp"',
|
|
26
|
+
'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited)'
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
# Expose Objective-C++ wrapper header for Swift
|
|
30
|
+
s.public_header_files = [
|
|
31
|
+
"ios/Clustering/ClusterEngineWrapper.h"
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
s.dependency 'React-jsi'
|
|
35
|
+
s.dependency 'React-callinvoker'
|
|
36
|
+
s.dependency 'GoogleMaps', '~> 10.7.0'
|
|
37
|
+
s.dependency 'Google-Maps-iOS-Utils', '~> 6.1.3'
|
|
38
|
+
load 'nitrogen/generated/ios/NitroMap+autolinking.rb'
|
|
39
|
+
add_nitrogen_files(s)
|
|
40
|
+
|
|
41
|
+
install_modules_dependencies(s)
|
|
42
|
+
end
|
package/README.md
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<h1 align="center">@maydon_tech/react-native-nitro-maps</h1>
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<b>High-performance multi-provider maps for React Native</b><br/>
|
|
7
|
+
Built on <a href="https://nitro.margelo.com/">Nitro Modules</a> — C++ JSI, zero bridge overhead
|
|
8
|
+
</p>
|
|
9
|
+
|
|
10
|
+
<p align="center">
|
|
11
|
+
<a href="https://www.npmjs.com/package/@maydon_tech/react-native-nitro-maps"><img src="https://img.shields.io/npm/v/@maydon_tech/react-native-nitro-maps?color=0a7fca&label=npm" alt="npm version" /></a>
|
|
12
|
+
<a href="https://github.com/maydongroup/react-native-nitro-maps/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/@maydon_tech/react-native-nitro-maps?color=41b883" alt="license" /></a>
|
|
13
|
+
<img src="https://img.shields.io/badge/platforms-iOS%20%7C%20Android-lightgrey" alt="platforms" />
|
|
14
|
+
<img src="https://img.shields.io/badge/architecture-New%20Architecture-blue" alt="new architecture" />
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Why This Library?
|
|
20
|
+
|
|
21
|
+
Most React Native map libraries were built on the old Bridge. We built ours on **C++ JSI** — native calls with zero serialization.
|
|
22
|
+
|
|
23
|
+
| | react-native-maps | @rnmapbox | **nitro-maps** |
|
|
24
|
+
|----------------------|-------------------|-----------|-----------------------------|
|
|
25
|
+
| **Architecture** | Old Bridge | JS-heavy | **C++ JSI (Nitro Modules)** |
|
|
26
|
+
| **Clustering** | JS thread (slow) | JS thread | **C++ Supercluster engine** |
|
|
27
|
+
| **Marker rendering** | React views | Mixed | **Native bitmaps** |
|
|
28
|
+
| **Vendors** | Google, Apple | Mapbox | **Google, Apple, Yandex** |
|
|
29
|
+
| **30K markers** | ❌ Freezes | ⚠️ Slow | **✅ < 40ms** |
|
|
30
|
+
|
|
31
|
+
## Highlights
|
|
32
|
+
|
|
33
|
+
- 🚀 **C++ JSI** — Nitro Modules bridge, zero serialization overhead
|
|
34
|
+
- 🗺️ **Multi-vendor** — Google Maps · Apple MapKit · Yandex MapKit, one unified API
|
|
35
|
+
- 📍 **C++ clustering** — Supercluster + KDBush handles 30,000+ markers
|
|
36
|
+
- 💰 **Native markers** — Price pills, images rendered as bitmaps — no React views
|
|
37
|
+
- ⚡ **Live clustering** — Real-time cluster updates during pan/zoom gestures
|
|
38
|
+
- 🌙 **Dark mode** — Built-in dark theme support across all vendors
|
|
39
|
+
- 📱 **New Architecture** — Fabric-ready, TurboModules compatible
|
|
40
|
+
|
|
41
|
+
## Quick Start
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npm install @maydon_tech/react-native-nitro-maps react-native-nitro-modules
|
|
45
|
+
cd ios && pod install
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
import {
|
|
50
|
+
NitroMap,
|
|
51
|
+
NitroMapInitialize,
|
|
52
|
+
PriceMarker,
|
|
53
|
+
} from '@maydon_tech/react-native-nitro-maps';
|
|
54
|
+
|
|
55
|
+
// Initialize once at app startup
|
|
56
|
+
NitroMapInitialize('YOUR_API_KEY', 'google');
|
|
57
|
+
|
|
58
|
+
export default function App() {
|
|
59
|
+
return (
|
|
60
|
+
<NitroMap
|
|
61
|
+
provider="google"
|
|
62
|
+
initialRegion={{
|
|
63
|
+
latitude: 41.2995,
|
|
64
|
+
longitude: 69.2401,
|
|
65
|
+
latitudeDelta: 0.05,
|
|
66
|
+
longitudeDelta: 0.05,
|
|
67
|
+
}}
|
|
68
|
+
clusterConfig={{
|
|
69
|
+
enabled: true,
|
|
70
|
+
strategy: 'supercluster',
|
|
71
|
+
radius: 80,
|
|
72
|
+
}}
|
|
73
|
+
>
|
|
74
|
+
<PriceMarker
|
|
75
|
+
coordinate={{ latitude: 41.2995, longitude: 69.2401 }}
|
|
76
|
+
price="150K"
|
|
77
|
+
currency="UZS"
|
|
78
|
+
/>
|
|
79
|
+
</NitroMap>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Providers
|
|
85
|
+
|
|
86
|
+
| Provider | iOS | Android | API Key | Notes |
|
|
87
|
+
|-----------------|-----|---------|----------|------------------------|
|
|
88
|
+
| **Google Maps** | ✅ | 🔜 | Required | Best global coverage |
|
|
89
|
+
| **Apple Maps** | 🔜 | — | Free | iOS only, zero SDK |
|
|
90
|
+
| **Yandex Maps** | 🔜 | 🔜 | Required | Best for CIS countries |
|
|
91
|
+
|
|
92
|
+
> ✅ Implemented · 🔜 Planned · — Not applicable
|
|
93
|
+
|
|
94
|
+
## Clustering
|
|
95
|
+
|
|
96
|
+
Two strategies, powered by a shared C++ engine:
|
|
97
|
+
|
|
98
|
+
**`supercluster`** — Groups nearby markers. Overlaps acceptable.
|
|
99
|
+
Best for general-purpose maps.
|
|
100
|
+
|
|
101
|
+
**`hideOnOverlap`** — Same grouping, but hides lower-priority overlapping items.
|
|
102
|
+
Every visible marker sits at its real geographic position.
|
|
103
|
+
Best for real estate, hospitality — what Zillow and Airbnb use.
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
<NitroMap
|
|
107
|
+
clusterConfig={{
|
|
108
|
+
enabled: true,
|
|
109
|
+
strategy: 'hideOnOverlap',
|
|
110
|
+
radius: 80,
|
|
111
|
+
realtimeClustering: true, // live updates during gestures
|
|
112
|
+
renderBuffer: 0.5, // pre-compute 50% beyond viewport
|
|
113
|
+
throttleInterval: 200, // balance perf vs smoothness
|
|
114
|
+
}}
|
|
115
|
+
>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
| Markers | Clustering Time |
|
|
119
|
+
|---------|-----------------|
|
|
120
|
+
| 100 | < 1ms |
|
|
121
|
+
| 1,000 | ~ 2ms |
|
|
122
|
+
| 10,000 | ~ 15ms |
|
|
123
|
+
| 30,000 | ~ 40ms |
|
|
124
|
+
|
|
125
|
+
<sub>Measured on iPhone 12, including spatial index build + cluster query.</sub>
|
|
126
|
+
|
|
127
|
+
## Documentation
|
|
128
|
+
|
|
129
|
+
| Guide | Description |
|
|
130
|
+
|---|---|
|
|
131
|
+
| [**Setup & Installation**](docs/setup.md) | Per-vendor setup for iOS and Android |
|
|
132
|
+
| [**API Reference**](docs/api.md) | Components, props, methods, types, events |
|
|
133
|
+
| [**Clustering**](docs/clustering.md) | Strategies, live clustering, render buffer, performance |
|
|
134
|
+
| [**Feature Support**](docs/features.md) | What's available on each provider |
|
|
135
|
+
| [**Examples**](docs/examples.md) | Selection, dragging, clustering, overlays |
|
|
136
|
+
| [**Migration**](docs/migration.md) | Breaking changes between versions |
|
|
137
|
+
|
|
138
|
+
## Architecture
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
React Native (JS)
|
|
142
|
+
│
|
|
143
|
+
▼
|
|
144
|
+
┌─────────────┐
|
|
145
|
+
│ NitroMap │ ← React component
|
|
146
|
+
│ PriceMarker │ ← Declarative children
|
|
147
|
+
│ ImageMarker │
|
|
148
|
+
└──────┬──────┘
|
|
149
|
+
│ C++ JSI (zero-copy)
|
|
150
|
+
▼
|
|
151
|
+
┌──────────────────┐
|
|
152
|
+
│ Nitro Modules │ ← C++ bridge layer
|
|
153
|
+
│ HybridObject │
|
|
154
|
+
└──────┬───────────┘
|
|
155
|
+
│
|
|
156
|
+
┌────┴─────┬──────────────┐
|
|
157
|
+
▼ ▼ ▼
|
|
158
|
+
Google Apple Yandex
|
|
159
|
+
Provider Provider Provider
|
|
160
|
+
(Swift) (Swift) (Swift)
|
|
161
|
+
│ │ │
|
|
162
|
+
▼ ▼ ▼
|
|
163
|
+
GMSMapView MKMapView YMKMapView
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Contributing
|
|
167
|
+
|
|
168
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup.
|
|
169
|
+
|
|
170
|
+
## License
|
|
171
|
+
|
|
172
|
+
[MIT](LICENSE) · Made by [Maydon Tech](https://github.com/maydongroup)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
project(nitromap)
|
|
2
|
+
cmake_minimum_required(VERSION 3.9.0)
|
|
3
|
+
|
|
4
|
+
set(PACKAGE_NAME nitromap)
|
|
5
|
+
set(CMAKE_VERBOSE_MAKEFILE ON)
|
|
6
|
+
set(CMAKE_CXX_STANDARD 20)
|
|
7
|
+
|
|
8
|
+
# Enable 16KB page alignment for Android 15+ devices
|
|
9
|
+
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=16384")
|
|
10
|
+
|
|
11
|
+
# Define C++ library and add all sources
|
|
12
|
+
add_library(${PACKAGE_NAME} SHARED src/main/cpp/cpp-adapter.cpp)
|
|
13
|
+
|
|
14
|
+
# Add Nitrogen specs :)
|
|
15
|
+
include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/nitromap+autolinking.cmake)
|
|
16
|
+
|
|
17
|
+
# Set up local includes
|
|
18
|
+
include_directories("src/main/cpp" "../cpp")
|
|
19
|
+
|
|
20
|
+
find_library(LOG_LIB log)
|
|
21
|
+
|
|
22
|
+
# Link all libraries together
|
|
23
|
+
target_link_libraries(
|
|
24
|
+
${PACKAGE_NAME}
|
|
25
|
+
${LOG_LIB}
|
|
26
|
+
android # <-- Android core
|
|
27
|
+
)
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
buildscript {
|
|
2
|
+
ext.getExtOrDefault = {name ->
|
|
3
|
+
return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties['NitroMap_' + name]
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
repositories {
|
|
7
|
+
google()
|
|
8
|
+
mavenCentral()
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
dependencies {
|
|
12
|
+
classpath "com.android.tools.build:gradle:8.7.2"
|
|
13
|
+
// noinspection DifferentKotlinGradleVersion
|
|
14
|
+
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${getExtOrDefault('kotlinVersion')}"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
def reactNativeArchitectures() {
|
|
19
|
+
def value = rootProject.getProperties().get("reactNativeArchitectures")
|
|
20
|
+
return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
apply plugin: "com.android.library"
|
|
24
|
+
apply plugin: "kotlin-android"
|
|
25
|
+
apply from: '../nitrogen/generated/android/nitromap+autolinking.gradle'
|
|
26
|
+
|
|
27
|
+
if (rootProject.hasProperty('react')) {
|
|
28
|
+
apply plugin: "com.facebook.react"
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
def getExtOrIntegerDefault(name) {
|
|
32
|
+
if (rootProject.ext.has(name)) {
|
|
33
|
+
return rootProject.ext.get(name)
|
|
34
|
+
}
|
|
35
|
+
def prop = project.properties["NitroMap_" + name]
|
|
36
|
+
return prop != null ? prop.toInteger() : null
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
android {
|
|
40
|
+
namespace "com.margelo.nitro.nitromap"
|
|
41
|
+
|
|
42
|
+
compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")
|
|
43
|
+
|
|
44
|
+
defaultConfig {
|
|
45
|
+
minSdkVersion getExtOrIntegerDefault("minSdkVersion")
|
|
46
|
+
targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
|
|
47
|
+
|
|
48
|
+
externalNativeBuild {
|
|
49
|
+
cmake {
|
|
50
|
+
cppFlags "-frtti -fexceptions -Wall -fstack-protector-all"
|
|
51
|
+
arguments "-DANDROID_STL=c++_shared", "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
|
|
52
|
+
abiFilters (*reactNativeArchitectures())
|
|
53
|
+
|
|
54
|
+
buildTypes {
|
|
55
|
+
debug {
|
|
56
|
+
cppFlags "-O1 -g"
|
|
57
|
+
}
|
|
58
|
+
release {
|
|
59
|
+
cppFlags "-O2"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
externalNativeBuild {
|
|
67
|
+
cmake {
|
|
68
|
+
path "CMakeLists.txt"
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
packagingOptions {
|
|
73
|
+
excludes = [
|
|
74
|
+
"META-INF",
|
|
75
|
+
"META-INF/**",
|
|
76
|
+
"**/libc++_shared.so",
|
|
77
|
+
"**/libfbjni.so",
|
|
78
|
+
"**/libjsi.so",
|
|
79
|
+
"**/libfolly_json.so",
|
|
80
|
+
"**/libfolly_runtime.so",
|
|
81
|
+
"**/libglog.so",
|
|
82
|
+
"**/libhermes.so",
|
|
83
|
+
"**/libhermes-executor-debug.so",
|
|
84
|
+
"**/libhermes_executor.so",
|
|
85
|
+
"**/libreactnative.so",
|
|
86
|
+
"**/libreactnativejni.so",
|
|
87
|
+
"**/libturbomodulejsijni.so",
|
|
88
|
+
"**/libreact_nativemodule_core.so",
|
|
89
|
+
"**/libjscexecutor.so"
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
buildFeatures {
|
|
94
|
+
buildConfig true
|
|
95
|
+
prefab true
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
buildTypes {
|
|
99
|
+
release {
|
|
100
|
+
minifyEnabled false
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
lintOptions {
|
|
105
|
+
disable "GradleCompatible"
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
compileOptions {
|
|
109
|
+
sourceCompatibility JavaVersion.VERSION_1_8
|
|
110
|
+
targetCompatibility JavaVersion.VERSION_1_8
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
sourceSets {
|
|
114
|
+
main {
|
|
115
|
+
java.srcDirs += [
|
|
116
|
+
"generated/java",
|
|
117
|
+
"generated/jni"
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
repositories {
|
|
124
|
+
mavenCentral()
|
|
125
|
+
google()
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
def kotlin_version = getExtOrDefault("kotlinVersion")
|
|
129
|
+
|
|
130
|
+
dependencies {
|
|
131
|
+
implementation "com.facebook.react:react-android"
|
|
132
|
+
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
|
133
|
+
implementation project(":react-native-nitro-modules")
|
|
134
|
+
|
|
135
|
+
// Google Maps SDK
|
|
136
|
+
implementation "com.google.android.gms:play-services-maps:19.0.0"
|
|
137
|
+
implementation "com.google.android.gms:play-services-location:21.3.0"
|
|
138
|
+
|
|
139
|
+
// Coroutines for async operations
|
|
140
|
+
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3"
|
|
141
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
package com.margelo.nitro.nitromap
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.graphics.*
|
|
5
|
+
import com.google.android.gms.maps.model.BitmapDescriptor
|
|
6
|
+
import com.google.android.gms.maps.model.BitmapDescriptorFactory
|
|
7
|
+
import kotlin.math.roundToInt
|
|
8
|
+
import androidx.core.graphics.toColorInt
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Generator for cluster marker icons
|
|
12
|
+
*/
|
|
13
|
+
class ClusterIconGenerator(private val context: Context) {
|
|
14
|
+
|
|
15
|
+
private var backgroundColor = "#007AFF".toColorInt() // iOS blue
|
|
16
|
+
private var textColor = Color.WHITE
|
|
17
|
+
private var borderColor = Color.WHITE
|
|
18
|
+
private var borderWidth = 2f
|
|
19
|
+
|
|
20
|
+
private val iconCache = mutableMapOf<Int, BitmapDescriptor>()
|
|
21
|
+
|
|
22
|
+
fun updateConfig(config: ClusterConfig?) {
|
|
23
|
+
config?.let {
|
|
24
|
+
backgroundColor = ColorUtils.fromColorValue(it.backgroundColor)
|
|
25
|
+
textColor = ColorUtils.fromColorValue(it.textColor)
|
|
26
|
+
borderColor = ColorUtils.fromColorValue(it.borderColor)
|
|
27
|
+
borderWidth = it.borderWidth.toFloat()
|
|
28
|
+
// Clear cache when config changes
|
|
29
|
+
iconCache.clear()
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
fun getClusterIcon(count: Int): BitmapDescriptor {
|
|
34
|
+
// Check cache first
|
|
35
|
+
iconCache[count]?.let { return it }
|
|
36
|
+
|
|
37
|
+
val density = context.resources.displayMetrics.density
|
|
38
|
+
|
|
39
|
+
// Size based on count
|
|
40
|
+
val baseSize = when {
|
|
41
|
+
count < 10 -> 40
|
|
42
|
+
count < 100 -> 48
|
|
43
|
+
count < 1000 -> 56
|
|
44
|
+
else -> 64
|
|
45
|
+
}
|
|
46
|
+
val size = (baseSize * density).roundToInt()
|
|
47
|
+
|
|
48
|
+
val bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888)
|
|
49
|
+
val canvas = Canvas(bitmap)
|
|
50
|
+
|
|
51
|
+
// Draw background circle
|
|
52
|
+
val bgPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
|
53
|
+
color = backgroundColor
|
|
54
|
+
style = Paint.Style.FILL
|
|
55
|
+
}
|
|
56
|
+
canvas.drawCircle(size / 2f, size / 2f, size / 2f - borderWidth * density, bgPaint)
|
|
57
|
+
|
|
58
|
+
// Draw border
|
|
59
|
+
if (borderWidth > 0) {
|
|
60
|
+
val borderPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
|
61
|
+
color = borderColor
|
|
62
|
+
style = Paint.Style.STROKE
|
|
63
|
+
strokeWidth = borderWidth * density
|
|
64
|
+
}
|
|
65
|
+
canvas.drawCircle(
|
|
66
|
+
size / 2f,
|
|
67
|
+
size / 2f,
|
|
68
|
+
size / 2f - borderWidth * density / 2,
|
|
69
|
+
borderPaint
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Draw count text
|
|
74
|
+
val text = formatCount(count)
|
|
75
|
+
val textPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
|
76
|
+
color = textColor
|
|
77
|
+
textSize = when {
|
|
78
|
+
count < 10 -> 16 * density
|
|
79
|
+
count < 100 -> 14 * density
|
|
80
|
+
count < 1000 -> 12 * density
|
|
81
|
+
else -> 10 * density
|
|
82
|
+
}
|
|
83
|
+
typeface = Typeface.DEFAULT_BOLD
|
|
84
|
+
textAlign = Paint.Align.CENTER
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
val textBounds = Rect()
|
|
88
|
+
textPaint.getTextBounds(text, 0, text.length, textBounds)
|
|
89
|
+
val textY = size / 2f + textBounds.height() / 2f
|
|
90
|
+
canvas.drawText(text, size / 2f, textY, textPaint)
|
|
91
|
+
|
|
92
|
+
val descriptor = BitmapDescriptorFactory.fromBitmap(bitmap)
|
|
93
|
+
iconCache[count] = descriptor
|
|
94
|
+
return descriptor
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
private fun formatCount(count: Int): String {
|
|
98
|
+
return when {
|
|
99
|
+
count >= 1000000 -> "${count / 1000000}M"
|
|
100
|
+
count >= 1000 -> "${count / 1000}K"
|
|
101
|
+
else -> count.toString()
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
fun clearCache() {
|
|
106
|
+
iconCache.clear()
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
package com.margelo.nitro.nitromap
|
|
2
|
+
|
|
3
|
+
import android.graphics.Color
|
|
4
|
+
import androidx.core.graphics.toColorInt
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Utility functions for converting color types to Android color integers
|
|
8
|
+
*/
|
|
9
|
+
object ColorUtils {
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Convert MarkerColor (RGBA) to Android color int
|
|
13
|
+
*/
|
|
14
|
+
fun fromMarkerColor(color: MarkerColor): Int {
|
|
15
|
+
// Handle alpha: if <= 1.0, treat as 0-1 range and scale to 0-255
|
|
16
|
+
val alpha = if (color.a <= 1.0) (color.a * 255).toInt() else color.a.toInt()
|
|
17
|
+
return Color.argb(
|
|
18
|
+
alpha.coerceIn(0, 255),
|
|
19
|
+
color.r.toInt().coerceIn(0, 255),
|
|
20
|
+
color.g.toInt().coerceIn(0, 255),
|
|
21
|
+
color.b.toInt().coerceIn(0, 255)
|
|
22
|
+
)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Convert ColorValue (String | MarkerColor variant) to Android color int
|
|
27
|
+
*/
|
|
28
|
+
fun fromColorValue(colorValue: ColorValue): Int {
|
|
29
|
+
return colorValue.match(
|
|
30
|
+
first = { hexString -> parseHexColor(hexString) },
|
|
31
|
+
second = { markerColor -> fromMarkerColor(markerColor) }
|
|
32
|
+
)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Convert Variant_String_MarkerColor to Android color int
|
|
37
|
+
*/
|
|
38
|
+
fun fromVariant(variant: Variant_String_MarkerColor): Int {
|
|
39
|
+
return variant.match(
|
|
40
|
+
first = { hexString -> parseHexColor(hexString) },
|
|
41
|
+
second = { markerColor -> fromMarkerColor(markerColor) }
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Parse hex color string to Android color int
|
|
47
|
+
* Supports formats: #RGB, #RRGGBB, #AARRGGBB, and color names
|
|
48
|
+
*/
|
|
49
|
+
private fun parseHexColor(hexString: String): Int {
|
|
50
|
+
return try {
|
|
51
|
+
hexString.toColorInt()
|
|
52
|
+
} catch (e: Exception) {
|
|
53
|
+
Color.BLACK // Default fallback
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Create a default ColorValue from a MarkerColor
|
|
59
|
+
*/
|
|
60
|
+
fun defaultColorValue(r: Double, g: Double, b: Double, a: Double = 255.0): ColorValue {
|
|
61
|
+
return ColorValue.create(MarkerColor(r, g, b, a))
|
|
62
|
+
}
|
|
63
|
+
}
|