From 810c3378040d26207264986b571f98559a390441 Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Thu, 14 Jul 2022 10:04:28 -0700 Subject: [PATCH] fix: GoogleMap breaking preview mode. Change-Id: I033c5878304639dc22107f7e540496ee564d9c2c --- app/build.gradle | 2 + .../maps/android/compose/BasicMapActivity.kt | 42 ++++++- .../maps/android/compose/MainActivity.kt | 116 ++++++++++-------- .../maps/android/compose/theme/Theme.kt | 18 +++ .../google/maps/android/compose/GoogleMap.kt | 6 + 5 files changed, 129 insertions(+), 55 deletions(-) create mode 100644 app/src/main/java/com/google/maps/android/compose/theme/Theme.kt diff --git a/app/build.gradle b/app/build.gradle index 2e2ab5e8..7d0979c9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,6 +45,8 @@ dependencies { implementation 'com.google.maps.android:maps-ktx:3.3.0' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'com.google.maps.android:android-maps-utils:2.3.0' + implementation 'androidx.compose.ui:ui-tooling-preview:1.1.1' + debugImplementation 'androidx.compose.ui:ui-tooling:1.1.1' androidTestImplementation "androidx.test:core:$androidx_test_version" androidTestImplementation "androidx.test:rules:$androidx_test_version" diff --git a/app/src/main/java/com/google/maps/android/compose/BasicMapActivity.kt b/app/src/main/java/com/google/maps/android/compose/BasicMapActivity.kt index d8871816..2e0d02d4 100644 --- a/app/src/main/java/com/google/maps/android/compose/BasicMapActivity.kt +++ b/app/src/main/java/com/google/maps/android/compose/BasicMapActivity.kt @@ -24,18 +24,39 @@ import androidx.compose.animation.fadeOut import androidx.compose.foundation.ScrollState import androidx.compose.foundation.background import androidx.compose.foundation.horizontalScroll -import androidx.compose.foundation.layout.* -import androidx.compose.material.* -import androidx.compose.runtime.* +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.material.Button +import androidx.compose.material.ButtonDefaults +import androidx.compose.material.CircularProgressIndicator +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Switch +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.testTag +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.google.android.gms.maps.CameraUpdateFactory import com.google.android.gms.maps.model.BitmapDescriptorFactory import com.google.android.gms.maps.model.CameraPosition import com.google.android.gms.maps.model.LatLng import com.google.android.gms.maps.model.Marker +import com.google.maps.android.compose.theme.MapsComposeSampleTheme import kotlinx.coroutines.launch private const val TAG = "BasicMapActivity" @@ -86,9 +107,9 @@ class BasicMapActivity : ComponentActivity() { @Composable fun GoogleMapView( - modifier: Modifier, - cameraPositionState: CameraPositionState, - onMapLoaded: () -> Unit, + modifier: Modifier = Modifier, + cameraPositionState: CameraPositionState = rememberCameraPositionState(), + onMapLoaded: () -> Unit = {}, content: @Composable () -> Unit = {} ) { val singaporeState = rememberMarkerState(position = singapore) @@ -295,3 +316,12 @@ private fun DebugView( Text(text = "Marker position is ${markerState.position}") } } + + +@Preview +@Composable +fun GoogleMapViewPreview() { + MapsComposeSampleTheme { + GoogleMapView(Modifier.fillMaxSize()) + } +} diff --git a/app/src/main/java/com/google/maps/android/compose/MainActivity.kt b/app/src/main/java/com/google/maps/android/compose/MainActivity.kt index 4ca344be..301ed2c4 100644 --- a/app/src/main/java/com/google/maps/android/compose/MainActivity.kt +++ b/app/src/main/java/com/google/maps/android/compose/MainActivity.kt @@ -30,6 +30,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp +import com.google.maps.android.compose.theme.MapsComposeSampleTheme private const val TAG = "MapSampleActivity" @@ -38,58 +39,75 @@ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { - Surface( - modifier = Modifier.fillMaxSize(), - color = MaterialTheme.colors.background - ) { - val context = LocalContext.current - Column( - Modifier - .fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally + MapsComposeSampleTheme { + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colors.background ) { - Spacer(modifier = Modifier.padding(10.dp)) - Text( - text = getString(R.string.main_activity_title), - style = MaterialTheme.typography.h5 - ) - Spacer(modifier = Modifier.padding(10.dp)) - Button( - onClick = { - context.startActivity(Intent(context, BasicMapActivity::class.java)) - }) { - Text(getString(R.string.basic_map_activity)) - } - Spacer(modifier = Modifier.padding(5.dp)) - Button( - onClick = { - context.startActivity(Intent(context, MapInColumnActivity::class.java)) - }) { - Text(getString(R.string.map_in_column_activity)) - } - Spacer(modifier = Modifier.padding(5.dp)) - Button( - onClick = { - context.startActivity(Intent(context, MapClusteringActivity::class.java)) - }) { - Text(getString(R.string.map_clustering_activity)) - } - Spacer(modifier = Modifier.padding(5.dp)) - Button( - onClick = { - context.startActivity(Intent(context, LocationTrackingActivity::class.java)) - }) { - Text(getString(R.string.location_tracking_activity)) - } - Spacer(modifier = Modifier.padding(5.dp)) - Button( - onClick = { - context.startActivity(Intent(context, ScaleBarActivity::class.java)) - }) { - Text(getString(R.string.scale_bar_activity)) + val context = LocalContext.current + Column( + Modifier + .fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Spacer(modifier = Modifier.padding(10.dp)) + Text( + text = getString(R.string.main_activity_title), + style = MaterialTheme.typography.h5 + ) + Spacer(modifier = Modifier.padding(10.dp)) + Button( + onClick = { + context.startActivity(Intent(context, BasicMapActivity::class.java)) + }) { + Text(getString(R.string.basic_map_activity)) + } + Spacer(modifier = Modifier.padding(5.dp)) + Button( + onClick = { + context.startActivity( + Intent( + context, + MapInColumnActivity::class.java + ) + ) + }) { + Text(getString(R.string.map_in_column_activity)) + } + Spacer(modifier = Modifier.padding(5.dp)) + Button( + onClick = { + context.startActivity( + Intent( + context, + MapClusteringActivity::class.java + ) + ) + }) { + Text(getString(R.string.map_clustering_activity)) + } + Spacer(modifier = Modifier.padding(5.dp)) + Button( + onClick = { + context.startActivity( + Intent( + context, + LocationTrackingActivity::class.java + ) + ) + }) { + Text(getString(R.string.location_tracking_activity)) + } + Spacer(modifier = Modifier.padding(5.dp)) + Button( + onClick = { + context.startActivity(Intent(context, ScaleBarActivity::class.java)) + }) { + Text(getString(R.string.scale_bar_activity)) + } } } } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/google/maps/android/compose/theme/Theme.kt b/app/src/main/java/com/google/maps/android/compose/theme/Theme.kt new file mode 100644 index 00000000..faa7548a --- /dev/null +++ b/app/src/main/java/com/google/maps/android/compose/theme/Theme.kt @@ -0,0 +1,18 @@ +package com.google.maps.android.compose.theme + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material.MaterialTheme +import androidx.compose.material.darkColors +import androidx.compose.material.lightColors +import androidx.compose.runtime.Composable + +@Composable +fun MapsComposeSampleTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + content: @Composable () -> Unit +) { + MaterialTheme( + colors = if (darkTheme) darkColors() else lightColors(), + content = content + ) +} diff --git a/maps-compose/src/main/java/com/google/maps/android/compose/GoogleMap.kt b/maps-compose/src/main/java/com/google/maps/android/compose/GoogleMap.kt index edbad287..de7e25f2 100644 --- a/maps-compose/src/main/java/com/google/maps/android/compose/GoogleMap.kt +++ b/maps-compose/src/main/java/com/google/maps/android/compose/GoogleMap.kt @@ -32,6 +32,7 @@ import androidx.compose.runtime.rememberCompositionContext import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.viewinterop.AndroidView import androidx.lifecycle.Lifecycle @@ -86,6 +87,11 @@ public fun GoogleMap( contentPadding: PaddingValues = NoPadding, content: (@Composable @GoogleMapComposable () -> Unit)? = null, ) { + // Early return if in preview + if (LocalInspectionMode.current) { + return + } + val context = LocalContext.current val mapView = remember { MapView(context, googleMapOptionsFactory()) }