Skip to content

Commit 9faa702

Browse files
committed
refactor: optional props
1 parent c15be5e commit 9faa702

6 files changed

Lines changed: 273 additions & 214 deletions

File tree

android/src/main/java/com/rngooglemapsplus/GoogleMapsViewImpl.kt

Lines changed: 68 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import com.google.android.gms.maps.OnMapReadyCallback
1414
import com.google.android.gms.maps.model.CameraPosition
1515
import com.google.android.gms.maps.model.LatLng
1616
import com.google.android.gms.maps.model.LatLngBounds
17-
import com.google.android.gms.maps.model.MapColorScheme
1817
import com.google.android.gms.maps.model.MapStyleOptions
1918
import com.google.android.gms.maps.model.Marker
2019
import com.google.android.gms.maps.model.MarkerOptions
@@ -38,25 +37,14 @@ class GoogleMapsViewImpl(
3837
LifecycleEventListener {
3938
private var googleMap: GoogleMap? = null
4039

41-
private var pendingBuildingEnabled: Boolean = false
42-
private var pendingTrafficEnabled: Boolean = false
40+
private var pendingBuildingEnabled: Boolean? = null
41+
private var pendingTrafficEnabled: Boolean? = null
4342
private var pendingCustomMapStyle: MapStyleOptions? = null
44-
private var pendingInitialCamera: CameraPosition =
45-
CameraPosition
46-
.builder()
47-
.target(
48-
LatLng(
49-
0.0,
50-
0.0,
51-
),
52-
).zoom(0f)
53-
.bearing(0f)
54-
.tilt(0f)
55-
.build()
56-
private var pendingUserInterfaceStyle: Int = MapColorScheme.FOLLOW_SYSTEM
57-
private var pendingMinZoomLevel: Double = 0.0
58-
private var pendingMaxZoomLevel: Double = 21.0
59-
private var pendingMapPadding: RNMapPadding = RNMapPadding(0.0, 0.0, 0.0, 0.0)
43+
private var pendingInitialCamera: CameraPosition? = null
44+
private var pendingUserInterfaceStyle: Int? = null
45+
private var pendingMinZoomLevel: Double? = null
46+
private var pendingMaxZoomLevel: Double? = null
47+
private var pendingMapPadding: RNMapPadding? = null
6048
private val pendingPolygons = mutableListOf<Pair<String, PolygonOptions>>()
6149
private val pendingPolylines = mutableListOf<Pair<String, PolylineOptions>>()
6250
private val pendingMarkers = mutableListOf<Pair<String, MarkerOptions>>()
@@ -235,27 +223,37 @@ class GoogleMapsViewImpl(
235223

236224
fun applyPending() {
237225
onUi {
238-
googleMap?.setPadding(
239-
pendingMapPadding.left.dpToPx().toInt(),
240-
pendingMapPadding.top.dpToPx().toInt(),
241-
pendingMapPadding.right.dpToPx().toInt(),
242-
pendingMapPadding.bottom.dpToPx().toInt(),
243-
)
244-
245-
pendingInitialCamera.let {
226+
pendingMapPadding?.let {
227+
googleMap?.setPadding(
228+
it.left.dpToPx().toInt(),
229+
it.top.dpToPx().toInt(),
230+
it.right.dpToPx().toInt(),
231+
it.bottom.dpToPx().toInt(),
232+
)
233+
}
234+
pendingInitialCamera?.let {
246235
googleMap?.moveCamera(
247236
CameraUpdateFactory.newCameraPosition(
248237
it,
249238
),
250239
)
251240
}
252-
253-
googleMap?.isBuildingsEnabled = pendingBuildingEnabled
254-
googleMap?.isTrafficEnabled = pendingTrafficEnabled
241+
pendingBuildingEnabled?.let {
242+
googleMap?.isBuildingsEnabled = it
243+
}
244+
pendingTrafficEnabled?.let {
245+
googleMap?.isTrafficEnabled = it
246+
}
255247
googleMap?.setMapStyle(pendingCustomMapStyle)
256-
googleMap?.mapColorScheme = pendingUserInterfaceStyle
257-
googleMap?.setMinZoomPreference(pendingMinZoomLevel.toFloat())
258-
googleMap?.setMaxZoomPreference(pendingMaxZoomLevel.toFloat())
248+
pendingUserInterfaceStyle?.let {
249+
googleMap?.mapColorScheme = it
250+
}
251+
pendingMinZoomLevel?.let {
252+
googleMap?.setMinZoomPreference(it.toFloat())
253+
}
254+
pendingMaxZoomLevel?.let {
255+
googleMap?.setMaxZoomPreference(it.toFloat())
256+
}
259257
}
260258

261259
if (pendingMarkers.isNotEmpty()) {
@@ -280,21 +278,25 @@ class GoogleMapsViewImpl(
280278
}
281279
}
282280

283-
var buildingEnabled: Boolean
281+
var buildingEnabled: Boolean?
284282
get() = googleMap?.isBuildingsEnabled ?: pendingBuildingEnabled
285283
set(value) {
286284
pendingBuildingEnabled = value
287-
onUi {
288-
googleMap?.isBuildingsEnabled = value
285+
value?.let {
286+
onUi {
287+
googleMap?.isBuildingsEnabled = it
288+
}
289289
}
290290
}
291291

292-
var trafficEnabled: Boolean
292+
var trafficEnabled: Boolean?
293293
get() = googleMap?.isTrafficEnabled ?: pendingTrafficEnabled
294294
set(value) {
295295
pendingTrafficEnabled = value
296-
onUi {
297-
googleMap?.isTrafficEnabled = value
296+
value?.let {
297+
onUi {
298+
googleMap?.isTrafficEnabled = it
299+
}
298300
}
299301
}
300302

@@ -307,50 +309,59 @@ class GoogleMapsViewImpl(
307309
}
308310
}
309311

310-
var initialCamera: CameraPosition
312+
var initialCamera: CameraPosition?
311313
get() = pendingInitialCamera
312314
set(value) {
313315
pendingInitialCamera = value
314316
}
315317

316-
var userInterfaceStyle: Int
318+
var userInterfaceStyle: Int?
317319
get() = pendingUserInterfaceStyle
318320
set(value) {
319321
pendingUserInterfaceStyle = value
320-
onUi {
321-
googleMap?.mapColorScheme = value
322+
323+
value?.let {
324+
onUi {
325+
googleMap?.mapColorScheme = it
326+
}
322327
}
323328
}
324329

325-
var minZoomLevel: Double
330+
var minZoomLevel: Double?
326331
get() = pendingMinZoomLevel
327332
set(value) {
328333
pendingMinZoomLevel = value
329-
onUi {
330-
googleMap?.setMinZoomPreference(value.toFloat())
334+
value?.let {
335+
onUi {
336+
googleMap?.setMinZoomPreference(it.toFloat())
337+
}
331338
}
332339
}
333340

334-
var maxZoomLevel: Double
341+
var maxZoomLevel: Double?
335342
get() = pendingMaxZoomLevel
336343
set(value) {
337344
pendingMaxZoomLevel = value
338-
onUi {
339-
googleMap?.setMaxZoomPreference(value.toFloat())
345+
value?.let {
346+
onUi {
347+
googleMap?.setMaxZoomPreference(it.toFloat())
348+
}
340349
}
341350
}
342351

343-
var mapPadding: RNMapPadding
352+
var mapPadding: RNMapPadding?
344353
get() = pendingMapPadding
345354
set(value) {
346355
pendingMapPadding = value
347-
onUi {
348-
googleMap?.setPadding(
349-
value.left.dpToPx().toInt(),
350-
value.top.dpToPx().toInt(),
351-
value.right.dpToPx().toInt(),
352-
value.bottom.dpToPx().toInt(),
353-
)
356+
value?.let {
357+
onUi {
358+
googleMap?.setPadding(
359+
it.left.dpToPx().toInt(),
360+
it.top.dpToPx().toInt(),
361+
it.right.dpToPx().toInt(),
362+
it.bottom.dpToPx().toInt(),
363+
)
364+
}
354365
}
355366
}
356367

android/src/main/java/com/rngooglemapsplus/RNGoogleMapsPlusView.kt

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import com.margelo.nitro.core.Promise
1313
class RNGoogleMapsPlusView(
1414
val context: ThemedReactContext,
1515
) : HybridRNGoogleMapsPlusViewSpec() {
16-
private var currentCustomMapStyle: String = ""
16+
private var currentCustomMapStyle: String? = null
1717
private var permissionHandler = PermissionHandler(context)
1818
private var locationHandler = LocationHandler(context)
1919
private var playServiceHandler = PlayServicesHandler(context)
@@ -25,59 +25,61 @@ class RNGoogleMapsPlusView(
2525
private val polylineOptions = MapPolylineOptions()
2626
private val polygonOptions = MapPolygonOptions()
2727

28-
override var buildingEnabled: Boolean
28+
override var buildingEnabled: Boolean?
2929
get() = view.buildingEnabled
3030
set(value) {
3131
view.buildingEnabled = value
3232
}
3333

34-
override var trafficEnabled: Boolean
34+
override var trafficEnabled: Boolean?
3535
get() = view.trafficEnabled
3636
set(value) {
3737
view.trafficEnabled = value
3838
}
3939

40-
override var customMapStyle: String
40+
override var customMapStyle: String?
4141
get() = currentCustomMapStyle
4242
set(value) {
4343
currentCustomMapStyle = value
44-
view.customMapStyle = MapStyleOptions(value)
44+
value?.let {
45+
view.customMapStyle = MapStyleOptions(it)
46+
}
4547
}
4648

47-
override var initialCamera: RNCamera
49+
override var initialCamera: RNCamera?
4850
get() = mapCameraPotionToCamera(view.initialCamera)
4951
set(value) {
5052
view.initialCamera = mapCameraToCameraPosition(value)
5153
}
5254

53-
override var userInterfaceStyle: RNUserInterfaceStyle
55+
override var userInterfaceStyle: RNUserInterfaceStyle?
5456
get() = mapColorSchemeToUserInterfaceStyle(view.userInterfaceStyle)
5557
set(value) {
5658
view.userInterfaceStyle = userInterfaceStyleToMapColorScheme(value)
5759
}
5860

59-
override var minZoomLevel: Double
61+
override var minZoomLevel: Double?
6062
get() = view.minZoomLevel
6163
set(value) {
6264
view.minZoomLevel = value
6365
}
6466

65-
override var maxZoomLevel: Double
67+
override var maxZoomLevel: Double?
6668
get() = view.maxZoomLevel
6769
set(value) {
6870
view.maxZoomLevel = value
6971
}
7072

71-
override var mapPadding: RNMapPadding
73+
override var mapPadding: RNMapPadding?
7274
get() = view.mapPadding
7375
set(value) {
7476
view.mapPadding = value
7577
}
7678

77-
override var markers: Array<RNMarker> = emptyArray()
79+
override var markers: Array<RNMarker>? = emptyArray()
7880
set(value) {
79-
val prevById = field.associateBy { it.id }
80-
val nextById = value.associateBy { it.id }
81+
val prevById = field?.associateBy { it.id } ?: emptyMap()
82+
val nextById = value?.associateBy { it.id } ?: emptyMap()
8183

8284
(prevById.keys - nextById.keys).forEach { id ->
8385
markerOptions.cancelIconJob(id)
@@ -124,10 +126,10 @@ class RNGoogleMapsPlusView(
124126
field = value
125127
}
126128

127-
override var polylines: Array<RNPolyline> = emptyArray()
129+
override var polylines: Array<RNPolyline>? = emptyArray()
128130
set(value) {
129-
val prevById = field.associateBy { it.id }
130-
val nextById = value.associateBy { it.id }
131+
val prevById = field?.associateBy { it.id } ?: emptyMap()
132+
val nextById = value?.associateBy { it.id } ?: emptyMap()
131133

132134
(prevById.keys - nextById.keys).forEach { id ->
133135
view.removePolyline(id)
@@ -161,10 +163,10 @@ class RNGoogleMapsPlusView(
161163
field = value
162164
}
163165

164-
override var polygons: Array<RNPolygon> = emptyArray()
166+
override var polygons: Array<RNPolygon>? = emptyArray()
165167
set(value) {
166-
val prevById = field.associateBy { it.id }
167-
val nextById = value.associateBy { it.id }
168+
val prevById = field?.associateBy { it.id } ?: emptyMap()
169+
val nextById = value?.associateBy { it.id } ?: emptyMap()
168170

169171
(prevById.keys - nextById.keys).forEach { id ->
170172
view.removePolygon(id)
@@ -280,8 +282,9 @@ class RNGoogleMapsPlusView(
280282

281283
override fun isGooglePlayServicesAvailable(): Boolean = playServiceHandler.isPlayServicesAvailable()
282284

283-
fun userInterfaceStyleToMapColorScheme(value: RNUserInterfaceStyle): Int =
284-
when (value) {
285+
fun userInterfaceStyleToMapColorScheme(value: RNUserInterfaceStyle?): Int? {
286+
value ?: return null
287+
return when (value) {
285288
RNUserInterfaceStyle.LIGHT -> {
286289
MapColorScheme.LIGHT
287290
}
@@ -294,8 +297,10 @@ class RNGoogleMapsPlusView(
294297
MapColorScheme.FOLLOW_SYSTEM
295298
}
296299
}
300+
}
297301

298-
fun mapCameraToCameraPosition(camera: RNCamera): CameraPosition {
302+
fun mapCameraToCameraPosition(camera: RNCamera?): CameraPosition? {
303+
camera ?: return null
299304
val builder = CameraPosition.builder()
300305
camera.center?.let {
301306
builder.target(
@@ -312,15 +317,18 @@ class RNGoogleMapsPlusView(
312317
return builder.build()
313318
}
314319

315-
fun mapCameraPotionToCamera(cameraPosition: CameraPosition): RNCamera =
316-
RNCamera(
320+
fun mapCameraPotionToCamera(cameraPosition: CameraPosition?): RNCamera? {
321+
cameraPosition ?: return null
322+
323+
return RNCamera(
317324
center = RNLatLng(cameraPosition.target.latitude, cameraPosition.target.longitude),
318325
zoom = cameraPosition.zoom.toDouble(),
319326
bearing = cameraPosition.bearing.toDouble(),
320327
tilt = cameraPosition.tilt.toDouble(),
321328
)
329+
}
322330

323-
fun mapColorSchemeToUserInterfaceStyle(value: Int): RNUserInterfaceStyle =
331+
fun mapColorSchemeToUserInterfaceStyle(value: Int?): RNUserInterfaceStyle =
324332
when (value) {
325333
MapColorScheme.LIGHT -> RNUserInterfaceStyle.LIGHT
326334
MapColorScheme.DARK -> RNUserInterfaceStyle.DARK

0 commit comments

Comments
 (0)