@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.
Files changed (184) hide show
  1. package/README.md +21 -20
  2. package/android/build.gradle +1 -1
  3. package/android/src/main/java/com/luggmaps/LuggCalloutView.kt +74 -0
  4. package/android/src/main/java/com/luggmaps/LuggCalloutViewManager.kt +38 -0
  5. package/android/src/main/java/com/luggmaps/LuggMapView.kt +290 -0
  6. package/android/src/main/java/com/luggmaps/{LuggGoogleMapViewManager.kt → LuggMapViewManager.kt} +99 -36
  7. package/android/src/main/java/com/luggmaps/LuggMapWrapperView.kt +11 -14
  8. package/android/src/main/java/com/luggmaps/LuggMarkerView.kt +187 -21
  9. package/android/src/main/java/com/luggmaps/LuggMarkerViewManager.kt +28 -0
  10. package/android/src/main/java/com/luggmaps/LuggPackage.kt +8 -4
  11. package/android/src/main/java/com/luggmaps/LuggPolygonView.kt +85 -0
  12. package/android/src/main/java/com/luggmaps/LuggPolygonViewManager.kt +100 -0
  13. package/android/src/main/java/com/luggmaps/LuggPolylineView.kt +16 -0
  14. package/android/src/main/java/com/luggmaps/LuggPolylineViewManager.kt +22 -0
  15. package/android/src/main/java/com/luggmaps/core/GoogleMapProvider.kt +874 -0
  16. package/android/src/main/java/com/luggmaps/core/MapProviderDelegate.kt +60 -0
  17. package/android/src/main/java/com/luggmaps/core/PolylineAnimator.kt +89 -24
  18. package/android/src/main/java/com/luggmaps/events/LongPressEvent.kt +29 -0
  19. package/android/src/main/java/com/luggmaps/events/MarkerDragEvent.kt +41 -0
  20. package/android/src/main/java/com/luggmaps/events/MarkerPressEvent.kt +34 -0
  21. package/android/src/main/java/com/luggmaps/events/PolygonPressEvent.kt +12 -0
  22. package/android/src/main/java/com/luggmaps/events/PressEvent.kt +29 -0
  23. package/ios/LuggCalloutView.h +23 -0
  24. package/ios/LuggCalloutView.mm +145 -0
  25. package/ios/LuggMapView.h +9 -0
  26. package/ios/LuggMapView.mm +343 -0
  27. package/ios/LuggMarkerView.h +15 -0
  28. package/ios/LuggMarkerView.mm +136 -2
  29. package/ios/LuggPolygonView.h +31 -0
  30. package/ios/LuggPolygonView.mm +151 -0
  31. package/ios/LuggPolylineView.h +4 -0
  32. package/ios/LuggPolylineView.mm +23 -0
  33. package/ios/core/AppleMapProvider.h +15 -0
  34. package/ios/core/AppleMapProvider.mm +1173 -0
  35. package/ios/core/GMSPolylineAnimator.h +3 -0
  36. package/ios/core/GMSPolylineAnimator.m +101 -15
  37. package/ios/core/GoogleMapProvider.h +13 -0
  38. package/ios/core/GoogleMapProvider.mm +798 -0
  39. package/ios/core/LuggAnnotationView.h +12 -0
  40. package/ios/core/LuggAnnotationView.mm +55 -0
  41. package/ios/core/MKPolylineAnimator.h +4 -0
  42. package/ios/core/MKPolylineAnimator.m +167 -42
  43. package/ios/core/MapProviderDelegate.h +84 -0
  44. package/ios/core/PolylineAnimatorBase.h +24 -1
  45. package/ios/core/PolylineAnimatorBase.m +82 -19
  46. package/ios/events/LongPressEvent.h +29 -0
  47. package/ios/events/MarkerDragEvent.h +69 -0
  48. package/ios/events/MarkerPressEvent.h +29 -0
  49. package/ios/events/PolygonPressEvent.h +20 -0
  50. package/ios/events/PressEvent.h +29 -0
  51. package/ios/extensions/MKMapView+Zoom.h +2 -0
  52. package/ios/extensions/MKMapView+Zoom.m +14 -4
  53. package/lib/module/MapProvider.js +2 -4
  54. package/lib/module/MapProvider.js.map +1 -1
  55. package/lib/module/MapProvider.web.js +14 -7
  56. package/lib/module/MapProvider.web.js.map +1 -1
  57. package/lib/module/MapView.js +33 -16
  58. package/lib/module/MapView.js.map +1 -1
  59. package/lib/module/MapView.web.js +296 -181
  60. package/lib/module/MapView.web.js.map +1 -1
  61. package/lib/module/components/GeoJson.js +159 -0
  62. package/lib/module/components/GeoJson.js.map +1 -0
  63. package/lib/module/components/GeoJson.types.js +4 -0
  64. package/lib/module/components/GeoJson.types.js.map +1 -0
  65. package/lib/module/components/Marker.js +49 -8
  66. package/lib/module/components/Marker.js.map +1 -1
  67. package/lib/module/components/Marker.types.js +4 -0
  68. package/lib/module/components/Marker.types.js.map +1 -0
  69. package/lib/module/components/Marker.web.js +159 -24
  70. package/lib/module/components/Marker.web.js.map +1 -1
  71. package/lib/module/components/Polygon.js +46 -0
  72. package/lib/module/components/Polygon.js.map +1 -0
  73. package/lib/module/components/Polygon.types.js +4 -0
  74. package/lib/module/components/Polygon.types.js.map +1 -0
  75. package/lib/module/components/Polygon.web.js +87 -0
  76. package/lib/module/components/Polygon.web.js.map +1 -0
  77. package/lib/module/components/Polyline.js +17 -4
  78. package/lib/module/components/Polyline.js.map +1 -1
  79. package/lib/module/components/Polyline.types.js +4 -0
  80. package/lib/module/components/Polyline.types.js.map +1 -0
  81. package/lib/module/components/Polyline.web.js +108 -31
  82. package/lib/module/components/Polyline.web.js.map +1 -1
  83. package/lib/module/components/index.js +4 -2
  84. package/lib/module/components/index.js.map +1 -1
  85. package/lib/module/components/index.web.js +2 -0
  86. package/lib/module/components/index.web.js.map +1 -1
  87. package/lib/module/fabric/LuggCalloutViewNativeComponent.ts +20 -0
  88. package/lib/module/fabric/{LuggGoogleMapViewNativeComponent.ts → LuggMapViewNativeComponent.ts} +43 -7
  89. package/lib/module/fabric/LuggMarkerViewNativeComponent.ts +49 -1
  90. package/lib/module/fabric/LuggPolygonViewNativeComponent.ts +25 -0
  91. package/lib/module/fabric/LuggPolylineViewNativeComponent.ts +8 -0
  92. package/lib/module/index.js +4 -1
  93. package/lib/module/index.js.map +1 -1
  94. package/lib/module/index.web.js +4 -1
  95. package/lib/module/index.web.js.map +1 -1
  96. package/lib/typescript/src/MapProvider.d.ts +1 -1
  97. package/lib/typescript/src/MapProvider.d.ts.map +1 -1
  98. package/lib/typescript/src/MapProvider.web.d.ts +23 -1
  99. package/lib/typescript/src/MapProvider.web.d.ts.map +1 -1
  100. package/lib/typescript/src/MapView.d.ts +4 -4
  101. package/lib/typescript/src/MapView.d.ts.map +1 -1
  102. package/lib/typescript/src/MapView.types.d.ts +35 -9
  103. package/lib/typescript/src/MapView.types.d.ts.map +1 -1
  104. package/lib/typescript/src/MapView.web.d.ts +2 -11
  105. package/lib/typescript/src/MapView.web.d.ts.map +1 -1
  106. package/lib/typescript/src/components/GeoJson.d.ts +4 -0
  107. package/lib/typescript/src/components/GeoJson.d.ts.map +1 -0
  108. package/lib/typescript/src/components/GeoJson.types.d.ts +89 -0
  109. package/lib/typescript/src/components/GeoJson.types.d.ts.map +1 -0
  110. package/lib/typescript/src/components/Marker.d.ts +6 -33
  111. package/lib/typescript/src/components/Marker.d.ts.map +1 -1
  112. package/lib/typescript/src/components/Marker.types.d.ts +100 -0
  113. package/lib/typescript/src/components/Marker.types.d.ts.map +1 -0
  114. package/lib/typescript/src/components/Marker.web.d.ts +2 -5
  115. package/lib/typescript/src/components/Marker.web.d.ts.map +1 -1
  116. package/lib/typescript/src/components/Polygon.d.ts +10 -0
  117. package/lib/typescript/src/components/Polygon.d.ts.map +1 -0
  118. package/lib/typescript/src/components/Polygon.types.d.ts +33 -0
  119. package/lib/typescript/src/components/Polygon.types.d.ts.map +1 -0
  120. package/lib/typescript/src/components/Polygon.web.d.ts +3 -0
  121. package/lib/typescript/src/components/Polygon.web.d.ts.map +1 -0
  122. package/lib/typescript/src/components/Polyline.d.ts +6 -21
  123. package/lib/typescript/src/components/Polyline.d.ts.map +1 -1
  124. package/lib/typescript/src/components/Polyline.types.d.ts +53 -0
  125. package/lib/typescript/src/components/Polyline.types.d.ts.map +1 -0
  126. package/lib/typescript/src/components/Polyline.web.d.ts +2 -5
  127. package/lib/typescript/src/components/Polyline.web.d.ts.map +1 -1
  128. package/lib/typescript/src/components/index.d.ts +8 -2
  129. package/lib/typescript/src/components/index.d.ts.map +1 -1
  130. package/lib/typescript/src/components/index.web.d.ts +6 -2
  131. package/lib/typescript/src/components/index.web.d.ts.map +1 -1
  132. package/lib/typescript/src/fabric/LuggCalloutViewNativeComponent.d.ts +13 -0
  133. package/lib/typescript/src/fabric/LuggCalloutViewNativeComponent.d.ts.map +1 -0
  134. package/lib/typescript/src/fabric/{LuggGoogleMapViewNativeComponent.d.ts → LuggMapViewNativeComponent.d.ts} +30 -4
  135. package/lib/typescript/src/fabric/LuggMapViewNativeComponent.d.ts.map +1 -0
  136. package/lib/typescript/src/fabric/LuggMarkerViewNativeComponent.d.ts +45 -1
  137. package/lib/typescript/src/fabric/LuggMarkerViewNativeComponent.d.ts.map +1 -1
  138. package/lib/typescript/src/fabric/LuggPolygonViewNativeComponent.d.ts +18 -0
  139. package/lib/typescript/src/fabric/LuggPolygonViewNativeComponent.d.ts.map +1 -0
  140. package/lib/typescript/src/fabric/LuggPolylineViewNativeComponent.d.ts +7 -0
  141. package/lib/typescript/src/fabric/LuggPolylineViewNativeComponent.d.ts.map +1 -1
  142. package/lib/typescript/src/index.d.ts +11 -3
  143. package/lib/typescript/src/index.d.ts.map +1 -1
  144. package/lib/typescript/src/index.web.d.ts +9 -1
  145. package/lib/typescript/src/index.web.d.ts.map +1 -1
  146. package/lib/typescript/src/types.d.ts +11 -0
  147. package/lib/typescript/src/types.d.ts.map +1 -1
  148. package/package.json +11 -9
  149. package/src/MapProvider.tsx +1 -3
  150. package/src/MapProvider.web.tsx +22 -3
  151. package/src/MapView.tsx +32 -26
  152. package/src/MapView.types.ts +43 -9
  153. package/src/MapView.web.tsx +368 -210
  154. package/src/components/GeoJson.tsx +221 -0
  155. package/src/components/GeoJson.types.ts +118 -0
  156. package/src/components/Marker.tsx +75 -38
  157. package/src/components/Marker.types.ts +102 -0
  158. package/src/components/Marker.web.tsx +197 -19
  159. package/src/components/Polygon.tsx +52 -0
  160. package/src/components/Polygon.types.ts +33 -0
  161. package/src/components/Polygon.web.tsx +104 -0
  162. package/src/components/Polyline.tsx +23 -22
  163. package/src/components/Polyline.types.ts +55 -0
  164. package/src/components/Polyline.web.tsx +151 -37
  165. package/src/components/index.ts +17 -2
  166. package/src/components/index.web.ts +6 -2
  167. package/src/fabric/LuggCalloutViewNativeComponent.ts +20 -0
  168. package/src/fabric/{LuggGoogleMapViewNativeComponent.ts → LuggMapViewNativeComponent.ts} +43 -7
  169. package/src/fabric/LuggMarkerViewNativeComponent.ts +49 -1
  170. package/src/fabric/LuggPolygonViewNativeComponent.ts +25 -0
  171. package/src/fabric/LuggPolylineViewNativeComponent.ts +8 -0
  172. package/src/index.ts +30 -1
  173. package/src/index.web.ts +16 -1
  174. package/src/types.ts +13 -0
  175. package/android/src/main/java/com/luggmaps/LuggGoogleMapView.kt +0 -511
  176. package/ios/LuggAppleMapView.h +0 -16
  177. package/ios/LuggAppleMapView.mm +0 -592
  178. package/ios/LuggGoogleMapView.h +0 -13
  179. package/ios/LuggGoogleMapView.mm +0 -455
  180. package/lib/module/fabric/LuggAppleMapViewNativeComponent.ts +0 -83
  181. package/lib/typescript/src/fabric/LuggAppleMapViewNativeComponent.d.ts +0 -54
  182. package/lib/typescript/src/fabric/LuggAppleMapViewNativeComponent.d.ts.map +0 -1
  183. package/lib/typescript/src/fabric/LuggGoogleMapViewNativeComponent.d.ts.map +0 -1
  184. package/src/fabric/LuggAppleMapViewNativeComponent.ts +0 -83
