@lugg/maps 0.2.0-alpha.9 → 1.0.0-beta.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/README.md +21 -20
- package/android/build.gradle +1 -1
- package/android/src/main/java/com/luggmaps/LuggCalloutView.kt +74 -0
- package/android/src/main/java/com/luggmaps/LuggCalloutViewManager.kt +38 -0
- package/android/src/main/java/com/luggmaps/LuggMapView.kt +290 -0
- package/android/src/main/java/com/luggmaps/{LuggGoogleMapViewManager.kt → LuggMapViewManager.kt} +99 -36
- package/android/src/main/java/com/luggmaps/LuggMapWrapperView.kt +11 -14
- package/android/src/main/java/com/luggmaps/LuggMarkerView.kt +187 -21
- package/android/src/main/java/com/luggmaps/LuggMarkerViewManager.kt +28 -0
- package/android/src/main/java/com/luggmaps/LuggPackage.kt +8 -4
- package/android/src/main/java/com/luggmaps/LuggPolygonView.kt +85 -0
- package/android/src/main/java/com/luggmaps/LuggPolygonViewManager.kt +100 -0
- package/android/src/main/java/com/luggmaps/LuggPolylineView.kt +16 -0
- package/android/src/main/java/com/luggmaps/LuggPolylineViewManager.kt +22 -0
- package/android/src/main/java/com/luggmaps/core/GoogleMapProvider.kt +874 -0
- package/android/src/main/java/com/luggmaps/core/MapProviderDelegate.kt +60 -0
- package/android/src/main/java/com/luggmaps/core/PolylineAnimator.kt +89 -24
- package/android/src/main/java/com/luggmaps/events/LongPressEvent.kt +29 -0
- package/android/src/main/java/com/luggmaps/events/MarkerDragEvent.kt +41 -0
- package/android/src/main/java/com/luggmaps/events/MarkerPressEvent.kt +34 -0
- package/android/src/main/java/com/luggmaps/events/PolygonPressEvent.kt +12 -0
- package/android/src/main/java/com/luggmaps/events/PressEvent.kt +29 -0
- package/ios/LuggCalloutView.h +23 -0
- package/ios/LuggCalloutView.mm +145 -0
- package/ios/LuggMapView.h +9 -0
- package/ios/LuggMapView.mm +343 -0
- package/ios/LuggMarkerView.h +15 -0
- package/ios/LuggMarkerView.mm +136 -2
- package/ios/LuggPolygonView.h +31 -0
- package/ios/LuggPolygonView.mm +151 -0
- package/ios/LuggPolylineView.h +4 -0
- package/ios/LuggPolylineView.mm +23 -0
- package/ios/core/AppleMapProvider.h +15 -0
- package/ios/core/AppleMapProvider.mm +1173 -0
- package/ios/core/GMSPolylineAnimator.h +3 -0
- package/ios/core/GMSPolylineAnimator.m +101 -15
- package/ios/core/GoogleMapProvider.h +13 -0
- package/ios/core/GoogleMapProvider.mm +798 -0
- package/ios/core/LuggAnnotationView.h +12 -0
- package/ios/core/LuggAnnotationView.mm +55 -0
- package/ios/core/MKPolylineAnimator.h +4 -0
- package/ios/core/MKPolylineAnimator.m +167 -42
- package/ios/core/MapProviderDelegate.h +84 -0
- package/ios/core/PolylineAnimatorBase.h +24 -1
- package/ios/core/PolylineAnimatorBase.m +82 -19
- package/ios/events/LongPressEvent.h +29 -0
- package/ios/events/MarkerDragEvent.h +69 -0
- package/ios/events/MarkerPressEvent.h +29 -0
- package/ios/events/PolygonPressEvent.h +20 -0
- package/ios/events/PressEvent.h +29 -0
- package/ios/extensions/MKMapView+Zoom.h +2 -0
- package/ios/extensions/MKMapView+Zoom.m +14 -4
- package/lib/module/MapProvider.js +2 -4
- package/lib/module/MapProvider.js.map +1 -1
- package/lib/module/MapProvider.web.js +14 -7
- package/lib/module/MapProvider.web.js.map +1 -1
- package/lib/module/MapView.js +33 -16
- package/lib/module/MapView.js.map +1 -1
- package/lib/module/MapView.web.js +296 -181
- package/lib/module/MapView.web.js.map +1 -1
- package/lib/module/components/GeoJson.js +159 -0
- package/lib/module/components/GeoJson.js.map +1 -0
- package/lib/module/components/GeoJson.types.js +4 -0
- package/lib/module/components/GeoJson.types.js.map +1 -0
- package/lib/module/components/Marker.js +49 -8
- package/lib/module/components/Marker.js.map +1 -1
- package/lib/module/components/Marker.types.js +4 -0
- package/lib/module/components/Marker.types.js.map +1 -0
- package/lib/module/components/Marker.web.js +159 -24
- package/lib/module/components/Marker.web.js.map +1 -1
- package/lib/module/components/Polygon.js +46 -0
- package/lib/module/components/Polygon.js.map +1 -0
- package/lib/module/components/Polygon.types.js +4 -0
- package/lib/module/components/Polygon.types.js.map +1 -0
- package/lib/module/components/Polygon.web.js +87 -0
- package/lib/module/components/Polygon.web.js.map +1 -0
- package/lib/module/components/Polyline.js +17 -4
- package/lib/module/components/Polyline.js.map +1 -1
- package/lib/module/components/Polyline.types.js +4 -0
- package/lib/module/components/Polyline.types.js.map +1 -0
- package/lib/module/components/Polyline.web.js +108 -31
- package/lib/module/components/Polyline.web.js.map +1 -1
- package/lib/module/components/index.js +4 -2
- package/lib/module/components/index.js.map +1 -1
- package/lib/module/components/index.web.js +2 -0
- package/lib/module/components/index.web.js.map +1 -1
- package/lib/module/fabric/LuggCalloutViewNativeComponent.ts +20 -0
- package/lib/module/fabric/{LuggGoogleMapViewNativeComponent.ts → LuggMapViewNativeComponent.ts} +43 -7
- package/lib/module/fabric/LuggMarkerViewNativeComponent.ts +49 -1
- package/lib/module/fabric/LuggPolygonViewNativeComponent.ts +25 -0
- package/lib/module/fabric/LuggPolylineViewNativeComponent.ts +8 -0
- package/lib/module/index.js +4 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +4 -1
- package/lib/module/index.web.js.map +1 -1
- package/lib/typescript/src/MapProvider.d.ts +1 -1
- package/lib/typescript/src/MapProvider.d.ts.map +1 -1
- package/lib/typescript/src/MapProvider.web.d.ts +23 -1
- package/lib/typescript/src/MapProvider.web.d.ts.map +1 -1
- package/lib/typescript/src/MapView.d.ts +4 -4
- package/lib/typescript/src/MapView.d.ts.map +1 -1
- package/lib/typescript/src/MapView.types.d.ts +35 -9
- package/lib/typescript/src/MapView.types.d.ts.map +1 -1
- package/lib/typescript/src/MapView.web.d.ts +2 -11
- package/lib/typescript/src/MapView.web.d.ts.map +1 -1
- package/lib/typescript/src/components/GeoJson.d.ts +4 -0
- package/lib/typescript/src/components/GeoJson.d.ts.map +1 -0
- package/lib/typescript/src/components/GeoJson.types.d.ts +89 -0
- package/lib/typescript/src/components/GeoJson.types.d.ts.map +1 -0
- package/lib/typescript/src/components/Marker.d.ts +6 -33
- package/lib/typescript/src/components/Marker.d.ts.map +1 -1
- package/lib/typescript/src/components/Marker.types.d.ts +100 -0
- package/lib/typescript/src/components/Marker.types.d.ts.map +1 -0
- package/lib/typescript/src/components/Marker.web.d.ts +2 -5
- package/lib/typescript/src/components/Marker.web.d.ts.map +1 -1
- package/lib/typescript/src/components/Polygon.d.ts +10 -0
- package/lib/typescript/src/components/Polygon.d.ts.map +1 -0
- package/lib/typescript/src/components/Polygon.types.d.ts +33 -0
- package/lib/typescript/src/components/Polygon.types.d.ts.map +1 -0
- package/lib/typescript/src/components/Polygon.web.d.ts +3 -0
- package/lib/typescript/src/components/Polygon.web.d.ts.map +1 -0
- package/lib/typescript/src/components/Polyline.d.ts +6 -21
- package/lib/typescript/src/components/Polyline.d.ts.map +1 -1
- package/lib/typescript/src/components/Polyline.types.d.ts +53 -0
- package/lib/typescript/src/components/Polyline.types.d.ts.map +1 -0
- package/lib/typescript/src/components/Polyline.web.d.ts +2 -5
- package/lib/typescript/src/components/Polyline.web.d.ts.map +1 -1
- package/lib/typescript/src/components/index.d.ts +8 -2
- package/lib/typescript/src/components/index.d.ts.map +1 -1
- package/lib/typescript/src/components/index.web.d.ts +6 -2
- package/lib/typescript/src/components/index.web.d.ts.map +1 -1
- package/lib/typescript/src/fabric/LuggCalloutViewNativeComponent.d.ts +13 -0
- package/lib/typescript/src/fabric/LuggCalloutViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/fabric/{LuggGoogleMapViewNativeComponent.d.ts → LuggMapViewNativeComponent.d.ts} +30 -4
- package/lib/typescript/src/fabric/LuggMapViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/fabric/LuggMarkerViewNativeComponent.d.ts +45 -1
- package/lib/typescript/src/fabric/LuggMarkerViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/fabric/LuggPolygonViewNativeComponent.d.ts +18 -0
- package/lib/typescript/src/fabric/LuggPolygonViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/fabric/LuggPolylineViewNativeComponent.d.ts +7 -0
- package/lib/typescript/src/fabric/LuggPolylineViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +11 -3
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/index.web.d.ts +9 -1
- package/lib/typescript/src/index.web.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +11 -0
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/package.json +11 -9
- package/src/MapProvider.tsx +1 -3
- package/src/MapProvider.web.tsx +22 -3
- package/src/MapView.tsx +32 -26
- package/src/MapView.types.ts +43 -9
- package/src/MapView.web.tsx +368 -210
- package/src/components/GeoJson.tsx +221 -0
- package/src/components/GeoJson.types.ts +118 -0
- package/src/components/Marker.tsx +75 -38
- package/src/components/Marker.types.ts +102 -0
- package/src/components/Marker.web.tsx +197 -19
- package/src/components/Polygon.tsx +52 -0
- package/src/components/Polygon.types.ts +33 -0
- package/src/components/Polygon.web.tsx +104 -0
- package/src/components/Polyline.tsx +23 -22
- package/src/components/Polyline.types.ts +55 -0
- package/src/components/Polyline.web.tsx +151 -37
- package/src/components/index.ts +17 -2
- package/src/components/index.web.ts +6 -2
- package/src/fabric/LuggCalloutViewNativeComponent.ts +20 -0
- package/src/fabric/{LuggGoogleMapViewNativeComponent.ts → LuggMapViewNativeComponent.ts} +43 -7
- package/src/fabric/LuggMarkerViewNativeComponent.ts +49 -1
- package/src/fabric/LuggPolygonViewNativeComponent.ts +25 -0
- package/src/fabric/LuggPolylineViewNativeComponent.ts +8 -0
- package/src/index.ts +30 -1
- package/src/index.web.ts +16 -1
- package/src/types.ts +13 -0
- package/android/src/main/java/com/luggmaps/LuggGoogleMapView.kt +0 -511
- package/ios/LuggAppleMapView.h +0 -16
- package/ios/LuggAppleMapView.mm +0 -592
- package/ios/LuggGoogleMapView.h +0 -13
- package/ios/LuggGoogleMapView.mm +0 -455
- package/lib/module/fabric/LuggAppleMapViewNativeComponent.ts +0 -83
- package/lib/typescript/src/fabric/LuggAppleMapViewNativeComponent.d.ts +0 -54
- package/lib/typescript/src/fabric/LuggAppleMapViewNativeComponent.d.ts.map +0 -1
- package/lib/typescript/src/fabric/LuggGoogleMapViewNativeComponent.d.ts.map +0 -1
- package/src/fabric/LuggAppleMapViewNativeComponent.ts +0 -83
package/README.md
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
Universal maps for your React Native apps 📍
|
|
4
4
|
|
|
5
|
+
<img alt="@lugg/maps" src="docs/preview.gif" width="720" />
|
|
6
|
+
|
|
7
|
+
> [!IMPORTANT]
|
|
8
|
+
> This library is currently under heavy development. APIs may change without notice.
|
|
9
|
+
|
|
5
10
|
## Installation
|
|
6
11
|
|
|
7
12
|
```sh
|
|
@@ -72,7 +77,7 @@ function App() {
|
|
|
72
77
|
## Usage
|
|
73
78
|
|
|
74
79
|
```tsx
|
|
75
|
-
import { MapView, Marker, Polyline } from '@lugg/maps';
|
|
80
|
+
import { MapView, Marker, Polyline, Polygon } from '@lugg/maps';
|
|
76
81
|
|
|
77
82
|
<MapView
|
|
78
83
|
style={{ flex: 1 }}
|
|
@@ -91,35 +96,31 @@ import { MapView, Marker, Polyline } from '@lugg/maps';
|
|
|
91
96
|
]}
|
|
92
97
|
strokeWidth={3}
|
|
93
98
|
/>
|
|
99
|
+
<Polygon
|
|
100
|
+
coordinates={[
|
|
101
|
+
{ latitude: 37.784, longitude: -122.428 },
|
|
102
|
+
{ latitude: 37.784, longitude: -122.422 },
|
|
103
|
+
{ latitude: 37.779, longitude: -122.422 },
|
|
104
|
+
{ latitude: 37.779, longitude: -122.428 },
|
|
105
|
+
]}
|
|
106
|
+
fillColor="rgba(66, 133, 244, 0.3)"
|
|
107
|
+
strokeColor="#4285F4"
|
|
108
|
+
strokeWidth={2}
|
|
109
|
+
/>
|
|
94
110
|
</MapView>
|
|
95
111
|
```
|
|
96
112
|
|
|
97
113
|
## Components
|
|
98
114
|
|
|
99
115
|
- [MapView](docs/MAPVIEW.md) - Main map component
|
|
100
|
-
- [Marker](docs/MARKER.md) - Map markers
|
|
116
|
+
- [Marker](docs/MARKER.md) - Map markers with callout support
|
|
101
117
|
- [Polyline](docs/POLYLINE.md) - Draw lines on the map
|
|
118
|
+
- [Polygon](docs/POLYGON.md) - Draw filled shapes on the map
|
|
119
|
+
- [GeoJson](docs/GEOJSON.md) - Render GeoJSON data on the map
|
|
102
120
|
|
|
103
121
|
## Types
|
|
104
122
|
|
|
105
|
-
|
|
106
|
-
interface Coordinate {
|
|
107
|
-
latitude: number;
|
|
108
|
-
longitude: number;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
interface Point {
|
|
112
|
-
x: number;
|
|
113
|
-
y: number;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
interface EdgeInsets {
|
|
117
|
-
top: number;
|
|
118
|
-
left: number;
|
|
119
|
-
bottom: number;
|
|
120
|
-
right: number;
|
|
121
|
-
}
|
|
122
|
-
```
|
|
123
|
+
See [Types](docs/TYPES.md) for common type definitions (`Coordinate`, `Point`, `EdgeInsets`).
|
|
123
124
|
|
|
124
125
|
## Contributing
|
|
125
126
|
|
package/android/build.gradle
CHANGED
|
@@ -74,5 +74,5 @@ def kotlin_version = getExtOrDefault("kotlinVersion")
|
|
|
74
74
|
dependencies {
|
|
75
75
|
implementation "com.facebook.react:react-android"
|
|
76
76
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
|
77
|
-
implementation "com.google.android.gms:play-services-maps:
|
|
77
|
+
implementation "com.google.android.gms:play-services-maps:20.0.0"
|
|
78
78
|
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
package com.luggmaps
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.graphics.Bitmap
|
|
5
|
+
import android.graphics.Canvas
|
|
6
|
+
import android.view.View
|
|
7
|
+
import androidx.core.graphics.createBitmap
|
|
8
|
+
import androidx.core.view.isNotEmpty
|
|
9
|
+
import com.facebook.react.views.view.ReactViewGroup
|
|
10
|
+
|
|
11
|
+
class LuggCalloutView(context: Context) : ReactViewGroup(context) {
|
|
12
|
+
val contentView: ReactViewGroup = ReactViewGroup(context)
|
|
13
|
+
var bubbled: Boolean = true
|
|
14
|
+
var anchorX: Float = 0.5f
|
|
15
|
+
set(value) {
|
|
16
|
+
field = value
|
|
17
|
+
onUpdate?.invoke()
|
|
18
|
+
}
|
|
19
|
+
var anchorY: Float = 1.0f
|
|
20
|
+
set(value) {
|
|
21
|
+
field = value
|
|
22
|
+
onUpdate?.invoke()
|
|
23
|
+
}
|
|
24
|
+
var onUpdate: (() -> Unit)? = null
|
|
25
|
+
|
|
26
|
+
val hasCustomContent: Boolean
|
|
27
|
+
get() = contentView.isNotEmpty()
|
|
28
|
+
|
|
29
|
+
init {
|
|
30
|
+
visibility = GONE
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
override fun addView(child: View, index: Int) {
|
|
34
|
+
contentView.addView(child, index)
|
|
35
|
+
child.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
|
|
36
|
+
onUpdate?.invoke()
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
override fun removeView(child: View) {
|
|
41
|
+
contentView.removeView(child)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
override fun removeViewAt(index: Int) {
|
|
45
|
+
contentView.removeViewAt(index)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
override fun getChildCount(): Int = contentView.childCount
|
|
49
|
+
|
|
50
|
+
override fun getChildAt(index: Int): View? = contentView.getChildAt(index)
|
|
51
|
+
|
|
52
|
+
fun createContentBitmap(): Bitmap? {
|
|
53
|
+
var maxWidth = 0
|
|
54
|
+
var maxHeight = 0
|
|
55
|
+
for (i in 0 until contentView.childCount) {
|
|
56
|
+
val child = contentView.getChildAt(i)
|
|
57
|
+
val childRight = child.left + child.width
|
|
58
|
+
val childBottom = child.top + child.height
|
|
59
|
+
if (childRight > maxWidth) maxWidth = childRight
|
|
60
|
+
if (childBottom > maxHeight) maxHeight = childBottom
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (maxWidth <= 0 || maxHeight <= 0) return null
|
|
64
|
+
|
|
65
|
+
val bitmap = createBitmap(maxWidth, maxHeight)
|
|
66
|
+
val canvas = Canvas(bitmap)
|
|
67
|
+
contentView.draw(canvas)
|
|
68
|
+
return bitmap
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
fun onDropViewInstance() {
|
|
72
|
+
contentView.removeAllViews()
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
package com.luggmaps
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap
|
|
4
|
+
import com.facebook.react.module.annotations.ReactModule
|
|
5
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
6
|
+
import com.facebook.react.uimanager.ViewGroupManager
|
|
7
|
+
import com.facebook.react.uimanager.ViewManagerDelegate
|
|
8
|
+
import com.facebook.react.viewmanagers.LuggCalloutViewManagerDelegate
|
|
9
|
+
import com.facebook.react.viewmanagers.LuggCalloutViewManagerInterface
|
|
10
|
+
|
|
11
|
+
@ReactModule(name = LuggCalloutViewManager.NAME)
|
|
12
|
+
class LuggCalloutViewManager :
|
|
13
|
+
ViewGroupManager<LuggCalloutView>(),
|
|
14
|
+
LuggCalloutViewManagerInterface<LuggCalloutView> {
|
|
15
|
+
private val delegate: ViewManagerDelegate<LuggCalloutView> = LuggCalloutViewManagerDelegate(this)
|
|
16
|
+
|
|
17
|
+
override fun getDelegate(): ViewManagerDelegate<LuggCalloutView> = delegate
|
|
18
|
+
override fun getName(): String = NAME
|
|
19
|
+
override fun createViewInstance(context: ThemedReactContext): LuggCalloutView = LuggCalloutView(context)
|
|
20
|
+
|
|
21
|
+
override fun setBubbled(view: LuggCalloutView, value: Boolean) {
|
|
22
|
+
view.bubbled = value
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
override fun setAnchor(view: LuggCalloutView, value: ReadableMap?) {
|
|
26
|
+
view.anchorX = value?.getDouble("x")?.toFloat() ?: 0.5f
|
|
27
|
+
view.anchorY = value?.getDouble("y")?.toFloat() ?: 1.0f
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
override fun onDropViewInstance(view: LuggCalloutView) {
|
|
31
|
+
super.onDropViewInstance(view)
|
|
32
|
+
view.onDropViewInstance()
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
companion object {
|
|
36
|
+
const val NAME = "LuggCalloutView"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
package com.luggmaps
|
|
2
|
+
|
|
3
|
+
import android.annotation.SuppressLint
|
|
4
|
+
import android.view.View
|
|
5
|
+
import android.view.View.VISIBLE
|
|
6
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
7
|
+
import com.facebook.react.util.RNLog
|
|
8
|
+
import com.facebook.react.views.view.ReactViewGroup
|
|
9
|
+
import com.google.android.gms.maps.model.LatLng
|
|
10
|
+
import com.luggmaps.core.EdgeInsets
|
|
11
|
+
import com.luggmaps.core.GoogleMapProvider
|
|
12
|
+
import com.luggmaps.core.MapProvider
|
|
13
|
+
import com.luggmaps.core.MapProviderDelegate
|
|
14
|
+
|
|
15
|
+
interface LuggMapViewEventDelegate {
|
|
16
|
+
fun onCameraMove(
|
|
17
|
+
view: LuggMapView,
|
|
18
|
+
latitude: Double,
|
|
19
|
+
longitude: Double,
|
|
20
|
+
zoom: Float,
|
|
21
|
+
gesture: Boolean
|
|
22
|
+
)
|
|
23
|
+
fun onCameraIdle(
|
|
24
|
+
view: LuggMapView,
|
|
25
|
+
latitude: Double,
|
|
26
|
+
longitude: Double,
|
|
27
|
+
zoom: Float,
|
|
28
|
+
gesture: Boolean
|
|
29
|
+
)
|
|
30
|
+
fun onReady(view: LuggMapView)
|
|
31
|
+
fun onPress(
|
|
32
|
+
view: LuggMapView,
|
|
33
|
+
latitude: Double,
|
|
34
|
+
longitude: Double,
|
|
35
|
+
x: Float,
|
|
36
|
+
y: Float
|
|
37
|
+
)
|
|
38
|
+
fun onLongPress(
|
|
39
|
+
view: LuggMapView,
|
|
40
|
+
latitude: Double,
|
|
41
|
+
longitude: Double,
|
|
42
|
+
x: Float,
|
|
43
|
+
y: Float
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@SuppressLint("ViewConstructor")
|
|
48
|
+
class LuggMapView(private val reactContext: ThemedReactContext) :
|
|
49
|
+
ReactViewGroup(reactContext),
|
|
50
|
+
MapProviderDelegate {
|
|
51
|
+
|
|
52
|
+
var eventDelegate: LuggMapViewEventDelegate? = null
|
|
53
|
+
private var provider: MapProvider? = null
|
|
54
|
+
private var mapWrapperView: LuggMapWrapperView? = null
|
|
55
|
+
|
|
56
|
+
// Cached props (applied during initializeProvider)
|
|
57
|
+
private var mapId: String = GoogleMapProvider.DEMO_MAP_ID
|
|
58
|
+
private var initialLatitude: Double = 37.78
|
|
59
|
+
private var initialLongitude: Double = -122.43
|
|
60
|
+
private var initialZoom: Float = 14f
|
|
61
|
+
private var theme: String = "system"
|
|
62
|
+
private var zoomEnabled: Boolean = true
|
|
63
|
+
private var scrollEnabled: Boolean = true
|
|
64
|
+
private var rotateEnabled: Boolean = true
|
|
65
|
+
private var pitchEnabled: Boolean = true
|
|
66
|
+
private var userLocationEnabled: Boolean = false
|
|
67
|
+
private var userLocationButtonEnabled: Boolean = false
|
|
68
|
+
private var minZoom: Double? = null
|
|
69
|
+
private var maxZoom: Double? = null
|
|
70
|
+
private var edgeInsets: EdgeInsets = EdgeInsets()
|
|
71
|
+
|
|
72
|
+
// region View Lifecycle
|
|
73
|
+
|
|
74
|
+
override fun addView(child: View?, index: Int) {
|
|
75
|
+
super.addView(child, index)
|
|
76
|
+
when (child) {
|
|
77
|
+
is LuggMapWrapperView -> mapWrapperView = child
|
|
78
|
+
is LuggMarkerView -> provider?.addMarkerView(child)
|
|
79
|
+
is LuggPolylineView -> provider?.addPolylineView(child)
|
|
80
|
+
is LuggPolygonView -> provider?.addPolygonView(child)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
override fun removeViewAt(index: Int) {
|
|
85
|
+
val view = getChildAt(index)
|
|
86
|
+
when (view) {
|
|
87
|
+
is LuggMarkerView -> provider?.removeMarkerView(view)
|
|
88
|
+
is LuggPolylineView -> provider?.removePolylineView(view)
|
|
89
|
+
is LuggPolygonView -> provider?.removePolygonView(view)
|
|
90
|
+
}
|
|
91
|
+
super.removeViewAt(index)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
override fun onAttachedToWindow() {
|
|
95
|
+
super.onAttachedToWindow()
|
|
96
|
+
if (provider == null && mapWrapperView != null) {
|
|
97
|
+
initializeProvider()
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
override fun onWindowVisibilityChanged(visibility: Int) {
|
|
102
|
+
super.onWindowVisibilityChanged(visibility)
|
|
103
|
+
if (visibility == VISIBLE) {
|
|
104
|
+
provider?.resumeAnimations()
|
|
105
|
+
} else {
|
|
106
|
+
provider?.pauseAnimations()
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
fun onDropViewInstance() {
|
|
111
|
+
provider?.destroy()
|
|
112
|
+
provider = null
|
|
113
|
+
mapWrapperView = null
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// endregion
|
|
117
|
+
|
|
118
|
+
// region Provider Initialization
|
|
119
|
+
|
|
120
|
+
private fun initializeProvider() {
|
|
121
|
+
if (provider != null || mapWrapperView == null) return
|
|
122
|
+
|
|
123
|
+
val google = GoogleMapProvider(context)
|
|
124
|
+
google.mapId = mapId
|
|
125
|
+
google.delegate = this
|
|
126
|
+
provider = google
|
|
127
|
+
|
|
128
|
+
applyProps()
|
|
129
|
+
|
|
130
|
+
google.initializeMap(mapWrapperView!!, initialLatitude, initialLongitude, initialZoom)
|
|
131
|
+
|
|
132
|
+
// Flush children mounted before provider was created
|
|
133
|
+
for (i in 0 until childCount) {
|
|
134
|
+
when (val child = getChildAt(i)) {
|
|
135
|
+
is LuggMarkerView -> google.addMarkerView(child)
|
|
136
|
+
is LuggPolylineView -> google.addPolylineView(child)
|
|
137
|
+
is LuggPolygonView -> google.addPolygonView(child)
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// endregion
|
|
143
|
+
|
|
144
|
+
// region MapProviderDelegate
|
|
145
|
+
|
|
146
|
+
override fun mapProviderDidReady() {
|
|
147
|
+
eventDelegate?.onReady(this)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
override fun mapProviderDidMoveCamera(latitude: Double, longitude: Double, zoom: Float, gesture: Boolean) {
|
|
151
|
+
eventDelegate?.onCameraMove(this, latitude, longitude, zoom, gesture)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
override fun mapProviderDidIdleCamera(latitude: Double, longitude: Double, zoom: Float, gesture: Boolean) {
|
|
155
|
+
eventDelegate?.onCameraIdle(this, latitude, longitude, zoom, gesture)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
override fun mapProviderDidPress(latitude: Double, longitude: Double, x: Float, y: Float) {
|
|
159
|
+
eventDelegate?.onPress(this, latitude, longitude, x, y)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
override fun mapProviderDidLongPress(latitude: Double, longitude: Double, x: Float, y: Float) {
|
|
163
|
+
eventDelegate?.onLongPress(this, latitude, longitude, x, y)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// endregion
|
|
167
|
+
|
|
168
|
+
// region Property Setters
|
|
169
|
+
|
|
170
|
+
private fun applyProps() {
|
|
171
|
+
provider?.setZoomEnabled(zoomEnabled)
|
|
172
|
+
provider?.setScrollEnabled(scrollEnabled)
|
|
173
|
+
provider?.setRotateEnabled(rotateEnabled)
|
|
174
|
+
provider?.setPitchEnabled(pitchEnabled)
|
|
175
|
+
provider?.setUserLocationEnabled(userLocationEnabled)
|
|
176
|
+
provider?.setUserLocationButtonEnabled(userLocationButtonEnabled)
|
|
177
|
+
provider?.setTheme(theme)
|
|
178
|
+
minZoom?.let { provider?.setMinZoom(it) }
|
|
179
|
+
maxZoom?.let { provider?.setMaxZoom(it) }
|
|
180
|
+
provider?.setEdgeInsets(edgeInsets)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
fun setProvider(value: String?) {
|
|
184
|
+
if (value != null && value != "google") {
|
|
185
|
+
RNLog.w(reactContext, "LuggMapView: Only Google Maps is supported on Android")
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
fun setMapId(value: String?) {
|
|
190
|
+
if (value.isNullOrEmpty()) return
|
|
191
|
+
mapId = value
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
fun setInitialCoordinate(latitude: Double, longitude: Double) {
|
|
195
|
+
initialLatitude = latitude
|
|
196
|
+
initialLongitude = longitude
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
fun setInitialZoom(zoom: Double) {
|
|
200
|
+
initialZoom = zoom.toFloat()
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
fun setZoomEnabled(enabled: Boolean) {
|
|
204
|
+
if (zoomEnabled == enabled) return
|
|
205
|
+
zoomEnabled = enabled
|
|
206
|
+
provider?.setZoomEnabled(enabled)
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
fun setScrollEnabled(enabled: Boolean) {
|
|
210
|
+
if (scrollEnabled == enabled) return
|
|
211
|
+
scrollEnabled = enabled
|
|
212
|
+
provider?.setScrollEnabled(enabled)
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
fun setRotateEnabled(enabled: Boolean) {
|
|
216
|
+
if (rotateEnabled == enabled) return
|
|
217
|
+
rotateEnabled = enabled
|
|
218
|
+
provider?.setRotateEnabled(enabled)
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
fun setPitchEnabled(enabled: Boolean) {
|
|
222
|
+
if (pitchEnabled == enabled) return
|
|
223
|
+
pitchEnabled = enabled
|
|
224
|
+
provider?.setPitchEnabled(enabled)
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
fun setUserLocationEnabled(enabled: Boolean) {
|
|
228
|
+
if (userLocationEnabled == enabled) return
|
|
229
|
+
userLocationEnabled = enabled
|
|
230
|
+
provider?.setUserLocationEnabled(enabled)
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
fun setUserLocationButtonEnabled(enabled: Boolean) {
|
|
234
|
+
if (userLocationButtonEnabled == enabled) return
|
|
235
|
+
userLocationButtonEnabled = enabled
|
|
236
|
+
provider?.setUserLocationButtonEnabled(enabled)
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
fun setMinZoom(zoom: Double) {
|
|
240
|
+
if (minZoom == zoom) return
|
|
241
|
+
minZoom = zoom
|
|
242
|
+
provider?.setMinZoom(zoom)
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
fun setMaxZoom(zoom: Double) {
|
|
246
|
+
if (maxZoom == zoom) return
|
|
247
|
+
maxZoom = zoom
|
|
248
|
+
provider?.setMaxZoom(zoom)
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
fun setTheme(value: String) {
|
|
252
|
+
if (theme == value) return
|
|
253
|
+
theme = value
|
|
254
|
+
provider?.setTheme(value)
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
fun setEdgeInsets(
|
|
258
|
+
top: Int,
|
|
259
|
+
left: Int,
|
|
260
|
+
bottom: Int,
|
|
261
|
+
right: Int,
|
|
262
|
+
duration: Int = 0
|
|
263
|
+
) {
|
|
264
|
+
val newEdgeInsets = EdgeInsets(top, left, bottom, right)
|
|
265
|
+
if (edgeInsets == newEdgeInsets) return
|
|
266
|
+
edgeInsets = newEdgeInsets
|
|
267
|
+
provider?.setEdgeInsets(edgeInsets, duration)
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// endregion
|
|
271
|
+
|
|
272
|
+
// region Commands
|
|
273
|
+
|
|
274
|
+
fun moveCamera(latitude: Double, longitude: Double, zoom: Double, duration: Int) {
|
|
275
|
+
provider?.moveCamera(latitude, longitude, zoom, duration)
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
fun fitCoordinates(
|
|
279
|
+
coordinates: List<LatLng>,
|
|
280
|
+
edgeInsetsTop: Int,
|
|
281
|
+
edgeInsetsLeft: Int,
|
|
282
|
+
edgeInsetsBottom: Int,
|
|
283
|
+
edgeInsetsRight: Int,
|
|
284
|
+
duration: Int
|
|
285
|
+
) {
|
|
286
|
+
provider?.fitCoordinates(coordinates, edgeInsetsTop, edgeInsetsLeft, edgeInsetsBottom, edgeInsetsRight, duration)
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// endregion
|
|
290
|
+
}
|