react-native-maps 0.31.0 → 1.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/build.gradle +89 -33
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +5 -0
- package/android/gradlew +251 -0
- package/android/gradlew.bat +94 -0
- package/android/src/main/AndroidManifest.xml +1 -5
- package/android/src/main/RCTAppDependencyProvider.h +25 -0
- package/android/src/main/RCTAppDependencyProvider.mm +55 -0
- package/android/src/main/RCTModulesConformingToProtocolsProvider.h +18 -0
- package/android/src/main/RCTModulesConformingToProtocolsProvider.mm +33 -0
- package/android/src/main/RCTThirdPartyComponentsProvider.h +16 -0
- package/android/src/main/RCTThirdPartyComponentsProvider.mm +28 -0
- package/android/src/main/ReactAppDependencyProvider.podspec +34 -0
- package/android/src/main/java/com/facebook/fbreact/specs/NativeAirMapsModuleSpec.java +63 -0
- package/android/src/main/java/com/facebook/react/viewmanagers/RNMapsCalloutManagerDelegate.java +35 -0
- package/android/src/main/java/com/facebook/react/viewmanagers/RNMapsCalloutManagerInterface.java +17 -0
- package/android/src/main/java/com/facebook/react/viewmanagers/RNMapsCircleManagerDelegate.java +49 -0
- package/android/src/main/java/com/facebook/react/viewmanagers/RNMapsCircleManagerInterface.java +23 -0
- package/android/src/main/java/com/facebook/react/viewmanagers/RNMapsGooglePolygonManagerDelegate.java +49 -0
- package/android/src/main/java/com/facebook/react/viewmanagers/RNMapsGooglePolygonManagerInterface.java +23 -0
- package/android/src/main/java/com/facebook/react/viewmanagers/RNMapsMapViewManagerDelegate.java +209 -0
- package/android/src/main/java/com/facebook/react/viewmanagers/RNMapsMapViewManagerInterface.java +74 -0
- package/android/src/main/java/com/facebook/react/viewmanagers/RNMapsMarkerManagerDelegate.java +104 -0
- package/android/src/main/java/com/facebook/react/viewmanagers/RNMapsMarkerManagerInterface.java +39 -0
- package/android/src/main/java/com/facebook/react/viewmanagers/RNMapsOverlayManagerDelegate.java +45 -0
- package/android/src/main/java/com/facebook/react/viewmanagers/RNMapsOverlayManagerInterface.java +22 -0
- package/android/src/main/java/com/facebook/react/viewmanagers/RNMapsPolylineManagerDelegate.java +58 -0
- package/android/src/main/java/com/facebook/react/viewmanagers/RNMapsPolylineManagerInterface.java +26 -0
- package/android/src/main/java/com/facebook/react/viewmanagers/RNMapsUrlTileManagerDelegate.java +62 -0
- package/android/src/main/java/com/facebook/react/viewmanagers/RNMapsUrlTileManagerInterface.java +27 -0
- package/android/src/main/java/com/facebook/react/viewmanagers/RNMapsWMSTileManagerDelegate.java +56 -0
- package/android/src/main/java/com/facebook/react/viewmanagers/RNMapsWMSTileManagerInterface.java +25 -0
- package/android/src/main/java/com/rnmaps/fabric/CalloutManager.java +77 -0
- package/android/src/main/java/com/rnmaps/fabric/CircleManager.java +94 -0
- package/android/src/main/java/com/rnmaps/fabric/JSONUtil.java +86 -0
- package/android/src/main/java/com/rnmaps/fabric/MapViewManager.java +623 -0
- package/android/src/main/java/com/rnmaps/fabric/MarkerManager.java +258 -0
- package/android/src/main/java/com/rnmaps/fabric/NativeAirMapsModule.java +284 -0
- package/android/src/main/java/com/rnmaps/fabric/OverlayManager.java +101 -0
- package/android/src/main/java/com/rnmaps/fabric/PolygonManager.java +89 -0
- package/android/src/main/java/com/rnmaps/fabric/PolylineManager.java +121 -0
- package/android/src/main/java/com/rnmaps/fabric/UrlTileManager.java +124 -0
- package/android/src/main/java/com/rnmaps/fabric/WMSTileManager.java +114 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnCalloutPressEvent.java +25 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnDeselectEvent.java +28 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnDoublePressEvent.java +27 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnDragEndEvent.java +28 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnDragEvent.java +28 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnDragStartEvent.java +28 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnIndoorBuildingFocusedEvent.java +28 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnIndoorLevelActivatedEvent.java +28 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnKmlReadyEvent.java +28 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnLongPressEvent.java +28 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnMapLoadedEvent.java +29 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnMapReadyEvent.java +29 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnMarkerDeselectEvent.java +28 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnMarkerDragEndEvent.java +28 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnMarkerDragEvent.java +28 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnMarkerDragStartEvent.java +28 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnMarkerPressEvent.java +28 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnMarkerSelectEvent.java +28 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnPanDragEvent.java +28 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnPoiClickEvent.java +27 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnPressEvent.java +27 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnRegionChangeCompleteEvent.java +30 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnRegionChangeEvent.java +48 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnRegionChangeStartEvent.java +33 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnSelectEvent.java +28 -0
- package/android/src/main/java/com/rnmaps/fabric/event/OnUserLocationChangeEvent.java +28 -0
- package/android/src/main/java/com/{airbnb/android/react → rnmaps}/maps/FileUtil.java +3 -6
- package/android/src/main/java/com/{airbnb/android/react → rnmaps}/maps/FusedLocationSource.java +5 -2
- package/android/src/main/java/com/{airbnb/android/react → rnmaps}/maps/ImageReadable.java +1 -1
- package/android/src/main/java/com/{airbnb/android/react → rnmaps}/maps/ImageReader.java +5 -7
- package/android/src/main/java/com/{airbnb/android/react → rnmaps}/maps/ImageUtil.java +1 -2
- package/android/src/main/java/com/{airbnb/android/react → rnmaps}/maps/LatLngBoundsUtils.java +1 -1
- package/android/src/main/java/com/rnmaps/maps/MapAirModulePackage.java +98 -0
- package/android/src/main/java/com/rnmaps/maps/MapCallout.java +41 -0
- package/android/src/main/java/com/{airbnb/android/react/maps/AirMapCalloutManager.java → rnmaps/maps/MapCalloutManager.java} +6 -6
- package/android/src/main/java/com/{airbnb/android/react/maps/AirMapCircle.java → rnmaps/maps/MapCircle.java} +34 -8
- package/android/src/main/java/com/{airbnb/android/react/maps/AirMapCircleManager.java → rnmaps/maps/MapCircleManager.java} +15 -20
- package/android/src/main/java/com/rnmaps/maps/MapFeature.java +17 -0
- package/android/src/main/java/com/{airbnb/android/react/maps/AirMapGradientPolyline.java → rnmaps/maps/MapGradientPolyline.java} +9 -12
- package/android/src/main/java/com/{airbnb/android/react/maps/AirMapGradientPolylineManager.java → rnmaps/maps/MapGradientPolylineManager.java} +13 -18
- package/android/src/main/java/com/{airbnb/android/react/maps/AirMapHeatmap.java → rnmaps/maps/MapHeatmap.java} +8 -9
- package/android/src/main/java/com/{airbnb/android/react/maps/AirMapHeatmapManager.java → rnmaps/maps/MapHeatmapManager.java} +8 -8
- package/android/src/main/java/com/{airbnb/android/react/maps/AirMapLocalTile.java → rnmaps/maps/MapLocalTile.java} +19 -16
- package/android/src/main/java/com/rnmaps/maps/MapLocalTileManager.java +54 -0
- package/android/src/main/java/com/rnmaps/maps/MapManager.java +504 -0
- package/android/src/main/java/com/rnmaps/maps/MapMarker.java +706 -0
- package/android/src/main/java/com/rnmaps/maps/MapMarkerManager.java +368 -0
- package/android/src/main/java/com/rnmaps/maps/MapModule.java +283 -0
- package/android/src/main/java/com/rnmaps/maps/MapOverlay.java +262 -0
- package/android/src/main/java/com/rnmaps/maps/MapOverlayManager.java +97 -0
- package/android/src/main/java/com/{airbnb/android/react/maps/AirMapPolygon.java → rnmaps/maps/MapPolygon.java} +73 -9
- package/android/src/main/java/com/{airbnb/android/react/maps/AirMapPolygonManager.java → rnmaps/maps/MapPolygonManager.java} +22 -22
- package/android/src/main/java/com/rnmaps/maps/MapPolyline.java +230 -0
- package/android/src/main/java/com/{airbnb/android/react/maps/AirMapPolylineManager.java → rnmaps/maps/MapPolylineManager.java} +18 -38
- package/android/src/main/java/com/{airbnb/android/react/maps/AirMapTileProvider.java → rnmaps/maps/MapTileProvider.java} +55 -76
- package/android/src/main/java/com/{airbnb/android/react/maps/AirMapTileWorker.java → rnmaps/maps/MapTileWorker.java} +7 -14
- package/android/src/main/java/com/rnmaps/maps/MapUIBlock.java +64 -0
- package/android/src/main/java/com/{airbnb/android/react/maps/AirMapUrlTile.java → rnmaps/maps/MapUrlTile.java} +29 -29
- package/android/src/main/java/com/rnmaps/maps/MapUrlTileManager.java +87 -0
- package/android/src/main/java/com/rnmaps/maps/MapView.java +1844 -0
- package/android/src/main/java/com/{airbnb/android/react/maps/AirMapWMSTile.java → rnmaps/maps/MapWMSTile.java} +11 -17
- package/android/src/main/java/com/rnmaps/maps/MapWMSTileManager.java +81 -0
- package/android/src/main/java/com/rnmaps/maps/MapsPackage.java +45 -0
- package/android/src/main/java/com/{airbnb/android/react → rnmaps}/maps/RegionChangeEvent.java +1 -1
- package/android/src/main/java/com/{airbnb/android/react → rnmaps}/maps/SizeReportingShadowNode.java +1 -1
- package/android/src/main/java/com/{airbnb/android/react → rnmaps}/maps/ViewAttacherGroup.java +2 -7
- package/android/src/main/java/com/{airbnb/android/react → rnmaps}/maps/ViewChangesTracker.java +12 -11
- package/android/src/main/jni/CMakeLists.txt +36 -0
- package/android/src/main/jni/RNMapsSpecs-generated.cpp +68 -0
- package/android/src/main/jni/RNMapsSpecs.h +31 -0
- package/android/src/main/jni/react/renderer/components/RNMapsSpecs/ComponentDescriptors.cpp +31 -0
- package/android/src/main/jni/react/renderer/components/RNMapsSpecs/ComponentDescriptors.h +33 -0
- package/android/src/main/jni/react/renderer/components/RNMapsSpecs/EventEmitters.cpp +979 -0
- package/android/src/main/jni/react/renderer/components/RNMapsSpecs/EventEmitters.h +860 -0
- package/android/src/main/jni/react/renderer/components/RNMapsSpecs/Props.cpp +227 -0
- package/android/src/main/jni/react/renderer/components/RNMapsSpecs/Props.h +1297 -0
- package/android/src/main/jni/react/renderer/components/RNMapsSpecs/RNMapsSpecsJSI-generated.cpp +74 -0
- package/android/src/main/jni/react/renderer/components/RNMapsSpecs/RNMapsSpecsJSI.h +268 -0
- package/android/src/main/jni/react/renderer/components/RNMapsSpecs/ShadowNodes.cpp +26 -0
- package/android/src/main/jni/react/renderer/components/RNMapsSpecs/ShadowNodes.h +131 -0
- package/android/src/main/jni/react/renderer/components/RNMapsSpecs/States.cpp +16 -0
- package/android/src/main/jni/react/renderer/components/RNMapsSpecs/States.h +137 -0
- package/app.plugin.js +1 -0
- package/ios/AirGoogleMaps/AIRGMSMarker.h +2 -0
- package/ios/AirGoogleMaps/AIRGoogleMap.h +22 -12
- package/ios/AirGoogleMaps/{AIRGoogleMap.m → AIRGoogleMap.mm} +407 -130
- package/ios/AirGoogleMaps/AIRGoogleMapCircle.h +2 -3
- package/ios/AirGoogleMaps/AIRGoogleMapCircle.m +42 -3
- package/ios/AirGoogleMaps/AIRGoogleMapCoordinate.h +13 -0
- package/ios/AirGoogleMaps/AIRGoogleMapCoordinate.m +10 -0
- package/ios/AirGoogleMaps/AIRGoogleMapHeatmap.h +1 -1
- package/ios/AirGoogleMaps/AIRGoogleMapManager.h +11 -0
- package/ios/AirGoogleMaps/AIRGoogleMapManager.mm +543 -0
- package/ios/AirGoogleMaps/AIRGoogleMapMarker.h +4 -0
- package/ios/AirGoogleMaps/AIRGoogleMapMarker.m +369 -237
- package/ios/AirGoogleMaps/AIRGoogleMapMarkerManager.m +3 -2
- package/ios/AirGoogleMaps/AIRGoogleMapOverlay.h +0 -1
- package/ios/AirGoogleMaps/AIRGoogleMapPolygon.h +7 -6
- package/ios/AirGoogleMaps/AIRGoogleMapPolygon.m +62 -5
- package/ios/AirGoogleMaps/AIRGoogleMapPolygonManager.m +3 -3
- package/ios/AirGoogleMaps/AIRGoogleMapPolyline.h +4 -3
- package/ios/AirGoogleMaps/AIRGoogleMapPolyline.m +9 -9
- package/ios/AirGoogleMaps/AIRGoogleMapPolylineManager.m +2 -2
- package/ios/AirGoogleMaps/AIRGoogleMapUrlTile.m +2 -2
- package/ios/AirGoogleMaps/AIRGoogleMapWMSTile.h +1 -1
- package/ios/AirGoogleMaps/AIRGoogleMapWMSTile.m +4 -4
- package/ios/AirGoogleMaps/RCTConvert+GMSMapViewType.h +3 -0
- package/ios/AirGoogleMaps/RCTConvert+GMSMapViewType.m +18 -0
- package/ios/AirGoogleMaps/RNMapsGoogleMapView.h +29 -0
- package/ios/AirGoogleMaps/RNMapsGoogleMapView.mm +678 -0
- package/ios/AirGoogleMaps/RNMapsGoogleMapViewManager.mm +40 -0
- package/ios/AirGoogleMaps/RNMapsGooglePolygonView.h +26 -0
- package/ios/AirGoogleMaps/RNMapsGooglePolygonView.mm +226 -0
- package/ios/AirGoogleMaps/RNMapsGooglePolygonViewManager.mm +26 -0
- package/ios/AirGoogleMaps/Resources/GoogleMapsPrivacy.bundle/PrivacyInfo.xcprivacy +110 -0
- package/ios/AirMaps/AIRMap.h +19 -14
- package/ios/AirMaps/{AIRMap.m → AIRMap.mm} +333 -120
- package/ios/AirMaps/AIRMapCircle.m +1 -53
- package/ios/AirMaps/AIRMapCoordinate.m +2 -4
- package/ios/AirMaps/AIRMapManager.m +64 -218
- package/ios/AirMaps/AIRMapMarker.h +5 -0
- package/ios/AirMaps/AIRMapMarker.m +180 -69
- package/ios/AirMaps/AIRMapMarkerManager.m +3 -0
- package/ios/AirMaps/AIRMapOverlay.m +2 -2
- package/ios/AirMaps/AIRMapPolygon.m +0 -52
- package/ios/AirMaps/AIRMapPolyline.m +3 -2
- package/ios/AirMaps/AIRMapWMSTile.m +8 -8
- package/ios/AirMaps/Callout/SMCalloutView.m +1 -1
- package/ios/AirMaps/FabricPlaceholders/PlaceHolderGoogleMapView.h +25 -0
- package/ios/AirMaps/FabricPlaceholders/PlaceHolderGoogleMapView.mm +77 -0
- package/ios/AirMaps/FabricPlaceholders/PlaceHolderPolygonView.h +25 -0
- package/ios/AirMaps/FabricPlaceholders/PlaceHolderPolygonView.mm +52 -0
- package/ios/AirMaps/RCTComponentData+Maps.h +13 -0
- package/ios/AirMaps/RCTComponentData+Maps.m +55 -0
- package/ios/AirMaps/RCTConvert+AirMap.h +6 -1
- package/ios/AirMaps/RCTConvert+AirMap.m +18 -0
- package/ios/AirMaps/RNMapsAirModule.h +15 -0
- package/ios/AirMaps/RNMapsAirModule.mm +164 -0
- package/ios/AirMaps/RNMapsDefines.h +1 -0
- package/ios/AirMaps/RNMapsMapView.h +27 -0
- package/ios/AirMaps/RNMapsMapView.mm +577 -0
- package/ios/AirMaps/RNMapsMapViewManager.mm +42 -0
- package/ios/AirMaps/RNMapsMarkerView.h +24 -0
- package/ios/AirMaps/RNMapsMarkerView.mm +439 -0
- package/ios/AirMaps/RNMapsMarkerViewManager.mm +28 -0
- package/ios/AirMaps/UIView+AirMap.h +11 -0
- package/ios/AirMaps/UIView+AirMap.m +20 -0
- package/ios/AirMaps/module.modulemap +6 -0
- package/ios/AirMaps.xcodeproj/project.pbxproj +44 -4
- package/ios/PrivacyInfo.xcprivacy +37 -0
- package/ios/generated/RCTAppDependencyProvider.h +25 -0
- package/ios/generated/RCTAppDependencyProvider.mm +55 -0
- package/ios/generated/RCTModulesConformingToProtocolsProvider.h +18 -0
- package/ios/generated/RCTModulesConformingToProtocolsProvider.mm +33 -0
- package/ios/generated/RCTThirdPartyComponentsProvider.h +16 -0
- package/ios/generated/RCTThirdPartyComponentsProvider.mm +26 -0
- package/ios/generated/RNMapsAirModuleDelegate.h +24 -0
- package/ios/generated/RNMapsHostVewDelegate.h +17 -0
- package/ios/generated/RNMapsSpecs/ComponentDescriptors.cpp +29 -0
- package/ios/generated/RNMapsSpecs/ComponentDescriptors.h +31 -0
- package/ios/generated/RNMapsSpecs/EventEmitters.cpp +977 -0
- package/ios/generated/RNMapsSpecs/EventEmitters.h +846 -0
- package/ios/generated/RNMapsSpecs/Props.cpp +194 -0
- package/ios/generated/RNMapsSpecs/Props.h +1224 -0
- package/ios/generated/RNMapsSpecs/RCTComponentViewHelpers.h +591 -0
- package/ios/generated/RNMapsSpecs/RNMapsSpecs-generated.mm +92 -0
- package/ios/generated/RNMapsSpecs/RNMapsSpecs.h +137 -0
- package/ios/generated/RNMapsSpecs/ShadowNodes.cpp +24 -0
- package/ios/generated/RNMapsSpecs/ShadowNodes.h +109 -0
- package/ios/generated/RNMapsSpecs/States.cpp +16 -0
- package/ios/generated/RNMapsSpecs/States.h +113 -0
- package/ios/generated/RNMapsSpecsJSI-generated.cpp +74 -0
- package/ios/generated/RNMapsSpecsJSI.h +268 -0
- package/ios/generated/ReactAppDependencyProvider.podspec +34 -0
- package/ios/generated/module.modulemap +15 -0
- package/package.json +57 -34
- package/plugin/build/android.js +58 -0
- package/plugin/build/index.js +10 -0
- package/plugin/build/ios.js +176 -0
- package/plugin/build/types.js +2 -0
- package/react-native-maps.podspec +114 -11
- package/react-native.config.js +15 -0
- package/src/{AnimatedRegion.js → AnimatedRegion.ts} +26 -21
- package/src/Geojson.tsx +541 -0
- package/src/MapCallout.tsx +77 -0
- package/src/MapCalloutSubview.tsx +64 -0
- package/src/MapCircle.tsx +162 -0
- package/src/MapHeatmap.tsx +125 -0
- package/src/MapLocalTile.tsx +60 -0
- package/src/MapMarker.tsx +531 -0
- package/src/MapMarkerNativeComponent.ts +51 -0
- package/src/MapOverlay.tsx +178 -0
- package/src/MapPolygon.tsx +188 -0
- package/src/MapPolygon.types.ts +25 -0
- package/src/MapPolyline.tsx +215 -0
- package/src/MapUrlTile.tsx +169 -0
- package/src/MapView.tsx +1235 -0
- package/src/MapView.types.ts +212 -0
- package/src/MapView.web.ts +2 -0
- package/src/MapViewNativeComponent.ts +86 -0
- package/src/MapWMSTile.tsx +148 -0
- package/src/ProviderConstants.ts +2 -0
- package/src/createFabricMap.tsx +253 -0
- package/src/decorateMapComponent.ts +230 -0
- package/src/fixImageProp.ts +17 -0
- package/src/index.ts +52 -0
- package/src/sharedTypes.ts +101 -0
- package/src/sharedTypesInternal.ts +1 -0
- package/src/specs/NativeAirMapsModule.ts +36 -0
- package/src/specs/NativeComponentCallout.ts +63 -0
- package/src/specs/NativeComponentCircle.ts +93 -0
- package/src/specs/NativeComponentGoogleMapView.ts +922 -0
- package/src/specs/NativeComponentGooglePolygon.ts +94 -0
- package/src/specs/NativeComponentMapView.ts +1100 -0
- package/src/specs/NativeComponentMarker.ts +326 -0
- package/src/specs/NativeComponentOverlay.ts +98 -0
- package/src/specs/NativeComponentPolyline.ts +124 -0
- package/src/specs/NativeComponentUrlTile.ts +128 -0
- package/src/specs/NativeComponentWMSTile.ts +107 -0
- package/LICENSE +0 -21
- package/README.md +0 -652
- package/android/src/main/assets/ula.kml +0 -1214
- package/android/src/main/java/com/airbnb/android/react/maps/AirMapCallout.java +0 -23
- package/android/src/main/java/com/airbnb/android/react/maps/AirMapFeature.java +0 -18
- package/android/src/main/java/com/airbnb/android/react/maps/AirMapLiteManager.java +0 -20
- package/android/src/main/java/com/airbnb/android/react/maps/AirMapLocalTileManager.java +0 -56
- package/android/src/main/java/com/airbnb/android/react/maps/AirMapManager.java +0 -500
- package/android/src/main/java/com/airbnb/android/react/maps/AirMapMarker.java +0 -630
- package/android/src/main/java/com/airbnb/android/react/maps/AirMapMarkerManager.java +0 -370
- package/android/src/main/java/com/airbnb/android/react/maps/AirMapModule.java +0 -380
- package/android/src/main/java/com/airbnb/android/react/maps/AirMapOverlay.java +0 -169
- package/android/src/main/java/com/airbnb/android/react/maps/AirMapOverlayManager.java +0 -81
- package/android/src/main/java/com/airbnb/android/react/maps/AirMapPolyline.java +0 -162
- package/android/src/main/java/com/airbnb/android/react/maps/AirMapUrlTileManager.java +0 -97
- package/android/src/main/java/com/airbnb/android/react/maps/AirMapView.java +0 -1384
- package/android/src/main/java/com/airbnb/android/react/maps/AirMapWMSTileManager.java +0 -87
- package/android/src/main/java/com/airbnb/android/react/maps/MapsPackage.java +0 -65
- package/index.d.ts +0 -637
- package/ios/AirGoogleMaps/AIRGoogleMapManager.m +0 -690
- package/ios/User.xcconfig +0 -0
- package/react-native-google-maps.podspec +0 -22
- package/src/Geojson.js +0 -334
- package/src/MapCallout.js +0 -51
- package/src/MapCalloutSubview.js +0 -44
- package/src/MapCircle.js +0 -150
- package/src/MapHeatmap.js +0 -99
- package/src/MapLocalTile.js +0 -52
- package/src/MapMarker.js +0 -377
- package/src/MapOverlay.js +0 -86
- package/src/MapPolygon.js +0 -202
- package/src/MapPolyline.js +0 -168
- package/src/MapUrlTile.js +0 -131
- package/src/MapView.js +0 -1160
- package/src/MapView.web.js +0 -1
- package/src/MapWMSTile.js +0 -122
- package/src/ProviderConstants.js +0 -2
- package/src/decorateMapComponent.js +0 -112
- package/src/index.js +0 -31
|
@@ -1,1384 +0,0 @@
|
|
|
1
|
-
package com.airbnb.android.react.maps;
|
|
2
|
-
|
|
3
|
-
import android.content.Context;
|
|
4
|
-
import android.content.res.ColorStateList;
|
|
5
|
-
import android.graphics.Bitmap;
|
|
6
|
-
import android.graphics.Color;
|
|
7
|
-
import android.graphics.Point;
|
|
8
|
-
import android.graphics.PorterDuff;
|
|
9
|
-
import android.graphics.Rect;
|
|
10
|
-
import android.os.Build;
|
|
11
|
-
|
|
12
|
-
import androidx.core.content.PermissionChecker;
|
|
13
|
-
import androidx.core.view.GestureDetectorCompat;
|
|
14
|
-
import androidx.core.view.MotionEventCompat;
|
|
15
|
-
import android.view.GestureDetector;
|
|
16
|
-
import android.view.MotionEvent;
|
|
17
|
-
import android.view.View;
|
|
18
|
-
import android.view.ViewGroup;
|
|
19
|
-
import android.widget.ImageView;
|
|
20
|
-
import android.widget.ProgressBar;
|
|
21
|
-
import android.widget.RelativeLayout;
|
|
22
|
-
import android.location.Location;
|
|
23
|
-
|
|
24
|
-
import com.facebook.react.bridge.LifecycleEventListener;
|
|
25
|
-
import com.facebook.react.bridge.ReactApplicationContext;
|
|
26
|
-
import com.facebook.react.bridge.ReadableArray;
|
|
27
|
-
import com.facebook.react.bridge.ReadableMap;
|
|
28
|
-
import com.facebook.react.bridge.WritableArray;
|
|
29
|
-
import com.facebook.react.bridge.WritableMap;
|
|
30
|
-
import com.facebook.react.bridge.WritableNativeArray;
|
|
31
|
-
import com.facebook.react.bridge.WritableNativeMap;
|
|
32
|
-
import com.facebook.react.bridge.Arguments;
|
|
33
|
-
import com.facebook.react.uimanager.ThemedReactContext;
|
|
34
|
-
import com.facebook.react.uimanager.UIManagerModule;
|
|
35
|
-
import com.facebook.react.uimanager.ViewProps;
|
|
36
|
-
import com.facebook.react.uimanager.events.EventDispatcher;
|
|
37
|
-
import com.google.android.gms.maps.CameraUpdate;
|
|
38
|
-
import com.google.android.gms.maps.CameraUpdateFactory;
|
|
39
|
-
import com.google.android.gms.maps.GoogleMap;
|
|
40
|
-
import com.google.android.gms.maps.GoogleMapOptions;
|
|
41
|
-
import com.google.android.gms.maps.MapView;
|
|
42
|
-
import com.google.android.gms.maps.OnMapReadyCallback;
|
|
43
|
-
import com.google.android.gms.maps.Projection;
|
|
44
|
-
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
|
|
45
|
-
import com.google.android.gms.maps.model.CameraPosition;
|
|
46
|
-
import com.google.android.gms.maps.model.GroundOverlay;
|
|
47
|
-
import com.google.android.gms.maps.model.LatLng;
|
|
48
|
-
import com.google.android.gms.maps.model.LatLngBounds;
|
|
49
|
-
import com.google.android.gms.maps.model.Marker;
|
|
50
|
-
import com.google.android.gms.maps.model.MarkerOptions;
|
|
51
|
-
import com.google.android.gms.maps.model.PointOfInterest;
|
|
52
|
-
import com.google.android.gms.maps.model.Polygon;
|
|
53
|
-
import com.google.android.gms.maps.model.Polyline;
|
|
54
|
-
import com.google.android.gms.maps.model.TileOverlay;
|
|
55
|
-
import com.google.android.gms.maps.model.VisibleRegion;
|
|
56
|
-
import com.google.android.gms.maps.model.IndoorBuilding;
|
|
57
|
-
import com.google.android.gms.maps.model.IndoorLevel;
|
|
58
|
-
import com.google.maps.android.data.kml.KmlContainer;
|
|
59
|
-
import com.google.maps.android.data.kml.KmlLayer;
|
|
60
|
-
import com.google.maps.android.data.kml.KmlPlacemark;
|
|
61
|
-
import com.google.maps.android.data.kml.KmlStyle;
|
|
62
|
-
|
|
63
|
-
import org.xmlpull.v1.XmlPullParserException;
|
|
64
|
-
|
|
65
|
-
import java.io.IOException;
|
|
66
|
-
import java.io.InputStream;
|
|
67
|
-
import java.util.ArrayList;
|
|
68
|
-
import java.util.Arrays;
|
|
69
|
-
import java.util.HashMap;
|
|
70
|
-
import java.util.List;
|
|
71
|
-
import java.util.Map;
|
|
72
|
-
import java.util.concurrent.ExecutionException;
|
|
73
|
-
|
|
74
|
-
import static androidx.core.content.PermissionChecker.checkSelfPermission;
|
|
75
|
-
|
|
76
|
-
public class AirMapView extends MapView implements GoogleMap.InfoWindowAdapter,
|
|
77
|
-
GoogleMap.OnMarkerDragListener, OnMapReadyCallback, GoogleMap.OnPoiClickListener, GoogleMap.OnIndoorStateChangeListener {
|
|
78
|
-
public GoogleMap map;
|
|
79
|
-
private KmlLayer kmlLayer;
|
|
80
|
-
private ProgressBar mapLoadingProgressBar;
|
|
81
|
-
private RelativeLayout mapLoadingLayout;
|
|
82
|
-
private ImageView cacheImageView;
|
|
83
|
-
private Boolean isMapLoaded = false;
|
|
84
|
-
private Integer loadingBackgroundColor = null;
|
|
85
|
-
private Integer loadingIndicatorColor = null;
|
|
86
|
-
private final int baseMapPadding = 50;
|
|
87
|
-
|
|
88
|
-
private LatLngBounds boundsToMove;
|
|
89
|
-
private CameraUpdate cameraToSet;
|
|
90
|
-
private boolean showUserLocation = false;
|
|
91
|
-
private boolean handlePanDrag = false;
|
|
92
|
-
private boolean moveOnMarkerPress = true;
|
|
93
|
-
private boolean cacheEnabled = false;
|
|
94
|
-
private ReadableMap initialRegion;
|
|
95
|
-
private boolean initialRegionSet = false;
|
|
96
|
-
private boolean initialCameraSet = false;
|
|
97
|
-
private LatLngBounds cameraLastIdleBounds;
|
|
98
|
-
private int cameraMoveReason = 0;
|
|
99
|
-
|
|
100
|
-
private static final String[] PERMISSIONS = new String[]{
|
|
101
|
-
"android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_COARSE_LOCATION"};
|
|
102
|
-
|
|
103
|
-
private final List<AirMapFeature> features = new ArrayList<>();
|
|
104
|
-
private final Map<Marker, AirMapMarker> markerMap = new HashMap<>();
|
|
105
|
-
private final Map<Polyline, AirMapPolyline> polylineMap = new HashMap<>();
|
|
106
|
-
private final Map<Polygon, AirMapPolygon> polygonMap = new HashMap<>();
|
|
107
|
-
private final Map<GroundOverlay, AirMapOverlay> overlayMap = new HashMap<>();
|
|
108
|
-
private final Map<TileOverlay, AirMapHeatmap> heatmapMap = new HashMap<>();
|
|
109
|
-
private final Map<TileOverlay, AirMapGradientPolyline> gradientPolylineMap = new HashMap<>();
|
|
110
|
-
private final GestureDetectorCompat gestureDetector;
|
|
111
|
-
private final AirMapManager manager;
|
|
112
|
-
private LifecycleEventListener lifecycleListener;
|
|
113
|
-
private boolean paused = false;
|
|
114
|
-
private boolean destroyed = false;
|
|
115
|
-
private final ThemedReactContext context;
|
|
116
|
-
private final EventDispatcher eventDispatcher;
|
|
117
|
-
private FusedLocationSource fusedLocationSource;
|
|
118
|
-
|
|
119
|
-
private ViewAttacherGroup attacherGroup;
|
|
120
|
-
private LatLng tapLocation;
|
|
121
|
-
|
|
122
|
-
private static boolean contextHasBug(Context context) {
|
|
123
|
-
return context == null ||
|
|
124
|
-
context.getResources() == null ||
|
|
125
|
-
context.getResources().getConfiguration() == null;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// We do this to fix this bug:
|
|
129
|
-
// https://github.com/react-native-maps/react-native-maps/issues/271
|
|
130
|
-
//
|
|
131
|
-
// which conflicts with another bug regarding the passed in context:
|
|
132
|
-
// https://github.com/react-native-maps/react-native-maps/issues/1147
|
|
133
|
-
//
|
|
134
|
-
// Doing this allows us to avoid both bugs.
|
|
135
|
-
private static Context getNonBuggyContext(ThemedReactContext reactContext,
|
|
136
|
-
ReactApplicationContext appContext) {
|
|
137
|
-
Context superContext = reactContext;
|
|
138
|
-
if (!contextHasBug(appContext.getCurrentActivity())) {
|
|
139
|
-
superContext = appContext.getCurrentActivity();
|
|
140
|
-
} else if (contextHasBug(superContext)) {
|
|
141
|
-
// we have the bug! let's try to find a better context to use
|
|
142
|
-
if (!contextHasBug(reactContext.getCurrentActivity())) {
|
|
143
|
-
superContext = reactContext.getCurrentActivity();
|
|
144
|
-
} else if (!contextHasBug(reactContext.getApplicationContext())) {
|
|
145
|
-
superContext = reactContext.getApplicationContext();
|
|
146
|
-
} else {
|
|
147
|
-
// ¯\_(ツ)_/¯
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
return superContext;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
public AirMapView(ThemedReactContext reactContext, ReactApplicationContext appContext,
|
|
154
|
-
AirMapManager manager,
|
|
155
|
-
GoogleMapOptions googleMapOptions) {
|
|
156
|
-
super(getNonBuggyContext(reactContext, appContext), googleMapOptions);
|
|
157
|
-
|
|
158
|
-
this.manager = manager;
|
|
159
|
-
this.context = reactContext;
|
|
160
|
-
|
|
161
|
-
super.onCreate(null);
|
|
162
|
-
// TODO(lmr): what about onStart????
|
|
163
|
-
super.onResume();
|
|
164
|
-
super.getMapAsync(this);
|
|
165
|
-
|
|
166
|
-
final AirMapView view = this;
|
|
167
|
-
|
|
168
|
-
fusedLocationSource = new FusedLocationSource(context);
|
|
169
|
-
|
|
170
|
-
gestureDetector =
|
|
171
|
-
new GestureDetectorCompat(reactContext, new GestureDetector.SimpleOnGestureListener() {
|
|
172
|
-
|
|
173
|
-
@Override
|
|
174
|
-
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
|
|
175
|
-
float distanceY) {
|
|
176
|
-
if (handlePanDrag) {
|
|
177
|
-
onPanDrag(e2);
|
|
178
|
-
}
|
|
179
|
-
return false;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
@Override
|
|
183
|
-
public boolean onDoubleTap(MotionEvent ev) {
|
|
184
|
-
onDoublePress(ev);
|
|
185
|
-
return false;
|
|
186
|
-
}
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
this.addOnLayoutChangeListener(new OnLayoutChangeListener() {
|
|
190
|
-
@Override public void onLayoutChange(View v, int left, int top, int right, int bottom,
|
|
191
|
-
int oldLeft, int oldTop, int oldRight, int oldBottom) {
|
|
192
|
-
if (!paused) {
|
|
193
|
-
AirMapView.this.cacheView();
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
eventDispatcher = reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher();
|
|
199
|
-
|
|
200
|
-
// Set up a parent view for triggering visibility in subviews that depend on it.
|
|
201
|
-
// Mainly ReactImageView depends on Fresco which depends on onVisibilityChanged() event
|
|
202
|
-
attacherGroup = new ViewAttacherGroup(context);
|
|
203
|
-
LayoutParams attacherLayoutParams = new LayoutParams(0, 0);
|
|
204
|
-
attacherLayoutParams.width = 0;
|
|
205
|
-
attacherLayoutParams.height = 0;
|
|
206
|
-
attacherLayoutParams.leftMargin = 99999999;
|
|
207
|
-
attacherLayoutParams.topMargin = 99999999;
|
|
208
|
-
attacherGroup.setLayoutParams(attacherLayoutParams);
|
|
209
|
-
addView(attacherGroup);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
@Override
|
|
213
|
-
public void onMapReady(final GoogleMap map) {
|
|
214
|
-
if (destroyed) {
|
|
215
|
-
return;
|
|
216
|
-
}
|
|
217
|
-
this.map = map;
|
|
218
|
-
this.map.setInfoWindowAdapter(this);
|
|
219
|
-
this.map.setOnMarkerDragListener(this);
|
|
220
|
-
this.map.setOnPoiClickListener(this);
|
|
221
|
-
this.map.setOnIndoorStateChangeListener(this);
|
|
222
|
-
if(initialRegion != null) {
|
|
223
|
-
setRegion(initialRegion);
|
|
224
|
-
initialRegionSet = true;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
manager.pushEvent(context, this, "onMapReady", new WritableNativeMap());
|
|
228
|
-
|
|
229
|
-
final AirMapView view = this;
|
|
230
|
-
|
|
231
|
-
map.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() {
|
|
232
|
-
@Override
|
|
233
|
-
public void onMyLocationChange(Location location){
|
|
234
|
-
WritableMap event = new WritableNativeMap();
|
|
235
|
-
|
|
236
|
-
WritableMap coordinate = new WritableNativeMap();
|
|
237
|
-
coordinate.putDouble("latitude", location.getLatitude());
|
|
238
|
-
coordinate.putDouble("longitude", location.getLongitude());
|
|
239
|
-
coordinate.putDouble("altitude", location.getAltitude());
|
|
240
|
-
coordinate.putDouble("timestamp", location.getTime());
|
|
241
|
-
coordinate.putDouble("accuracy", location.getAccuracy());
|
|
242
|
-
coordinate.putDouble("speed", location.getSpeed());
|
|
243
|
-
coordinate.putDouble("heading", location.getBearing());
|
|
244
|
-
if(android.os.Build.VERSION.SDK_INT >= 18){
|
|
245
|
-
coordinate.putBoolean("isFromMockProvider", location.isFromMockProvider());
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
event.putMap("coordinate", coordinate);
|
|
249
|
-
|
|
250
|
-
manager.pushEvent(context, view, "onUserLocationChange", event);
|
|
251
|
-
}
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
|
|
255
|
-
@Override
|
|
256
|
-
public boolean onMarkerClick(Marker marker) {
|
|
257
|
-
WritableMap event;
|
|
258
|
-
AirMapMarker airMapMarker = getMarkerMap(marker);
|
|
259
|
-
|
|
260
|
-
event = makeClickEventData(marker.getPosition());
|
|
261
|
-
event.putString("action", "marker-press");
|
|
262
|
-
event.putString("id", airMapMarker.getIdentifier());
|
|
263
|
-
manager.pushEvent(context, view, "onMarkerPress", event);
|
|
264
|
-
|
|
265
|
-
event = makeClickEventData(marker.getPosition());
|
|
266
|
-
event.putString("action", "marker-press");
|
|
267
|
-
event.putString("id", airMapMarker.getIdentifier());
|
|
268
|
-
manager.pushEvent(context, airMapMarker, "onPress", event);
|
|
269
|
-
|
|
270
|
-
// Return false to open the callout info window and center on the marker
|
|
271
|
-
// https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap
|
|
272
|
-
// .OnMarkerClickListener
|
|
273
|
-
if (view.moveOnMarkerPress) {
|
|
274
|
-
return false;
|
|
275
|
-
} else {
|
|
276
|
-
marker.showInfoWindow();
|
|
277
|
-
return true;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
map.setOnPolygonClickListener(new GoogleMap.OnPolygonClickListener() {
|
|
283
|
-
@Override
|
|
284
|
-
public void onPolygonClick(Polygon polygon) {
|
|
285
|
-
WritableMap event = makeClickEventData(tapLocation);
|
|
286
|
-
event.putString("action", "polygon-press");
|
|
287
|
-
manager.pushEvent(context, polygonMap.get(polygon), "onPress", event);
|
|
288
|
-
}
|
|
289
|
-
});
|
|
290
|
-
|
|
291
|
-
map.setOnPolylineClickListener(new GoogleMap.OnPolylineClickListener() {
|
|
292
|
-
@Override
|
|
293
|
-
public void onPolylineClick(Polyline polyline) {
|
|
294
|
-
WritableMap event = makeClickEventData(polyline.getPoints().get(0));
|
|
295
|
-
event.putString("action", "polyline-press");
|
|
296
|
-
manager.pushEvent(context, polylineMap.get(polyline), "onPress", event);
|
|
297
|
-
}
|
|
298
|
-
});
|
|
299
|
-
|
|
300
|
-
map.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
|
|
301
|
-
@Override
|
|
302
|
-
public void onInfoWindowClick(Marker marker) {
|
|
303
|
-
WritableMap event;
|
|
304
|
-
|
|
305
|
-
event = makeClickEventData(marker.getPosition());
|
|
306
|
-
event.putString("action", "callout-press");
|
|
307
|
-
manager.pushEvent(context, view, "onCalloutPress", event);
|
|
308
|
-
|
|
309
|
-
event = makeClickEventData(marker.getPosition());
|
|
310
|
-
event.putString("action", "callout-press");
|
|
311
|
-
AirMapMarker markerView = getMarkerMap(marker);
|
|
312
|
-
manager.pushEvent(context, markerView, "onCalloutPress", event);
|
|
313
|
-
|
|
314
|
-
event = makeClickEventData(marker.getPosition());
|
|
315
|
-
event.putString("action", "callout-press");
|
|
316
|
-
AirMapCallout infoWindow = markerView.getCalloutView();
|
|
317
|
-
if (infoWindow != null) manager.pushEvent(context, infoWindow, "onPress", event);
|
|
318
|
-
}
|
|
319
|
-
});
|
|
320
|
-
|
|
321
|
-
map.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
|
|
322
|
-
@Override
|
|
323
|
-
public void onMapClick(LatLng point) {
|
|
324
|
-
WritableMap event = makeClickEventData(point);
|
|
325
|
-
event.putString("action", "press");
|
|
326
|
-
manager.pushEvent(context, view, "onPress", event);
|
|
327
|
-
}
|
|
328
|
-
});
|
|
329
|
-
|
|
330
|
-
map.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
|
|
331
|
-
@Override
|
|
332
|
-
public void onMapLongClick(LatLng point) {
|
|
333
|
-
WritableMap event = makeClickEventData(point);
|
|
334
|
-
event.putString("action", "long-press");
|
|
335
|
-
manager.pushEvent(context, view, "onLongPress", makeClickEventData(point));
|
|
336
|
-
}
|
|
337
|
-
});
|
|
338
|
-
|
|
339
|
-
map.setOnGroundOverlayClickListener(new GoogleMap.OnGroundOverlayClickListener() {
|
|
340
|
-
@Override
|
|
341
|
-
public void onGroundOverlayClick(GroundOverlay groundOverlay) {
|
|
342
|
-
WritableMap event = makeClickEventData(groundOverlay.getPosition());
|
|
343
|
-
event.putString("action", "overlay-press");
|
|
344
|
-
manager.pushEvent(context, overlayMap.get(groundOverlay), "onPress", event);
|
|
345
|
-
}
|
|
346
|
-
});
|
|
347
|
-
|
|
348
|
-
map.setOnCameraMoveStartedListener(new GoogleMap.OnCameraMoveStartedListener() {
|
|
349
|
-
@Override
|
|
350
|
-
public void onCameraMoveStarted(int reason) {
|
|
351
|
-
cameraMoveReason = reason;
|
|
352
|
-
}
|
|
353
|
-
});
|
|
354
|
-
|
|
355
|
-
map.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
|
|
356
|
-
@Override
|
|
357
|
-
public void onCameraMove() {
|
|
358
|
-
LatLngBounds bounds = map.getProjection().getVisibleRegion().latLngBounds;
|
|
359
|
-
|
|
360
|
-
cameraLastIdleBounds = null;
|
|
361
|
-
boolean isGesture = GoogleMap.OnCameraMoveStartedListener.REASON_GESTURE == cameraMoveReason;
|
|
362
|
-
|
|
363
|
-
RegionChangeEvent event = new RegionChangeEvent(getId(), bounds, true, isGesture);
|
|
364
|
-
eventDispatcher.dispatchEvent(event);
|
|
365
|
-
}
|
|
366
|
-
});
|
|
367
|
-
|
|
368
|
-
map.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() {
|
|
369
|
-
@Override
|
|
370
|
-
public void onCameraIdle() {
|
|
371
|
-
LatLngBounds bounds = map.getProjection().getVisibleRegion().latLngBounds;
|
|
372
|
-
if ((cameraMoveReason != 0) &&
|
|
373
|
-
((cameraLastIdleBounds == null) ||
|
|
374
|
-
LatLngBoundsUtils.BoundsAreDifferent(bounds, cameraLastIdleBounds))) {
|
|
375
|
-
|
|
376
|
-
cameraLastIdleBounds = bounds;
|
|
377
|
-
boolean isGesture = GoogleMap.OnCameraMoveStartedListener.REASON_GESTURE == cameraMoveReason;
|
|
378
|
-
|
|
379
|
-
RegionChangeEvent event = new RegionChangeEvent(getId(), bounds, false, isGesture);
|
|
380
|
-
eventDispatcher.dispatchEvent(event);
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
});
|
|
384
|
-
|
|
385
|
-
map.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
|
|
386
|
-
@Override public void onMapLoaded() {
|
|
387
|
-
isMapLoaded = true;
|
|
388
|
-
manager.pushEvent(context, view, "onMapLoaded", new WritableNativeMap());
|
|
389
|
-
AirMapView.this.cacheView();
|
|
390
|
-
}
|
|
391
|
-
});
|
|
392
|
-
|
|
393
|
-
// We need to be sure to disable location-tracking when app enters background, in-case some
|
|
394
|
-
// other module
|
|
395
|
-
// has acquired a wake-lock and is controlling location-updates, otherwise, location-manager
|
|
396
|
-
// will be left
|
|
397
|
-
// updating location constantly, killing the battery, even though some other location-mgmt
|
|
398
|
-
// module may
|
|
399
|
-
// desire to shut-down location-services.
|
|
400
|
-
lifecycleListener = new LifecycleEventListener() {
|
|
401
|
-
@Override
|
|
402
|
-
public void onHostResume() {
|
|
403
|
-
if (hasPermissions() && map != null) {
|
|
404
|
-
//noinspection MissingPermission
|
|
405
|
-
map.setMyLocationEnabled(showUserLocation);
|
|
406
|
-
map.setLocationSource(fusedLocationSource);
|
|
407
|
-
}
|
|
408
|
-
synchronized (AirMapView.this) {
|
|
409
|
-
if (!destroyed) {
|
|
410
|
-
AirMapView.this.onResume();
|
|
411
|
-
}
|
|
412
|
-
paused = false;
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
@Override
|
|
417
|
-
public void onHostPause() {
|
|
418
|
-
if (hasPermissions() && map != null) {
|
|
419
|
-
//noinspection MissingPermission
|
|
420
|
-
map.setMyLocationEnabled(false);
|
|
421
|
-
}
|
|
422
|
-
synchronized (AirMapView.this) {
|
|
423
|
-
if (!destroyed) {
|
|
424
|
-
AirMapView.this.onPause();
|
|
425
|
-
}
|
|
426
|
-
paused = true;
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
@Override
|
|
431
|
-
public void onHostDestroy() {
|
|
432
|
-
AirMapView.this.doDestroy();
|
|
433
|
-
}
|
|
434
|
-
};
|
|
435
|
-
|
|
436
|
-
context.addLifecycleEventListener(lifecycleListener);
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
private boolean hasPermissions() {
|
|
440
|
-
return checkSelfPermission(getContext(), PERMISSIONS[0]) == PermissionChecker.PERMISSION_GRANTED ||
|
|
441
|
-
checkSelfPermission(getContext(), PERMISSIONS[1]) == PermissionChecker.PERMISSION_GRANTED;
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
/*
|
|
446
|
-
onDestroy is final method so I can't override it.
|
|
447
|
-
*/
|
|
448
|
-
public synchronized void doDestroy() {
|
|
449
|
-
if (destroyed) {
|
|
450
|
-
return;
|
|
451
|
-
}
|
|
452
|
-
destroyed = true;
|
|
453
|
-
|
|
454
|
-
if (lifecycleListener != null && context != null) {
|
|
455
|
-
context.removeLifecycleEventListener(lifecycleListener);
|
|
456
|
-
lifecycleListener = null;
|
|
457
|
-
}
|
|
458
|
-
if (!paused) {
|
|
459
|
-
onPause();
|
|
460
|
-
paused = true;
|
|
461
|
-
}
|
|
462
|
-
onDestroy();
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
public void setInitialRegion(ReadableMap initialRegion) {
|
|
466
|
-
this.initialRegion = initialRegion;
|
|
467
|
-
// Theoretically onMapReady might be called before setInitialRegion
|
|
468
|
-
// In that case, trigger setRegion manually
|
|
469
|
-
if (!initialRegionSet && map != null) {
|
|
470
|
-
setRegion(initialRegion);
|
|
471
|
-
initialRegionSet = true;
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
public void setInitialCamera(ReadableMap initialCamera) {
|
|
476
|
-
if (!initialCameraSet && initialCamera != null) {
|
|
477
|
-
setCamera(initialCamera);
|
|
478
|
-
initialCameraSet = true;
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
public void setRegion(ReadableMap region) {
|
|
483
|
-
if (region == null) return;
|
|
484
|
-
|
|
485
|
-
Double lng = region.getDouble("longitude");
|
|
486
|
-
Double lat = region.getDouble("latitude");
|
|
487
|
-
Double lngDelta = region.getDouble("longitudeDelta");
|
|
488
|
-
Double latDelta = region.getDouble("latitudeDelta");
|
|
489
|
-
LatLngBounds bounds = new LatLngBounds(
|
|
490
|
-
new LatLng(lat - latDelta / 2, lng - lngDelta / 2), // southwest
|
|
491
|
-
new LatLng(lat + latDelta / 2, lng + lngDelta / 2) // northeast
|
|
492
|
-
);
|
|
493
|
-
if (super.getHeight() <= 0 || super.getWidth() <= 0) {
|
|
494
|
-
// in this case, our map has not been laid out yet, so we save the bounds in a local
|
|
495
|
-
// variable, and make a guess of zoomLevel 10. Not to worry, though: as soon as layout
|
|
496
|
-
// occurs, we will move the camera to the saved bounds. Note that if we tried to move
|
|
497
|
-
// to the bounds now, it would trigger an exception.
|
|
498
|
-
map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), 10));
|
|
499
|
-
boundsToMove = bounds;
|
|
500
|
-
} else {
|
|
501
|
-
map.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0));
|
|
502
|
-
boundsToMove = null;
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
public void setCamera(ReadableMap camera) {
|
|
507
|
-
if (camera == null) return;
|
|
508
|
-
|
|
509
|
-
CameraPosition.Builder builder = new CameraPosition.Builder();
|
|
510
|
-
|
|
511
|
-
ReadableMap center = camera.getMap("center");
|
|
512
|
-
if (center != null) {
|
|
513
|
-
Double lng = center.getDouble("longitude");
|
|
514
|
-
Double lat = center.getDouble("latitude");
|
|
515
|
-
builder.target(new LatLng(lat, lng));
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
builder.tilt((float)camera.getDouble("pitch"));
|
|
519
|
-
builder.bearing((float)camera.getDouble("heading"));
|
|
520
|
-
builder.zoom((float)camera.getDouble("zoom"));
|
|
521
|
-
|
|
522
|
-
CameraUpdate update = CameraUpdateFactory.newCameraPosition(builder.build());
|
|
523
|
-
|
|
524
|
-
if (super.getHeight() <= 0 || super.getWidth() <= 0) {
|
|
525
|
-
// in this case, our map has not been laid out yet, so we save the camera update in a
|
|
526
|
-
// local variable. As soon as layout occurs, we will move the camera to the saved update.
|
|
527
|
-
// Note that if we tried to move to the camera now, it would trigger an exception.
|
|
528
|
-
cameraToSet = update;
|
|
529
|
-
} else {
|
|
530
|
-
map.moveCamera(update);
|
|
531
|
-
cameraToSet = null;
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
public void setShowsUserLocation(boolean showUserLocation) {
|
|
536
|
-
this.showUserLocation = showUserLocation; // hold onto this for lifecycle handling
|
|
537
|
-
if (hasPermissions()) {
|
|
538
|
-
map.setLocationSource(fusedLocationSource);
|
|
539
|
-
//noinspection MissingPermission
|
|
540
|
-
map.setMyLocationEnabled(showUserLocation);
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
public void setUserLocationPriority(int priority){
|
|
545
|
-
fusedLocationSource.setPriority(priority);
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
public void setUserLocationUpdateInterval(int interval){
|
|
549
|
-
fusedLocationSource.setInterval(interval);
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
public void setUserLocationFastestInterval(int interval){
|
|
553
|
-
fusedLocationSource.setFastestInterval(interval);
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
public void setShowsMyLocationButton(boolean showMyLocationButton) {
|
|
557
|
-
if (hasPermissions() || !showMyLocationButton) {
|
|
558
|
-
map.getUiSettings().setMyLocationButtonEnabled(showMyLocationButton);
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
public void setToolbarEnabled(boolean toolbarEnabled) {
|
|
563
|
-
if (hasPermissions() || !toolbarEnabled) {
|
|
564
|
-
map.getUiSettings().setMapToolbarEnabled(toolbarEnabled);
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
public void setCacheEnabled(boolean cacheEnabled) {
|
|
569
|
-
this.cacheEnabled = cacheEnabled;
|
|
570
|
-
this.cacheView();
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
public void enableMapLoading(boolean loadingEnabled) {
|
|
574
|
-
if (loadingEnabled && !this.isMapLoaded) {
|
|
575
|
-
this.getMapLoadingLayoutView().setVisibility(View.VISIBLE);
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
|
|
579
|
-
public void setMoveOnMarkerPress(boolean moveOnPress) {
|
|
580
|
-
this.moveOnMarkerPress = moveOnPress;
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
public void setLoadingBackgroundColor(Integer loadingBackgroundColor) {
|
|
584
|
-
this.loadingBackgroundColor = loadingBackgroundColor;
|
|
585
|
-
|
|
586
|
-
if (this.mapLoadingLayout != null) {
|
|
587
|
-
if (loadingBackgroundColor == null) {
|
|
588
|
-
this.mapLoadingLayout.setBackgroundColor(Color.WHITE);
|
|
589
|
-
} else {
|
|
590
|
-
this.mapLoadingLayout.setBackgroundColor(this.loadingBackgroundColor);
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
public void setLoadingIndicatorColor(Integer loadingIndicatorColor) {
|
|
596
|
-
this.loadingIndicatorColor = loadingIndicatorColor;
|
|
597
|
-
if (this.mapLoadingProgressBar != null) {
|
|
598
|
-
Integer color = loadingIndicatorColor;
|
|
599
|
-
if (color == null) {
|
|
600
|
-
color = Color.parseColor("#606060");
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
|
604
|
-
ColorStateList progressTintList = ColorStateList.valueOf(loadingIndicatorColor);
|
|
605
|
-
ColorStateList secondaryProgressTintList = ColorStateList.valueOf(loadingIndicatorColor);
|
|
606
|
-
ColorStateList indeterminateTintList = ColorStateList.valueOf(loadingIndicatorColor);
|
|
607
|
-
|
|
608
|
-
this.mapLoadingProgressBar.setProgressTintList(progressTintList);
|
|
609
|
-
this.mapLoadingProgressBar.setSecondaryProgressTintList(secondaryProgressTintList);
|
|
610
|
-
this.mapLoadingProgressBar.setIndeterminateTintList(indeterminateTintList);
|
|
611
|
-
} else {
|
|
612
|
-
PorterDuff.Mode mode = PorterDuff.Mode.SRC_IN;
|
|
613
|
-
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
|
|
614
|
-
mode = PorterDuff.Mode.MULTIPLY;
|
|
615
|
-
}
|
|
616
|
-
if (this.mapLoadingProgressBar.getIndeterminateDrawable() != null)
|
|
617
|
-
this.mapLoadingProgressBar.getIndeterminateDrawable().setColorFilter(color, mode);
|
|
618
|
-
if (this.mapLoadingProgressBar.getProgressDrawable() != null)
|
|
619
|
-
this.mapLoadingProgressBar.getProgressDrawable().setColorFilter(color, mode);
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
public void setHandlePanDrag(boolean handlePanDrag) {
|
|
625
|
-
this.handlePanDrag = handlePanDrag;
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
public void addFeature(View child, int index) {
|
|
629
|
-
// Our desired API is to pass up annotations/overlays as children to the mapview component.
|
|
630
|
-
// This is where we intercept them and do the appropriate underlying mapview action.
|
|
631
|
-
if (child instanceof AirMapMarker) {
|
|
632
|
-
AirMapMarker annotation = (AirMapMarker) child;
|
|
633
|
-
annotation.addToMap(map);
|
|
634
|
-
features.add(index, annotation);
|
|
635
|
-
|
|
636
|
-
// Allow visibility event to be triggered later
|
|
637
|
-
int visibility = annotation.getVisibility();
|
|
638
|
-
annotation.setVisibility(INVISIBLE);
|
|
639
|
-
|
|
640
|
-
// Remove from a view group if already present, prevent "specified child
|
|
641
|
-
// already had a parent" error.
|
|
642
|
-
ViewGroup annotationParent = (ViewGroup)annotation.getParent();
|
|
643
|
-
if (annotationParent != null) {
|
|
644
|
-
annotationParent.removeView(annotation);
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
// Add to the parent group
|
|
648
|
-
attacherGroup.addView(annotation);
|
|
649
|
-
|
|
650
|
-
// Trigger visibility event if necessary.
|
|
651
|
-
// With some testing, seems like it is not always
|
|
652
|
-
// triggered just by being added to a parent view.
|
|
653
|
-
annotation.setVisibility(visibility);
|
|
654
|
-
|
|
655
|
-
Marker marker = (Marker) annotation.getFeature();
|
|
656
|
-
markerMap.put(marker, annotation);
|
|
657
|
-
} else if (child instanceof AirMapPolyline) {
|
|
658
|
-
AirMapPolyline polylineView = (AirMapPolyline) child;
|
|
659
|
-
polylineView.addToMap(map);
|
|
660
|
-
features.add(index, polylineView);
|
|
661
|
-
Polyline polyline = (Polyline) polylineView.getFeature();
|
|
662
|
-
polylineMap.put(polyline, polylineView);
|
|
663
|
-
} else if (child instanceof AirMapGradientPolyline) {
|
|
664
|
-
AirMapGradientPolyline polylineView = (AirMapGradientPolyline) child;
|
|
665
|
-
polylineView.addToMap(map);
|
|
666
|
-
features.add(index, polylineView);
|
|
667
|
-
TileOverlay tileOverlay = (TileOverlay) polylineView.getFeature();
|
|
668
|
-
gradientPolylineMap.put(tileOverlay, polylineView);
|
|
669
|
-
} else if (child instanceof AirMapPolygon) {
|
|
670
|
-
AirMapPolygon polygonView = (AirMapPolygon) child;
|
|
671
|
-
polygonView.addToMap(map);
|
|
672
|
-
features.add(index, polygonView);
|
|
673
|
-
Polygon polygon = (Polygon) polygonView.getFeature();
|
|
674
|
-
polygonMap.put(polygon, polygonView);
|
|
675
|
-
} else if (child instanceof AirMapCircle) {
|
|
676
|
-
AirMapCircle circleView = (AirMapCircle) child;
|
|
677
|
-
circleView.addToMap(map);
|
|
678
|
-
features.add(index, circleView);
|
|
679
|
-
} else if (child instanceof AirMapUrlTile) {
|
|
680
|
-
AirMapUrlTile urlTileView = (AirMapUrlTile) child;
|
|
681
|
-
urlTileView.addToMap(map);
|
|
682
|
-
features.add(index, urlTileView);
|
|
683
|
-
} else if (child instanceof AirMapWMSTile) {
|
|
684
|
-
AirMapWMSTile urlTileView = (AirMapWMSTile) child;
|
|
685
|
-
urlTileView.addToMap(map);
|
|
686
|
-
features.add(index, urlTileView);
|
|
687
|
-
} else if (child instanceof AirMapLocalTile) {
|
|
688
|
-
AirMapLocalTile localTileView = (AirMapLocalTile) child;
|
|
689
|
-
localTileView.addToMap(map);
|
|
690
|
-
features.add(index, localTileView);
|
|
691
|
-
} else if (child instanceof AirMapOverlay) {
|
|
692
|
-
AirMapOverlay overlayView = (AirMapOverlay) child;
|
|
693
|
-
overlayView.addToMap(map);
|
|
694
|
-
features.add(index, overlayView);
|
|
695
|
-
GroundOverlay overlay = (GroundOverlay) overlayView.getFeature();
|
|
696
|
-
overlayMap.put(overlay, overlayView);
|
|
697
|
-
} else if (child instanceof AirMapHeatmap) {
|
|
698
|
-
AirMapHeatmap heatmapView = (AirMapHeatmap) child;
|
|
699
|
-
heatmapView.addToMap(map);
|
|
700
|
-
features.add(index, heatmapView);
|
|
701
|
-
TileOverlay heatmap = (TileOverlay)heatmapView.getFeature();
|
|
702
|
-
heatmapMap.put(heatmap, heatmapView);
|
|
703
|
-
} else if (child instanceof ViewGroup) {
|
|
704
|
-
ViewGroup children = (ViewGroup) child;
|
|
705
|
-
for (int i = 0; i < children.getChildCount(); i++) {
|
|
706
|
-
addFeature(children.getChildAt(i), index);
|
|
707
|
-
}
|
|
708
|
-
} else {
|
|
709
|
-
addView(child, index);
|
|
710
|
-
}
|
|
711
|
-
}
|
|
712
|
-
|
|
713
|
-
public int getFeatureCount() {
|
|
714
|
-
return features.size();
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
public View getFeatureAt(int index) {
|
|
718
|
-
return features.get(index);
|
|
719
|
-
}
|
|
720
|
-
|
|
721
|
-
public void removeFeatureAt(int index) {
|
|
722
|
-
AirMapFeature feature = features.remove(index);
|
|
723
|
-
if (feature instanceof AirMapMarker) {
|
|
724
|
-
markerMap.remove(feature.getFeature());
|
|
725
|
-
} else if (feature instanceof AirMapHeatmap) {
|
|
726
|
-
heatmapMap.remove(feature.getFeature());
|
|
727
|
-
}
|
|
728
|
-
feature.removeFromMap(map);
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
public WritableMap makeClickEventData(LatLng point) {
|
|
732
|
-
WritableMap event = new WritableNativeMap();
|
|
733
|
-
|
|
734
|
-
WritableMap coordinate = new WritableNativeMap();
|
|
735
|
-
coordinate.putDouble("latitude", point.latitude);
|
|
736
|
-
coordinate.putDouble("longitude", point.longitude);
|
|
737
|
-
event.putMap("coordinate", coordinate);
|
|
738
|
-
|
|
739
|
-
Projection projection = map.getProjection();
|
|
740
|
-
Point screenPoint = projection.toScreenLocation(point);
|
|
741
|
-
|
|
742
|
-
WritableMap position = new WritableNativeMap();
|
|
743
|
-
position.putDouble("x", screenPoint.x);
|
|
744
|
-
position.putDouble("y", screenPoint.y);
|
|
745
|
-
event.putMap("position", position);
|
|
746
|
-
|
|
747
|
-
return event;
|
|
748
|
-
}
|
|
749
|
-
|
|
750
|
-
public void updateExtraData(Object extraData) {
|
|
751
|
-
// if boundsToMove is not null, we now have the MapView's width/height, so we can apply
|
|
752
|
-
// a proper camera move
|
|
753
|
-
if (boundsToMove != null) {
|
|
754
|
-
HashMap<String, Float> data = (HashMap<String, Float>) extraData;
|
|
755
|
-
int width = data.get("width") == null ? 0 : data.get("width").intValue();
|
|
756
|
-
int height = data.get("height") == null ? 0 : data.get("height").intValue();
|
|
757
|
-
|
|
758
|
-
//fix for https://github.com/react-native-maps/react-native-maps/issues/245,
|
|
759
|
-
//it's not guaranteed the passed-in height and width would be greater than 0.
|
|
760
|
-
if (width <= 0 || height <= 0) {
|
|
761
|
-
map.moveCamera(CameraUpdateFactory.newLatLngBounds(boundsToMove, 0));
|
|
762
|
-
} else {
|
|
763
|
-
map.moveCamera(CameraUpdateFactory.newLatLngBounds(boundsToMove, width, height, 0));
|
|
764
|
-
}
|
|
765
|
-
|
|
766
|
-
boundsToMove = null;
|
|
767
|
-
cameraToSet = null;
|
|
768
|
-
}
|
|
769
|
-
else if (cameraToSet != null) {
|
|
770
|
-
map.moveCamera(cameraToSet);
|
|
771
|
-
cameraToSet = null;
|
|
772
|
-
}
|
|
773
|
-
}
|
|
774
|
-
|
|
775
|
-
public void animateToCamera(ReadableMap camera, int duration) {
|
|
776
|
-
if (map == null) return;
|
|
777
|
-
CameraPosition.Builder builder = new CameraPosition.Builder(map.getCameraPosition());
|
|
778
|
-
if (camera.hasKey("zoom")) {
|
|
779
|
-
builder.zoom((float)camera.getDouble("zoom"));
|
|
780
|
-
}
|
|
781
|
-
if (camera.hasKey("heading")) {
|
|
782
|
-
builder.bearing((float)camera.getDouble("heading"));
|
|
783
|
-
}
|
|
784
|
-
if (camera.hasKey("pitch")) {
|
|
785
|
-
builder.tilt((float)camera.getDouble("pitch"));
|
|
786
|
-
}
|
|
787
|
-
if (camera.hasKey("center")) {
|
|
788
|
-
ReadableMap center = camera.getMap("center");
|
|
789
|
-
builder.target(new LatLng(center.getDouble("latitude"), center.getDouble("longitude")));
|
|
790
|
-
}
|
|
791
|
-
|
|
792
|
-
CameraUpdate update = CameraUpdateFactory.newCameraPosition(builder.build());
|
|
793
|
-
|
|
794
|
-
if (duration <= 0) {
|
|
795
|
-
map.moveCamera(update);
|
|
796
|
-
}
|
|
797
|
-
else {
|
|
798
|
-
map.animateCamera(update, duration, null);
|
|
799
|
-
}
|
|
800
|
-
}
|
|
801
|
-
|
|
802
|
-
public void animateToNavigation(LatLng location, float bearing, float angle, int duration) {
|
|
803
|
-
if (map == null) return;
|
|
804
|
-
CameraPosition cameraPosition = new CameraPosition.Builder(map.getCameraPosition())
|
|
805
|
-
.bearing(bearing)
|
|
806
|
-
.tilt(angle)
|
|
807
|
-
.target(location)
|
|
808
|
-
.build();
|
|
809
|
-
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition), duration, null);
|
|
810
|
-
}
|
|
811
|
-
|
|
812
|
-
public void animateToRegion(LatLngBounds bounds, int duration) {
|
|
813
|
-
if (map == null) return;
|
|
814
|
-
map.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0), duration, null);
|
|
815
|
-
}
|
|
816
|
-
|
|
817
|
-
public void animateToViewingAngle(float angle, int duration) {
|
|
818
|
-
if (map == null) return;
|
|
819
|
-
|
|
820
|
-
CameraPosition cameraPosition = new CameraPosition.Builder(map.getCameraPosition())
|
|
821
|
-
.tilt(angle)
|
|
822
|
-
.build();
|
|
823
|
-
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition), duration, null);
|
|
824
|
-
}
|
|
825
|
-
|
|
826
|
-
public void animateToBearing(float bearing, int duration) {
|
|
827
|
-
if (map == null) return;
|
|
828
|
-
CameraPosition cameraPosition = new CameraPosition.Builder(map.getCameraPosition())
|
|
829
|
-
.bearing(bearing)
|
|
830
|
-
.build();
|
|
831
|
-
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition), duration, null);
|
|
832
|
-
}
|
|
833
|
-
|
|
834
|
-
public void animateToCoordinate(LatLng coordinate, int duration) {
|
|
835
|
-
if (map == null) return;
|
|
836
|
-
map.animateCamera(CameraUpdateFactory.newLatLng(coordinate), duration, null);
|
|
837
|
-
}
|
|
838
|
-
|
|
839
|
-
public void fitToElements(ReadableMap edgePadding, boolean animated) {
|
|
840
|
-
if (map == null) return;
|
|
841
|
-
|
|
842
|
-
LatLngBounds.Builder builder = new LatLngBounds.Builder();
|
|
843
|
-
|
|
844
|
-
boolean addedPosition = false;
|
|
845
|
-
|
|
846
|
-
for (AirMapFeature feature : features) {
|
|
847
|
-
if (feature instanceof AirMapMarker) {
|
|
848
|
-
Marker marker = (Marker) feature.getFeature();
|
|
849
|
-
builder.include(marker.getPosition());
|
|
850
|
-
addedPosition = true;
|
|
851
|
-
}
|
|
852
|
-
// TODO(lmr): may want to include shapes / etc.
|
|
853
|
-
}
|
|
854
|
-
if (addedPosition) {
|
|
855
|
-
LatLngBounds bounds = builder.build();
|
|
856
|
-
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, baseMapPadding);
|
|
857
|
-
|
|
858
|
-
if (edgePadding != null) {
|
|
859
|
-
map.setPadding(edgePadding.getInt("left"), edgePadding.getInt("top"),
|
|
860
|
-
edgePadding.getInt("right"), edgePadding.getInt("bottom"));
|
|
861
|
-
}
|
|
862
|
-
|
|
863
|
-
if (animated) {
|
|
864
|
-
map.animateCamera(cu);
|
|
865
|
-
} else {
|
|
866
|
-
map.moveCamera(cu);
|
|
867
|
-
}
|
|
868
|
-
}
|
|
869
|
-
}
|
|
870
|
-
|
|
871
|
-
public void fitToSuppliedMarkers(ReadableArray markerIDsArray, ReadableMap edgePadding, boolean animated) {
|
|
872
|
-
if (map == null) return;
|
|
873
|
-
|
|
874
|
-
LatLngBounds.Builder builder = new LatLngBounds.Builder();
|
|
875
|
-
|
|
876
|
-
String[] markerIDs = new String[markerIDsArray.size()];
|
|
877
|
-
for (int i = 0; i < markerIDsArray.size(); i++) {
|
|
878
|
-
markerIDs[i] = markerIDsArray.getString(i);
|
|
879
|
-
}
|
|
880
|
-
|
|
881
|
-
boolean addedPosition = false;
|
|
882
|
-
|
|
883
|
-
List<String> markerIDList = Arrays.asList(markerIDs);
|
|
884
|
-
|
|
885
|
-
for (AirMapFeature feature : features) {
|
|
886
|
-
if (feature instanceof AirMapMarker) {
|
|
887
|
-
String identifier = ((AirMapMarker) feature).getIdentifier();
|
|
888
|
-
Marker marker = (Marker) feature.getFeature();
|
|
889
|
-
if (markerIDList.contains(identifier)) {
|
|
890
|
-
builder.include(marker.getPosition());
|
|
891
|
-
addedPosition = true;
|
|
892
|
-
}
|
|
893
|
-
}
|
|
894
|
-
}
|
|
895
|
-
|
|
896
|
-
if (addedPosition) {
|
|
897
|
-
LatLngBounds bounds = builder.build();
|
|
898
|
-
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, baseMapPadding);
|
|
899
|
-
|
|
900
|
-
if (edgePadding != null) {
|
|
901
|
-
map.setPadding(edgePadding.getInt("left"), edgePadding.getInt("top"),
|
|
902
|
-
edgePadding.getInt("right"), edgePadding.getInt("bottom"));
|
|
903
|
-
}
|
|
904
|
-
|
|
905
|
-
if (animated) {
|
|
906
|
-
map.animateCamera(cu);
|
|
907
|
-
} else {
|
|
908
|
-
map.moveCamera(cu);
|
|
909
|
-
}
|
|
910
|
-
}
|
|
911
|
-
}
|
|
912
|
-
|
|
913
|
-
int baseLeftMapPadding;
|
|
914
|
-
int baseRightMapPadding;
|
|
915
|
-
int baseTopMapPadding;
|
|
916
|
-
int baseBottomMapPadding;
|
|
917
|
-
|
|
918
|
-
public void applyBaseMapPadding(int left, int top, int right, int bottom){
|
|
919
|
-
this.map.setPadding(left, top, right, bottom);
|
|
920
|
-
baseLeftMapPadding = left;
|
|
921
|
-
baseRightMapPadding = right;
|
|
922
|
-
baseTopMapPadding = top;
|
|
923
|
-
baseBottomMapPadding = bottom;
|
|
924
|
-
}
|
|
925
|
-
|
|
926
|
-
public void fitToCoordinates(ReadableArray coordinatesArray, ReadableMap edgePadding,
|
|
927
|
-
boolean animated) {
|
|
928
|
-
if (map == null) return;
|
|
929
|
-
|
|
930
|
-
LatLngBounds.Builder builder = new LatLngBounds.Builder();
|
|
931
|
-
|
|
932
|
-
for (int i = 0; i < coordinatesArray.size(); i++) {
|
|
933
|
-
ReadableMap latLng = coordinatesArray.getMap(i);
|
|
934
|
-
Double lat = latLng.getDouble("latitude");
|
|
935
|
-
Double lng = latLng.getDouble("longitude");
|
|
936
|
-
builder.include(new LatLng(lat, lng));
|
|
937
|
-
}
|
|
938
|
-
|
|
939
|
-
LatLngBounds bounds = builder.build();
|
|
940
|
-
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, baseMapPadding);
|
|
941
|
-
|
|
942
|
-
if (edgePadding != null) {
|
|
943
|
-
appendMapPadding(edgePadding.getInt("left"), edgePadding.getInt("top"), edgePadding.getInt("right"), edgePadding.getInt("bottom"));
|
|
944
|
-
}
|
|
945
|
-
|
|
946
|
-
if (animated) {
|
|
947
|
-
map.animateCamera(cu);
|
|
948
|
-
} else {
|
|
949
|
-
map.moveCamera(cu);
|
|
950
|
-
}
|
|
951
|
-
// Move the google logo to the default base padding value.
|
|
952
|
-
map.setPadding(baseLeftMapPadding, baseTopMapPadding, baseRightMapPadding, baseBottomMapPadding);
|
|
953
|
-
}
|
|
954
|
-
|
|
955
|
-
private void appendMapPadding(int iLeft,int iTop, int iRight, int iBottom) {
|
|
956
|
-
int left;
|
|
957
|
-
int top;
|
|
958
|
-
int right;
|
|
959
|
-
int bottom;
|
|
960
|
-
double density = getResources().getDisplayMetrics().density;
|
|
961
|
-
|
|
962
|
-
left = (int) (iLeft * density);
|
|
963
|
-
top = (int) (iTop * density);
|
|
964
|
-
right = (int) (iRight * density);
|
|
965
|
-
bottom = (int) (iBottom * density);
|
|
966
|
-
|
|
967
|
-
map.setPadding(left + baseLeftMapPadding,
|
|
968
|
-
top + baseTopMapPadding,
|
|
969
|
-
right + baseRightMapPadding,
|
|
970
|
-
bottom + baseBottomMapPadding);
|
|
971
|
-
}
|
|
972
|
-
|
|
973
|
-
public double[][] getMapBoundaries() {
|
|
974
|
-
LatLngBounds bounds = map.getProjection().getVisibleRegion().latLngBounds;
|
|
975
|
-
LatLng northEast = bounds.northeast;
|
|
976
|
-
LatLng southWest = bounds.southwest;
|
|
977
|
-
|
|
978
|
-
return new double[][] {
|
|
979
|
-
{northEast.longitude, northEast.latitude},
|
|
980
|
-
{southWest.longitude, southWest.latitude}
|
|
981
|
-
};
|
|
982
|
-
}
|
|
983
|
-
|
|
984
|
-
public void setMapBoundaries(ReadableMap northEast, ReadableMap southWest) {
|
|
985
|
-
if (map == null) return;
|
|
986
|
-
|
|
987
|
-
LatLngBounds.Builder builder = new LatLngBounds.Builder();
|
|
988
|
-
|
|
989
|
-
Double latNE = northEast.getDouble("latitude");
|
|
990
|
-
Double lngNE = northEast.getDouble("longitude");
|
|
991
|
-
builder.include(new LatLng(latNE, lngNE));
|
|
992
|
-
|
|
993
|
-
Double latSW = southWest.getDouble("latitude");
|
|
994
|
-
Double lngSW = southWest.getDouble("longitude");
|
|
995
|
-
builder.include(new LatLng(latSW, lngSW));
|
|
996
|
-
|
|
997
|
-
LatLngBounds bounds = builder.build();
|
|
998
|
-
|
|
999
|
-
map.setLatLngBoundsForCameraTarget(bounds);
|
|
1000
|
-
}
|
|
1001
|
-
|
|
1002
|
-
// InfoWindowAdapter interface
|
|
1003
|
-
|
|
1004
|
-
@Override
|
|
1005
|
-
public View getInfoWindow(Marker marker) {
|
|
1006
|
-
AirMapMarker markerView = getMarkerMap(marker);
|
|
1007
|
-
return markerView.getCallout();
|
|
1008
|
-
}
|
|
1009
|
-
|
|
1010
|
-
@Override
|
|
1011
|
-
public View getInfoContents(Marker marker) {
|
|
1012
|
-
AirMapMarker markerView = getMarkerMap(marker);
|
|
1013
|
-
return markerView.getInfoContents();
|
|
1014
|
-
}
|
|
1015
|
-
|
|
1016
|
-
@Override
|
|
1017
|
-
public boolean dispatchTouchEvent(MotionEvent ev) {
|
|
1018
|
-
gestureDetector.onTouchEvent(ev);
|
|
1019
|
-
|
|
1020
|
-
int X = (int)ev.getX();
|
|
1021
|
-
int Y = (int)ev.getY();
|
|
1022
|
-
if(map != null) {
|
|
1023
|
-
tapLocation = map.getProjection().fromScreenLocation(new Point(X,Y));
|
|
1024
|
-
}
|
|
1025
|
-
|
|
1026
|
-
int action = MotionEventCompat.getActionMasked(ev);
|
|
1027
|
-
|
|
1028
|
-
switch (action) {
|
|
1029
|
-
case (MotionEvent.ACTION_DOWN):
|
|
1030
|
-
this.getParent().requestDisallowInterceptTouchEvent(
|
|
1031
|
-
map != null && map.getUiSettings().isScrollGesturesEnabled());
|
|
1032
|
-
break;
|
|
1033
|
-
case (MotionEvent.ACTION_UP):
|
|
1034
|
-
// Clear this regardless, since isScrollGesturesEnabled() may have been updated
|
|
1035
|
-
this.getParent().requestDisallowInterceptTouchEvent(false);
|
|
1036
|
-
break;
|
|
1037
|
-
}
|
|
1038
|
-
super.dispatchTouchEvent(ev);
|
|
1039
|
-
return true;
|
|
1040
|
-
}
|
|
1041
|
-
|
|
1042
|
-
@Override
|
|
1043
|
-
public void onMarkerDragStart(Marker marker) {
|
|
1044
|
-
WritableMap event = makeClickEventData(marker.getPosition());
|
|
1045
|
-
manager.pushEvent(context, this, "onMarkerDragStart", event);
|
|
1046
|
-
|
|
1047
|
-
AirMapMarker markerView = getMarkerMap(marker);
|
|
1048
|
-
event = makeClickEventData(marker.getPosition());
|
|
1049
|
-
manager.pushEvent(context, markerView, "onDragStart", event);
|
|
1050
|
-
}
|
|
1051
|
-
|
|
1052
|
-
@Override
|
|
1053
|
-
public void onMarkerDrag(Marker marker) {
|
|
1054
|
-
WritableMap event = makeClickEventData(marker.getPosition());
|
|
1055
|
-
manager.pushEvent(context, this, "onMarkerDrag", event);
|
|
1056
|
-
|
|
1057
|
-
AirMapMarker markerView = getMarkerMap(marker);
|
|
1058
|
-
event = makeClickEventData(marker.getPosition());
|
|
1059
|
-
manager.pushEvent(context, markerView, "onDrag", event);
|
|
1060
|
-
}
|
|
1061
|
-
|
|
1062
|
-
@Override
|
|
1063
|
-
public void onMarkerDragEnd(Marker marker) {
|
|
1064
|
-
WritableMap event = makeClickEventData(marker.getPosition());
|
|
1065
|
-
manager.pushEvent(context, this, "onMarkerDragEnd", event);
|
|
1066
|
-
|
|
1067
|
-
AirMapMarker markerView = getMarkerMap(marker);
|
|
1068
|
-
event = makeClickEventData(marker.getPosition());
|
|
1069
|
-
manager.pushEvent(context, markerView, "onDragEnd", event);
|
|
1070
|
-
}
|
|
1071
|
-
|
|
1072
|
-
@Override
|
|
1073
|
-
public void onPoiClick(PointOfInterest poi) {
|
|
1074
|
-
WritableMap event = makeClickEventData(poi.latLng);
|
|
1075
|
-
|
|
1076
|
-
event.putString("placeId", poi.placeId);
|
|
1077
|
-
event.putString("name", poi.name);
|
|
1078
|
-
|
|
1079
|
-
manager.pushEvent(context, this, "onPoiClick", event);
|
|
1080
|
-
}
|
|
1081
|
-
|
|
1082
|
-
private ProgressBar getMapLoadingProgressBar() {
|
|
1083
|
-
if (this.mapLoadingProgressBar == null) {
|
|
1084
|
-
this.mapLoadingProgressBar = new ProgressBar(getContext());
|
|
1085
|
-
this.mapLoadingProgressBar.setIndeterminate(true);
|
|
1086
|
-
}
|
|
1087
|
-
if (this.loadingIndicatorColor != null) {
|
|
1088
|
-
this.setLoadingIndicatorColor(this.loadingIndicatorColor);
|
|
1089
|
-
}
|
|
1090
|
-
return this.mapLoadingProgressBar;
|
|
1091
|
-
}
|
|
1092
|
-
|
|
1093
|
-
private RelativeLayout getMapLoadingLayoutView() {
|
|
1094
|
-
if (this.mapLoadingLayout == null) {
|
|
1095
|
-
this.mapLoadingLayout = new RelativeLayout(getContext());
|
|
1096
|
-
this.mapLoadingLayout.setBackgroundColor(Color.LTGRAY);
|
|
1097
|
-
this.addView(this.mapLoadingLayout,
|
|
1098
|
-
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
|
|
1099
|
-
ViewGroup.LayoutParams.MATCH_PARENT));
|
|
1100
|
-
|
|
1101
|
-
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
|
|
1102
|
-
RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
|
|
1103
|
-
params.addRule(RelativeLayout.CENTER_IN_PARENT);
|
|
1104
|
-
this.mapLoadingLayout.addView(this.getMapLoadingProgressBar(), params);
|
|
1105
|
-
|
|
1106
|
-
this.mapLoadingLayout.setVisibility(View.INVISIBLE);
|
|
1107
|
-
}
|
|
1108
|
-
this.setLoadingBackgroundColor(this.loadingBackgroundColor);
|
|
1109
|
-
return this.mapLoadingLayout;
|
|
1110
|
-
}
|
|
1111
|
-
|
|
1112
|
-
private ImageView getCacheImageView() {
|
|
1113
|
-
if (this.cacheImageView == null) {
|
|
1114
|
-
this.cacheImageView = new ImageView(getContext());
|
|
1115
|
-
this.addView(this.cacheImageView,
|
|
1116
|
-
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
|
|
1117
|
-
ViewGroup.LayoutParams.MATCH_PARENT));
|
|
1118
|
-
this.cacheImageView.setVisibility(View.INVISIBLE);
|
|
1119
|
-
}
|
|
1120
|
-
return this.cacheImageView;
|
|
1121
|
-
}
|
|
1122
|
-
|
|
1123
|
-
private void removeCacheImageView() {
|
|
1124
|
-
if (this.cacheImageView != null) {
|
|
1125
|
-
((ViewGroup) this.cacheImageView.getParent()).removeView(this.cacheImageView);
|
|
1126
|
-
this.cacheImageView = null;
|
|
1127
|
-
}
|
|
1128
|
-
}
|
|
1129
|
-
|
|
1130
|
-
private void removeMapLoadingProgressBar() {
|
|
1131
|
-
if (this.mapLoadingProgressBar != null) {
|
|
1132
|
-
((ViewGroup) this.mapLoadingProgressBar.getParent()).removeView(this.mapLoadingProgressBar);
|
|
1133
|
-
this.mapLoadingProgressBar = null;
|
|
1134
|
-
}
|
|
1135
|
-
}
|
|
1136
|
-
|
|
1137
|
-
private void removeMapLoadingLayoutView() {
|
|
1138
|
-
this.removeMapLoadingProgressBar();
|
|
1139
|
-
if (this.mapLoadingLayout != null) {
|
|
1140
|
-
((ViewGroup) this.mapLoadingLayout.getParent()).removeView(this.mapLoadingLayout);
|
|
1141
|
-
this.mapLoadingLayout = null;
|
|
1142
|
-
}
|
|
1143
|
-
}
|
|
1144
|
-
|
|
1145
|
-
private void cacheView() {
|
|
1146
|
-
if (this.cacheEnabled) {
|
|
1147
|
-
final ImageView cacheImageView = this.getCacheImageView();
|
|
1148
|
-
final RelativeLayout mapLoadingLayout = this.getMapLoadingLayoutView();
|
|
1149
|
-
cacheImageView.setVisibility(View.INVISIBLE);
|
|
1150
|
-
mapLoadingLayout.setVisibility(View.VISIBLE);
|
|
1151
|
-
if (this.isMapLoaded) {
|
|
1152
|
-
this.map.snapshot(new GoogleMap.SnapshotReadyCallback() {
|
|
1153
|
-
@Override public void onSnapshotReady(Bitmap bitmap) {
|
|
1154
|
-
cacheImageView.setImageBitmap(bitmap);
|
|
1155
|
-
cacheImageView.setVisibility(View.VISIBLE);
|
|
1156
|
-
mapLoadingLayout.setVisibility(View.INVISIBLE);
|
|
1157
|
-
}
|
|
1158
|
-
});
|
|
1159
|
-
}
|
|
1160
|
-
} else {
|
|
1161
|
-
this.removeCacheImageView();
|
|
1162
|
-
if (this.isMapLoaded) {
|
|
1163
|
-
this.removeMapLoadingLayoutView();
|
|
1164
|
-
}
|
|
1165
|
-
}
|
|
1166
|
-
}
|
|
1167
|
-
|
|
1168
|
-
public void onPanDrag(MotionEvent ev) {
|
|
1169
|
-
Point point = new Point((int) ev.getX(), (int) ev.getY());
|
|
1170
|
-
LatLng coords = this.map.getProjection().fromScreenLocation(point);
|
|
1171
|
-
WritableMap event = makeClickEventData(coords);
|
|
1172
|
-
manager.pushEvent(context, this, "onPanDrag", event);
|
|
1173
|
-
}
|
|
1174
|
-
|
|
1175
|
-
public void onDoublePress(MotionEvent ev) {
|
|
1176
|
-
if (this.map == null) return;
|
|
1177
|
-
Point point = new Point((int) ev.getX(), (int) ev.getY());
|
|
1178
|
-
LatLng coords = this.map.getProjection().fromScreenLocation(point);
|
|
1179
|
-
WritableMap event = makeClickEventData(coords);
|
|
1180
|
-
manager.pushEvent(context, this, "onDoublePress", event);
|
|
1181
|
-
}
|
|
1182
|
-
|
|
1183
|
-
public void setKmlSrc(String kmlSrc) {
|
|
1184
|
-
try {
|
|
1185
|
-
InputStream kmlStream = new FileUtil(context).execute(kmlSrc).get();
|
|
1186
|
-
|
|
1187
|
-
if (kmlStream == null) {
|
|
1188
|
-
return;
|
|
1189
|
-
}
|
|
1190
|
-
|
|
1191
|
-
kmlLayer = new KmlLayer(map, kmlStream, context);
|
|
1192
|
-
kmlLayer.addLayerToMap();
|
|
1193
|
-
|
|
1194
|
-
WritableMap pointers = new WritableNativeMap();
|
|
1195
|
-
WritableArray markers = new WritableNativeArray();
|
|
1196
|
-
|
|
1197
|
-
if (kmlLayer.getContainers() == null) {
|
|
1198
|
-
manager.pushEvent(context, this, "onKmlReady", pointers);
|
|
1199
|
-
return;
|
|
1200
|
-
}
|
|
1201
|
-
|
|
1202
|
-
//Retrieve a nested container within the first container
|
|
1203
|
-
KmlContainer container = kmlLayer.getContainers().iterator().next();
|
|
1204
|
-
if (container == null || container.getContainers() == null) {
|
|
1205
|
-
manager.pushEvent(context, this, "onKmlReady", pointers);
|
|
1206
|
-
return;
|
|
1207
|
-
}
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
if (container.getContainers().iterator().hasNext()) {
|
|
1211
|
-
container = container.getContainers().iterator().next();
|
|
1212
|
-
}
|
|
1213
|
-
|
|
1214
|
-
Integer index = 0;
|
|
1215
|
-
for (KmlPlacemark placemark : container.getPlacemarks()) {
|
|
1216
|
-
MarkerOptions options = new MarkerOptions();
|
|
1217
|
-
|
|
1218
|
-
if (placemark.getInlineStyle() != null) {
|
|
1219
|
-
options = placemark.getMarkerOptions();
|
|
1220
|
-
} else {
|
|
1221
|
-
options.icon(BitmapDescriptorFactory.defaultMarker());
|
|
1222
|
-
}
|
|
1223
|
-
|
|
1224
|
-
LatLng latLng = ((LatLng) placemark.getGeometry().getGeometryObject());
|
|
1225
|
-
String title = "";
|
|
1226
|
-
String snippet = "";
|
|
1227
|
-
|
|
1228
|
-
if (placemark.hasProperty("name")) {
|
|
1229
|
-
title = placemark.getProperty("name");
|
|
1230
|
-
}
|
|
1231
|
-
|
|
1232
|
-
if (placemark.hasProperty("description")) {
|
|
1233
|
-
snippet = placemark.getProperty("description");
|
|
1234
|
-
}
|
|
1235
|
-
|
|
1236
|
-
options.position(latLng);
|
|
1237
|
-
options.title(title);
|
|
1238
|
-
options.snippet(snippet);
|
|
1239
|
-
|
|
1240
|
-
AirMapMarker marker = new AirMapMarker(context, options, this.manager.getMarkerManager());
|
|
1241
|
-
|
|
1242
|
-
if (placemark.getInlineStyle() != null
|
|
1243
|
-
&& placemark.getInlineStyle().getIconUrl() != null) {
|
|
1244
|
-
marker.setImage(placemark.getInlineStyle().getIconUrl());
|
|
1245
|
-
} else if (container.getStyle(placemark.getStyleId()) != null) {
|
|
1246
|
-
KmlStyle style = container.getStyle(placemark.getStyleId());
|
|
1247
|
-
marker.setImage(style.getIconUrl());
|
|
1248
|
-
}
|
|
1249
|
-
|
|
1250
|
-
String identifier = title + " - " + index;
|
|
1251
|
-
|
|
1252
|
-
marker.setIdentifier(identifier);
|
|
1253
|
-
|
|
1254
|
-
addFeature(marker, index++);
|
|
1255
|
-
|
|
1256
|
-
WritableMap loadedMarker = makeClickEventData(latLng);
|
|
1257
|
-
loadedMarker.putString("id", identifier);
|
|
1258
|
-
loadedMarker.putString("title", title);
|
|
1259
|
-
loadedMarker.putString("description", snippet);
|
|
1260
|
-
|
|
1261
|
-
markers.pushMap(loadedMarker);
|
|
1262
|
-
}
|
|
1263
|
-
|
|
1264
|
-
pointers.putArray("markers", markers);
|
|
1265
|
-
|
|
1266
|
-
manager.pushEvent(context, this, "onKmlReady", pointers);
|
|
1267
|
-
|
|
1268
|
-
} catch (XmlPullParserException e) {
|
|
1269
|
-
e.printStackTrace();
|
|
1270
|
-
} catch (IOException e) {
|
|
1271
|
-
e.printStackTrace();
|
|
1272
|
-
} catch (InterruptedException e) {
|
|
1273
|
-
e.printStackTrace();
|
|
1274
|
-
} catch (ExecutionException e) {
|
|
1275
|
-
e.printStackTrace();
|
|
1276
|
-
}
|
|
1277
|
-
}
|
|
1278
|
-
|
|
1279
|
-
@Override
|
|
1280
|
-
public void onIndoorBuildingFocused() {
|
|
1281
|
-
IndoorBuilding building = this.map.getFocusedBuilding();
|
|
1282
|
-
if (building != null) {
|
|
1283
|
-
List<IndoorLevel> levels = building.getLevels();
|
|
1284
|
-
int index = 0;
|
|
1285
|
-
WritableArray levelsArray = Arguments.createArray();
|
|
1286
|
-
for (IndoorLevel level : levels) {
|
|
1287
|
-
WritableMap levelMap = Arguments.createMap();
|
|
1288
|
-
levelMap.putInt("index", index);
|
|
1289
|
-
levelMap.putString("name", level.getName());
|
|
1290
|
-
levelMap.putString("shortName", level.getShortName());
|
|
1291
|
-
levelsArray.pushMap(levelMap);
|
|
1292
|
-
index++;
|
|
1293
|
-
}
|
|
1294
|
-
WritableMap event = Arguments.createMap();
|
|
1295
|
-
WritableMap indoorBuilding = Arguments.createMap();
|
|
1296
|
-
indoorBuilding.putArray("levels", levelsArray);
|
|
1297
|
-
indoorBuilding.putInt("activeLevelIndex", building.getActiveLevelIndex());
|
|
1298
|
-
indoorBuilding.putBoolean("underground", building.isUnderground());
|
|
1299
|
-
|
|
1300
|
-
event.putMap("IndoorBuilding", indoorBuilding);
|
|
1301
|
-
|
|
1302
|
-
manager.pushEvent(context, this, "onIndoorBuildingFocused", event);
|
|
1303
|
-
} else {
|
|
1304
|
-
WritableMap event = Arguments.createMap();
|
|
1305
|
-
WritableArray levelsArray = Arguments.createArray();
|
|
1306
|
-
WritableMap indoorBuilding = Arguments.createMap();
|
|
1307
|
-
indoorBuilding.putArray("levels", levelsArray);
|
|
1308
|
-
indoorBuilding.putInt("activeLevelIndex", 0);
|
|
1309
|
-
indoorBuilding.putBoolean("underground", false);
|
|
1310
|
-
|
|
1311
|
-
event.putMap("IndoorBuilding", indoorBuilding);
|
|
1312
|
-
|
|
1313
|
-
manager.pushEvent(context, this, "onIndoorBuildingFocused", event);
|
|
1314
|
-
}
|
|
1315
|
-
}
|
|
1316
|
-
|
|
1317
|
-
@Override
|
|
1318
|
-
public void onIndoorLevelActivated(IndoorBuilding building) {
|
|
1319
|
-
if (building == null) {
|
|
1320
|
-
return;
|
|
1321
|
-
}
|
|
1322
|
-
int activeLevelIndex = building.getActiveLevelIndex();
|
|
1323
|
-
if (activeLevelIndex < 0 || activeLevelIndex >= building.getLevels().size()) {
|
|
1324
|
-
return;
|
|
1325
|
-
}
|
|
1326
|
-
IndoorLevel level = building.getLevels().get(activeLevelIndex);
|
|
1327
|
-
|
|
1328
|
-
WritableMap event = Arguments.createMap();
|
|
1329
|
-
WritableMap indoorlevel = Arguments.createMap();
|
|
1330
|
-
|
|
1331
|
-
indoorlevel.putInt("activeLevelIndex", activeLevelIndex);
|
|
1332
|
-
indoorlevel.putString("name", level.getName());
|
|
1333
|
-
indoorlevel.putString("shortName", level.getShortName());
|
|
1334
|
-
|
|
1335
|
-
event.putMap("IndoorLevel", indoorlevel);
|
|
1336
|
-
|
|
1337
|
-
manager.pushEvent(context, this, "onIndoorLevelActivated", event);
|
|
1338
|
-
}
|
|
1339
|
-
|
|
1340
|
-
public void setIndoorActiveLevelIndex(int activeLevelIndex) {
|
|
1341
|
-
IndoorBuilding building = this.map.getFocusedBuilding();
|
|
1342
|
-
if (building != null) {
|
|
1343
|
-
if (activeLevelIndex >= 0 && activeLevelIndex < building.getLevels().size()) {
|
|
1344
|
-
IndoorLevel level = building.getLevels().get(activeLevelIndex);
|
|
1345
|
-
if (level != null) {
|
|
1346
|
-
level.activate();
|
|
1347
|
-
}
|
|
1348
|
-
}
|
|
1349
|
-
}
|
|
1350
|
-
}
|
|
1351
|
-
|
|
1352
|
-
private AirMapMarker getMarkerMap(Marker marker) {
|
|
1353
|
-
AirMapMarker airMarker = markerMap.get(marker);
|
|
1354
|
-
|
|
1355
|
-
if (airMarker != null) {
|
|
1356
|
-
return airMarker;
|
|
1357
|
-
}
|
|
1358
|
-
|
|
1359
|
-
for (Map.Entry<Marker, AirMapMarker> entryMarker : markerMap.entrySet()) {
|
|
1360
|
-
if (entryMarker.getKey().getPosition().equals(marker.getPosition())
|
|
1361
|
-
&& entryMarker.getKey().getTitle().equals(marker.getTitle())) {
|
|
1362
|
-
airMarker = entryMarker.getValue();
|
|
1363
|
-
break;
|
|
1364
|
-
}
|
|
1365
|
-
}
|
|
1366
|
-
|
|
1367
|
-
return airMarker;
|
|
1368
|
-
}
|
|
1369
|
-
|
|
1370
|
-
@Override
|
|
1371
|
-
public void requestLayout() {
|
|
1372
|
-
super.requestLayout();
|
|
1373
|
-
post(measureAndLayout);
|
|
1374
|
-
}
|
|
1375
|
-
|
|
1376
|
-
private final Runnable measureAndLayout = new Runnable() {
|
|
1377
|
-
@Override
|
|
1378
|
-
public void run() {
|
|
1379
|
-
measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY),
|
|
1380
|
-
MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY));
|
|
1381
|
-
layout(getLeft(), getTop(), getRight(), getBottom());
|
|
1382
|
-
}
|
|
1383
|
-
};
|
|
1384
|
-
}
|