@@ -8,40 +8,44 @@ import com.facebook.react.uimanager.ThemedReactContext
8
8
  import com.facebook.react.uimanager.ViewGroupManager
9
9
  import com.facebook.react.uimanager.ViewManagerDelegate
10
10
  import com.facebook.react.uimanager.annotations.ReactProp
11
- import com.facebook.react.viewmanagers.LuggGoogleMapViewManagerDelegate
12
- import com.facebook.react.viewmanagers.LuggGoogleMapViewManagerInterface
11
+ import com.facebook.react.viewmanagers.LuggMapViewManagerDelegate
12
+ import com.facebook.react.viewmanagers.LuggMapViewManagerInterface
13
13
  import com.google.android.gms.maps.model.LatLng
14
14
  import com.luggmaps.events.CameraIdleEvent
15
15
  import com.luggmaps.events.CameraMoveEvent
16
+ import com.luggmaps.events.LongPressEvent
17
+ import com.luggmaps.events.PressEvent
16
18
  import com.luggmaps.events.ReadyEvent
17
19
  import com.luggmaps.extensions.dispatchEvent
18
20
 
19
- @ReactModule(name = LuggGoogleMapViewManager.NAME)
20
- class LuggGoogleMapViewManager :
21
- ViewGroupManager<LuggGoogleMapView>(),
22
- LuggGoogleMapViewManagerInterface<LuggGoogleMapView>,
23
- LuggGoogleMapViewEventDelegate {
24
- private val delegate: ViewManagerDelegate<LuggGoogleMapView> = LuggGoogleMapViewManagerDelegate(this)
21
+ @ReactModule(name = LuggMapViewManager.NAME)
22
+ class LuggMapViewManager :
23
+ ViewGroupManager<LuggMapView>(),
24
+ LuggMapViewManagerInterface<LuggMapView>,
25
+ LuggMapViewEventDelegate {
26
+ private val delegate: ViewManagerDelegate<LuggMapView> = LuggMapViewManagerDelegate(this)
25
27
 
26
- override fun getDelegate(): ViewManagerDelegate<LuggGoogleMapView> = delegate
28
+ override fun getDelegate(): ViewManagerDelegate<LuggMapView> = delegate
27
29
 
28
30
  override fun getName(): String = NAME
29
31
 
30
- override fun createViewInstance(context: ThemedReactContext): LuggGoogleMapView {
31
- val view = LuggGoogleMapView(context)
32
+ override fun createViewInstance(context: ThemedReactContext): LuggMapView {
33
+ val view = LuggMapView(context)
32
34
  view.eventDelegate = this
33
35
  return view
34
36
  }
35
37
 
36
38
  override fun getExportedCustomDirectEventTypeConstants(): Map<String, Any> =
37
39
  mapOf(
40
+ "topMapPress" to mapOf("registrationName" to "onMapPress"),
41
+ "topMapLongPress" to mapOf("registrationName" to "onMapLongPress"),
38
42
  "topCameraMove" to mapOf("registrationName" to "onCameraMove"),
39
43
  "topCameraIdle" to mapOf("registrationName" to "onCameraIdle"),
40
44
  "topReady" to mapOf("registrationName" to "onReady")
41
45
  )
42
46
 
43
47
  override fun onCameraMove(
44
- view: LuggGoogleMapView,
48
+ view: LuggMapView,
45
49
  latitude: Double,
46
50
  longitude: Double,
47
51
  zoom: Float,
@@ -51,7 +55,7 @@ class LuggGoogleMapViewManager :
51
55
  }
52
56
 
53
57
  override fun onCameraIdle(
54
- view: LuggGoogleMapView,
58
+ view: LuggMapView,
55
59
  latitude: Double,
56
60
  longitude: Double,
57
61
  zoom: Float,
@@ -60,17 +64,42 @@ class LuggGoogleMapViewManager :
60
64
  view.dispatchEvent(CameraIdleEvent(view, latitude, longitude, zoom, gesture))
61
65
  }
62
66
 
63
- override fun onReady(view: LuggGoogleMapView) {
67
+ override fun onReady(view: LuggMapView) {
64
68
  view.dispatchEvent(ReadyEvent(view))
65
69
  }
66
70
 
71
+ override fun onPress(
72
+ view: LuggMapView,
73
+ latitude: Double,
74
+ longitude: Double,
75
+ x: Float,
76
+ y: Float
77
+ ) {
78
+ view.dispatchEvent(PressEvent(view, latitude, longitude, x, y))
79
+ }
80
+
81
+ override fun onLongPress(
82
+ view: LuggMapView,
83
+ latitude: Double,
84
+ longitude: Double,
85
+ x: Float,
86
+ y: Float
87
+ ) {
88
+ view.dispatchEvent(LongPressEvent(view, latitude, longitude, x, y))
89
+ }
90
+
91
+ @ReactProp(name = "provider")
92
+ override fun setProvider(view: LuggMapView, value: String?) {
93
+ view.setProvider(value)
94
+ }
95
+
67
96
  @ReactProp(name = "mapId")
68
- override fun setMapId(view: LuggGoogleMapView, value: String?) {
97
+ override fun setMapId(view: LuggMapView, value: String?) {
69
98
  view.setMapId(value)
70
99
  }
71
100
 
72
101
  @ReactProp(name = "initialCoordinate")
73
- override fun setInitialCoordinate(view: LuggGoogleMapView, value: ReadableMap?) {
102
+ override fun setInitialCoordinate(view: LuggMapView, value: ReadableMap?) {
74
103
  value?.let {
75
104
  val latitude = if (it.hasKey("latitude")) it.getDouble("latitude") else 0.0
76
105
  val longitude = if (it.hasKey("longitude")) it.getDouble("longitude") else 0.0
@@ -79,63 +108,73 @@ class LuggGoogleMapViewManager :
79
108
  }
80
109
 
81
110
  @ReactProp(name = "initialZoom", defaultDouble = 10.0)
82
- override fun setInitialZoom(view: LuggGoogleMapView, value: Double) {
111
+ override fun setInitialZoom(view: LuggMapView, value: Double) {
83
112
  view.setInitialZoom(value)
84
113
  }
85
114
 
86
115
  @ReactProp(name = "zoomEnabled", defaultBoolean = true)
87
- override fun setZoomEnabled(view: LuggGoogleMapView, value: Boolean) {
116
+ override fun setZoomEnabled(view: LuggMapView, value: Boolean) {
88
117
  view.setZoomEnabled(value)
89
118
  }
90
119
 
91
120
  @ReactProp(name = "scrollEnabled", defaultBoolean = true)
92
- override fun setScrollEnabled(view: LuggGoogleMapView, value: Boolean) {
121
+ override fun setScrollEnabled(view: LuggMapView, value: Boolean) {
93
122
  view.setScrollEnabled(value)
94
123
  }
95
124
 
96
125
  @ReactProp(name = "rotateEnabled", defaultBoolean = true)
97
- override fun setRotateEnabled(view: LuggGoogleMapView, value: Boolean) {
126
+ override fun setRotateEnabled(view: LuggMapView, value: Boolean) {
98
127
  view.setRotateEnabled(value)
99
128
  }
100
129
 
101
130
  @ReactProp(name = "pitchEnabled", defaultBoolean = true)
102
- override fun setPitchEnabled(view: LuggGoogleMapView, value: Boolean) {
131
+ override fun setPitchEnabled(view: LuggMapView, value: Boolean) {
103
132
  view.setPitchEnabled(value)
104
133
  }
105
134
 
106
135
  @ReactProp(name = "userLocationEnabled", defaultBoolean = false)
107
- override fun setUserLocationEnabled(view: LuggGoogleMapView, value: Boolean) {
136
+ override fun setUserLocationEnabled(view: LuggMapView, value: Boolean) {
108
137
  view.setUserLocationEnabled(value)
109
138
  }
110
139
 
140
+ @ReactProp(name = "userLocationButtonEnabled", defaultBoolean = false)
141
+ override fun setUserLocationButtonEnabled(view: LuggMapView, value: Boolean) {
142
+ view.setUserLocationButtonEnabled(value)
143
+ }
144
+
111
145
  @ReactProp(name = "minZoom")
112
- override fun setMinZoom(view: LuggGoogleMapView, value: Double) {
146
+ override fun setMinZoom(view: LuggMapView, value: Double) {
113
147
  view.setMinZoom(value)
114
148
  }
115
149
 
116
150
  @ReactProp(name = "maxZoom")
117
- override fun setMaxZoom(view: LuggGoogleMapView, value: Double) {
151
+ override fun setMaxZoom(view: LuggMapView, value: Double) {
118
152
  view.setMaxZoom(value)
119
153
  }
120
154
 
121
- @ReactProp(name = "padding")
122
- override fun setPadding(view: LuggGoogleMapView, value: ReadableMap?) {
155
+ @ReactProp(name = "theme")
156
+ override fun setTheme(view: LuggMapView, value: String?) {
157
+ view.setTheme(value ?: "system")
158
+ }
159
+
160
+ @ReactProp(name = "edgeInsets")
161
+ override fun setEdgeInsets(view: LuggMapView, value: ReadableMap?) {
123
162
  value?.let {
124
163
  val top = if (it.hasKey("top")) it.getDouble("top").toFloat().dpToPx().toInt() else 0
125
164
  val left = if (it.hasKey("left")) it.getDouble("left").toFloat().dpToPx().toInt() else 0
126
165
  val bottom = if (it.hasKey("bottom")) it.getDouble("bottom").toFloat().dpToPx().toInt() else 0
127
166
  val right = if (it.hasKey("right")) it.getDouble("right").toFloat().dpToPx().toInt() else 0
128
- view.setMapPadding(top, left, bottom, right)
167
+ view.setEdgeInsets(top, left, bottom, right)
129
168
  }
130
169
  }
131
170
 
132
- override fun onDropViewInstance(view: LuggGoogleMapView) {
171
+ override fun onDropViewInstance(view: LuggMapView) {
133
172
  super.onDropViewInstance(view)
134
173
  view.onDropViewInstance()
135
174
  }
136
175
 
137
176
  override fun moveCamera(
138
- view: LuggGoogleMapView,
177
+ view: LuggMapView,
139
178
  latitude: Double,
140
179
  longitude: Double,
141
180
  zoom: Double,
@@ -144,13 +183,30 @@ class LuggGoogleMapViewManager :
144
183
  view.moveCamera(latitude, longitude, zoom, duration.toInt())
145
184
  }
146
185
 
186
+ override fun setEdgeInsets(
187
+ view: LuggMapView,
188
+ top: Double,
189
+ left: Double,
190
+ bottom: Double,
191
+ right: Double,
192
+ duration: Double
193
+ ) {
194
+ view.setEdgeInsets(
195
+ top.toFloat().dpToPx().toInt(),
196
+ left.toFloat().dpToPx().toInt(),
197
+ bottom.toFloat().dpToPx().toInt(),
198
+ right.toFloat().dpToPx().toInt(),
199
+ duration.toInt()
200
+ )
201
+ }
202
+
147
203
  override fun fitCoordinates(
148
- view: LuggGoogleMapView,
204
+ view: LuggMapView,
149
205
  coordinates: ReadableArray?,
150
- paddingTop: Double,
151
- paddingLeft: Double,
152
- paddingBottom: Double,
153
- paddingRight: Double,
206
+ edgeInsetsTop: Double,
207
+ edgeInsetsLeft: Double,
208
+ edgeInsetsBottom: Double,
209
+ edgeInsetsRight: Double,
154
210
  duration: Double
155
211
  ) {
156
212
  val coords = mutableListOf<LatLng>()
@@ -162,10 +218,17 @@ class LuggGoogleMapViewManager :
162
218
  coords.add(LatLng(lat, lng))
163
219
  }
164
220
  }
165
- view.fitCoordinates(coords, paddingTop.toInt(), paddingLeft.toInt(), paddingBottom.toInt(), paddingRight.toInt(), duration.toInt())
221
+ view.fitCoordinates(
222
+ coords,
223
+ edgeInsetsTop.toInt(),
224
+ edgeInsetsLeft.toInt(),
225
+ edgeInsetsBottom.toInt(),
226
+ edgeInsetsRight.toInt(),
227
+ duration.toInt()
228
+ )
166
229
  }
167
230
 
168
231
  companion object {
169
- const val NAME = "LuggGoogleMapView"
232
+ const val NAME = "LuggMapView"
170
233
  }
171
234
  }
@@ -1,21 +1,18 @@
1
1
  package com.luggmaps
2
2
 
3
3
  import android.annotation.SuppressLint
4
+ import android.view.MotionEvent
4
5
  import com.facebook.react.uimanager.ThemedReactContext
5
6
  import com.facebook.react.views.view.ReactViewGroup
6
7
 
7
8
  @SuppressLint("ViewConstructor")
8
9
  class LuggMapWrapperView(context: ThemedReactContext) : ReactViewGroup(context) {
9
10
 
10
- override fun requestLayout() {
11
- super.requestLayout()
12
- getChildAt(0)?.let {
13
- it.measure(
14
- MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
15
- MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
16
- )
17
- it.layout(0, 0, width, height)
18
- }
11
+ var touchEventHandler: ((MotionEvent) -> Unit)? = null
12
+
13
+ override fun dispatchTouchEvent(event: MotionEvent): Boolean {
14
+ touchEventHandler?.invoke(event)
15
+ return super.dispatchTouchEvent(event)
19
16
  }
20
17
 
21
18
  override fun onLayout(
@@ -26,14 +23,14 @@ class LuggMapWrapperView(context: ThemedReactContext) : ReactViewGroup(context)
26
23
  bottom: Int
27
24
  ) {
28
25
  super.onLayout(changed, left, top, right, bottom)
29
- val width = right - left
30
- val height = bottom - top
26
+ val w = right - left
27
+ val h = bottom - top
31
28
  getChildAt(0)?.let {
32
29
  it.measure(
33
- MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
34
- MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
30
+ MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY),
31
+ MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY)
35
32
  )
36
- it.layout(0, 0, width, height)
33
+ it.layout(0, 0, w, h)
37
34
  }
38
35
  }
39
36
  }
@@ -1,10 +1,17 @@
1
1
  package com.luggmaps
2
2
 
3
3
  import android.content.Context
4
+ import android.graphics.Canvas
4
5
  import android.view.View
6
+ import androidx.core.graphics.createBitmap
5
7
  import androidx.core.view.isNotEmpty
6
8
  import com.facebook.react.views.view.ReactViewGroup
7
9
  import com.google.android.gms.maps.model.AdvancedMarker
10
+ import com.google.android.gms.maps.model.BitmapDescriptor
11
+ import com.google.android.gms.maps.model.BitmapDescriptorFactory
12
+ import com.luggmaps.events.MarkerDragEvent
13
+ import com.luggmaps.events.MarkerPressEvent
14
+ import com.luggmaps.extensions.dispatchEvent
8
15
 
9
16
  interface LuggMarkerViewDelegate {
10
17
  fun markerViewDidUpdate(markerView: LuggMarkerView)
@@ -12,6 +19,8 @@ interface LuggMarkerViewDelegate {
12
19
  }
13
20
 
14
21
  class LuggMarkerView(context: Context) : ReactViewGroup(context) {
22
+ private var scaleUpdateRunnable: Runnable? = null
23
+
15
24
  var name: String? = null
16
25
  private set
17
26
 
@@ -36,23 +45,113 @@ class LuggMarkerView(context: Context) : ReactViewGroup(context) {
36
45
  var zIndex: Float = 0f
37
46
  private set
38
47
 
48
+ var rotate: Float = 0f
49
+ private set
50
+
51
+ var scale: Float = 1f
52
+ private set
53
+
54
+ var scaleChanged: Boolean = false
55
+ private set
56
+
57
+ var rasterize: Boolean = true
58
+ private set
59
+
60
+ var draggable: Boolean = false
61
+ private set
62
+
63
+ var isDragging: Boolean = false
64
+
39
65
  var didLayout: Boolean = false
40
66
  private set
41
67
 
42
68
  val hasCustomView: Boolean
43
- get() = iconView.isNotEmpty()
44
-
45
- val iconView: ReactViewGroup = object : ReactViewGroup(context) {
46
- override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
47
- var maxWidth = 0
48
- var maxHeight = 0
49
- for (i in 0 until childCount) {
50
- val child = getChildAt(i)
51
- if (child.width > maxWidth) maxWidth = child.width
52
- if (child.height > maxHeight) maxHeight = child.height
69
+ get() = contentView.isNotEmpty()
70
+
71
+ val contentView: ReactViewGroup = ReactViewGroup(context)
72
+
73
+ var onUpdate: (() -> Unit)? = null
74
+
75
+ var calloutView: LuggCalloutView? = null
76
+ private set
77
+
78
+ private fun measureContentBounds(): Pair<Int, Int> {
79
+ var maxWidth = 0
80
+ var maxHeight = 0
81
+ for (i in 0 until contentView.childCount) {
82
+ val child = contentView.getChildAt(i)
83
+ val childRight = child.left + child.width
84
+ val childBottom = child.top + child.height
85
+ if (childRight > maxWidth) maxWidth = childRight
86
+ if (childBottom > maxHeight) maxHeight = childBottom
87
+ }
88
+ return Pair(maxWidth, maxHeight)
89
+ }
90
+
91
+ private fun createContentBitmap(): BitmapDescriptor? {
92
+ val (width, height) = measureContentBounds()
93
+ if (width <= 0 || height <= 0) return null
94
+
95
+ val scaledWidth = (width * scale).toInt()
96
+ val scaledHeight = (height * scale).toInt()
97
+
98
+ val bitmap = createBitmap(scaledWidth, scaledHeight)
99
+ val canvas = Canvas(bitmap)
100
+ canvas.scale(scale, scale)
101
+ contentView.draw(canvas)
102
+ return BitmapDescriptorFactory.fromBitmap(bitmap)
103
+ }
104
+
105
+ fun layoutContentView() {
106
+ val (width, height) = measureContentBounds()
107
+ val scaledWidth = (width * scale).toInt()
108
+ val scaledHeight = (height * scale).toInt()
109
+
110
+ contentView.scaleX = scale
111
+ contentView.scaleY = scale
112
+ contentView.pivotX = 0f
113
+ contentView.pivotY = 0f
114
+
115
+ contentView.measure(
116
+ View.MeasureSpec.makeMeasureSpec(scaledWidth, View.MeasureSpec.EXACTLY),
117
+ View.MeasureSpec.makeMeasureSpec(scaledHeight, View.MeasureSpec.EXACTLY)
118
+ )
119
+ contentView.layout(0, 0, scaledWidth, scaledHeight)
120
+ }
121
+
122
+ fun applyIconToMarker() {
123
+ val m = marker ?: return
124
+ if (!hasCustomView) return
125
+ createContentBitmap()?.let { m.setIcon(it) }
126
+ }
127
+
128
+ fun applyScaleToMarker() {
129
+ val m = marker ?: return
130
+ if (!hasCustomView) return
131
+
132
+ scaleUpdateRunnable?.let { removeCallbacks(it) }
133
+ scaleUpdateRunnable = Runnable {
134
+ if (rasterize) {
135
+ createContentBitmap()?.let { m.setIcon(it) }
136
+ } else {
137
+ layoutContentView()
138
+ onUpdate?.invoke()
53
139
  }
140
+ }
141
+ post(scaleUpdateRunnable)
142
+ }
54
143
 
55
- setMeasuredDimension(maxWidth, maxHeight)
144
+ fun updateIcon(onAddMarker: () -> Unit) {
145
+ if (!hasCustomView) return
146
+ post {
147
+ if (marker == null) {
148
+ onAddMarker()
149
+ } else if (rasterize) {
150
+ applyIconToMarker()
151
+ } else {
152
+ layoutContentView()
153
+ onUpdate?.invoke()
154
+ }
56
155
  }
57
156
  }
58
157
 
@@ -61,23 +160,52 @@ class LuggMarkerView(context: Context) : ReactViewGroup(context) {
61
160
  }
62
161
 
63
162
  override fun addView(child: View, index: Int) {
64
- iconView.addView(child, index)
163
+ if (child is LuggCalloutView) {
164
+ calloutView = child
165
+ } else {
166
+ contentView.addView(child, index)
167
+ }
65
168
  didLayout = false
66
169
  }
67
170
 
68
171
  override fun removeView(child: View) {
69
- iconView.removeView(child)
172
+ if (child is LuggCalloutView) {
173
+ calloutView = null
174
+ } else {
175
+ contentView.removeView(child)
176
+ }
70
177
  didLayout = false
71
178
  }
72
179
 
73
180
  override fun removeViewAt(index: Int) {
74
- iconView.removeViewAt(index)
181
+ val child = getChildAt(index)
182
+ if (child is LuggCalloutView) {
183
+ calloutView = null
184
+ } else {
185
+ contentView.removeViewAt(index)
186
+ }
187
+ didLayout = false
188
+ }
189
+
190
+ override fun removeViews(start: Int, count: Int) {
191
+ for (i in (start until start + count).reversed()) {
192
+ val child = getChildAt(i)
193
+ if (child is LuggCalloutView) {
194
+ calloutView = null
195
+ } else if (i < contentView.childCount) {
196
+ contentView.removeViewAt(i)
197
+ }
198
+ }
75
199
  didLayout = false
76
200
  }
77
201
 
78
- override fun getChildCount(): Int = iconView.childCount
202
+ override fun getChildCount(): Int = contentView.childCount + if (calloutView != null) 1 else 0
79
203
 
80
- override fun getChildAt(index: Int): View? = iconView.getChildAt(index)
204
+ override fun getChildAt(index: Int): View? {
205
+ if (index < contentView.childCount) return contentView.getChildAt(index)
206
+ if (index == contentView.childCount && calloutView != null) return calloutView
207
+ return null
208
+ }
81
209
 
82
210
  override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
83
211
  super.onSizeChanged(w, h, oldw, oldh)
@@ -92,6 +220,7 @@ class LuggMarkerView(context: Context) : ReactViewGroup(context) {
92
220
  bottom: Int
93
221
  ) {
94
222
  super.onLayout(changed, left, top, right, bottom)
223
+
95
224
  if (changed && !didLayout) {
96
225
  didLayout = true
97
226
  delegate?.markerViewDidLayout(this)
@@ -120,6 +249,43 @@ class LuggMarkerView(context: Context) : ReactViewGroup(context) {
120
249
  this.zIndex = zIndex
121
250
  }
122
251
 
252
+ fun setRotate(rotate: Float) {
253
+ this.rotate = rotate
254
+ }
255
+
256
+ fun setScale(scale: Float) {
257
+ scaleChanged = this.scale != scale
258
+ this.scale = scale
259
+ }
260
+
261
+ fun clearScaleChanged() {
262
+ scaleChanged = false
263
+ }
264
+
265
+ fun setRasterize(rasterize: Boolean) {
266
+ this.rasterize = rasterize
267
+ }
268
+
269
+ fun setDraggable(draggable: Boolean) {
270
+ this.draggable = draggable
271
+ }
272
+
273
+ fun emitPressEvent(x: Float, y: Float) {
274
+ dispatchEvent(MarkerPressEvent(this, latitude, longitude, x, y))
275
+ }
276
+
277
+ fun emitDragStartEvent(x: Float, y: Float) {
278
+ dispatchEvent(MarkerDragEvent(this, MarkerDragEvent.DRAG_START, latitude, longitude, x, y))
279
+ }
280
+
281
+ fun emitDragChangeEvent(x: Float, y: Float) {
282
+ dispatchEvent(MarkerDragEvent(this, MarkerDragEvent.DRAG_CHANGE, latitude, longitude, x, y))
283
+ }
284
+
285
+ fun emitDragEndEvent(x: Float, y: Float) {
286
+ dispatchEvent(MarkerDragEvent(this, MarkerDragEvent.DRAG_END, latitude, longitude, x, y))
287
+ }
288
+
123
289
  fun setName(name: String?) {
124
290
  this.name = name
125
291
  }
@@ -129,12 +295,12 @@ class LuggMarkerView(context: Context) : ReactViewGroup(context) {
129
295
  }
130
296
 
131
297
  fun onDropViewInstance() {
298
+ scaleUpdateRunnable?.let { removeCallbacks(it) }
299
+ scaleUpdateRunnable = null
300
+ onUpdate = null
132
301
  didLayout = false
302
+ calloutView = null
133
303
  delegate = null
134
- iconView.removeAllViews()
135
- }
136
-
137
- companion object {
138
- private const val TAG = "Lugg"
304
+ contentView.removeAllViews()
139
305
  }
140
306
  }
@@ -20,6 +20,14 @@ class LuggMarkerViewManager :
20
20
  override fun getName(): String = NAME
21
21
  override fun createViewInstance(context: ThemedReactContext): LuggMarkerView = LuggMarkerView(context)
22
22
 
23
+ override fun getExportedCustomDirectEventTypeConstants(): Map<String, Any> =
24
+ mapOf(
25
+ "topMarkerPress" to mapOf("registrationName" to "onMarkerPress"),
26
+ "topMarkerDragStart" to mapOf("registrationName" to "onMarkerDragStart"),
27
+ "topMarkerDragChange" to mapOf("registrationName" to "onMarkerDragChange"),
28
+ "topMarkerDragEnd" to mapOf("registrationName" to "onMarkerDragEnd")
29
+ )
30
+
23
31
  override fun onDropViewInstance(view: LuggMarkerView) {
24
32
  super.onDropViewInstance(view)
25
33
  view.onDropViewInstance()
@@ -69,6 +77,26 @@ class LuggMarkerViewManager :
69
77
  view.setZIndex(zIndex)
70
78
  }
71
79
 
80
+ @ReactProp(name = "rotate", defaultDouble = 0.0)
81
+ override fun setRotate(view: LuggMarkerView, value: Double) {
82
+ view.setRotate(value.toFloat())
83
+ }
84
+
85
+ @ReactProp(name = "scale", defaultDouble = 1.0)
86
+ override fun setScale(view: LuggMarkerView, value: Double) {
87
+ view.setScale(value.toFloat())
88
+ }
89
+
90
+ @ReactProp(name = "rasterize", defaultBoolean = true)
91
+ override fun setRasterize(view: LuggMarkerView, value: Boolean) {
92
+ view.setRasterize(value)
93
+ }
94
+
95
+ @ReactProp(name = "draggable", defaultBoolean = false)
96
+ override fun setDraggable(view: LuggMarkerView, value: Boolean) {
97
+ view.setDraggable(value)
98
+ }
99
+
72
100
  companion object {
73
101
  const val NAME = "LuggMarkerView"
74
102
  }
@@ -1,13 +1,17 @@
1
1
  package com.luggmaps
2
2
 
3
3
  import com.facebook.react.ReactPackage
4
- import com.facebook.react.bridge.NativeModule
5
4
  import com.facebook.react.bridge.ReactApplicationContext
6
5
  import com.facebook.react.uimanager.ViewManager
7
6
 
8
7
  class LuggPackage : ReactPackage {
9
8
  override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> =
10
- listOf(LuggGoogleMapViewManager(), LuggMarkerViewManager(), LuggMapWrapperViewManager(), LuggPolylineViewManager())
11
-
12
- override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> = emptyList()
9
+ listOf(
10
+ LuggMapViewManager(),
11
+ LuggMarkerViewManager(),
12
+ LuggCalloutViewManager(),
13
+ LuggMapWrapperViewManager(),
14
+ LuggPolylineViewManager(),
15
+ LuggPolygonViewManager()
16
+ )
13
17
  }