From 2ae3c0caed7e8968de5cd3f26ed95339cd5df694 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20Lo=CC=81pez=20Man=CC=83as?= Date: Tue, 3 Nov 2026 10:57:06 +0100 Subject: [PATCH] chore: fix the library compiler warnings and treat warnings as errors - StreetViewPanoramaUpdater: take the listener parameters as nullable instead of using safe calls on non-null types, keeping the null guard. - StreetView: use androidx.lifecycle.compose.LocalLifecycleOwner, like GoogleMap already does. - MarkerComposable: opt in to MapsComposeExperimentalApi where it uses rememberComposeBitmapDescriptor. - The deprecated rememberCameraPositionState(key) and rememberMarkerState(key) overloads keep forwarding the key; suppress the deprecation there instead of silently dropping it. With no warnings left, maps-compose, maps-compose-utils and maps-compose-widgets now compile with allWarningsAsErrors. --- maps-compose-utils/build.gradle.kts | 2 ++ maps-compose-widgets/build.gradle.kts | 2 ++ maps-compose/build.gradle.kts | 2 ++ .../maps/android/compose/CameraPositionState.kt | 4 ++++ .../java/com/google/maps/android/compose/Marker.kt | 8 ++++++++ .../maps/android/compose/streetview/StreetView.kt | 2 +- .../streetview/StreetViewPanoramaUpdater.kt | 14 ++++++++------ 7 files changed, 27 insertions(+), 7 deletions(-) diff --git a/maps-compose-utils/build.gradle.kts b/maps-compose-utils/build.gradle.kts index 27315b511..1ad55ef4d 100644 --- a/maps-compose-utils/build.gradle.kts +++ b/maps-compose-utils/build.gradle.kts @@ -54,6 +54,8 @@ android { kotlin { compilerOptions { jvmTarget.set(JvmTarget.JVM_17) + // Keep the library free of compiler warnings, so new deprecations are fixed when they appear. + allWarningsAsErrors.set(true) freeCompilerArgs.addAll( "-Xexplicit-api=strict", "-opt-in=kotlin.RequiresOptIn" diff --git a/maps-compose-widgets/build.gradle.kts b/maps-compose-widgets/build.gradle.kts index b39bd95af..9677fb0d5 100644 --- a/maps-compose-widgets/build.gradle.kts +++ b/maps-compose-widgets/build.gradle.kts @@ -62,6 +62,8 @@ android { kotlin { compilerOptions { jvmTarget.set(JvmTarget.JVM_17) + // Keep the library free of compiler warnings, so new deprecations are fixed when they appear. + allWarningsAsErrors.set(true) freeCompilerArgs.addAll( "-Xexplicit-api=strict", "-opt-in=kotlin.RequiresOptIn" diff --git a/maps-compose/build.gradle.kts b/maps-compose/build.gradle.kts index 872e54dd4..2dfb32c0c 100644 --- a/maps-compose/build.gradle.kts +++ b/maps-compose/build.gradle.kts @@ -61,6 +61,8 @@ android { kotlin { compilerOptions { jvmTarget.set(JvmTarget.JVM_17) + // Keep the library free of compiler warnings, so new deprecations are fixed when they appear. + allWarningsAsErrors.set(true) freeCompilerArgs.addAll( "-Xexplicit-api=strict", "-opt-in=kotlin.RequiresOptIn" diff --git a/maps-compose/src/main/java/com/google/maps/android/compose/CameraPositionState.kt b/maps-compose/src/main/java/com/google/maps/android/compose/CameraPositionState.kt index ecea7281a..e6318473c 100644 --- a/maps-compose/src/main/java/com/google/maps/android/compose/CameraPositionState.kt +++ b/maps-compose/src/main/java/com/google/maps/android/compose/CameraPositionState.kt @@ -69,6 +69,10 @@ public inline fun rememberCameraPositionState( "com.google.maps.android.compose.rememberCameraPositionState", ), ) +// This deprecated overload exists to pass the custom `key` to rememberSaveable, so it keeps doing +// so until the overload itself is removed. Dropping the key here would silently change behaviour +// for apps that still call it. +@Suppress("DEPRECATION") @Composable public inline fun rememberCameraPositionState( key: String? = null, diff --git a/maps-compose/src/main/java/com/google/maps/android/compose/Marker.kt b/maps-compose/src/main/java/com/google/maps/android/compose/Marker.kt index 084d6417e..03a0fd30a 100644 --- a/maps-compose/src/main/java/com/google/maps/android/compose/Marker.kt +++ b/maps-compose/src/main/java/com/google/maps/android/compose/Marker.kt @@ -201,6 +201,10 @@ public class MarkerState private constructor(position: LatLng) { """, ), ) +// This deprecated overload exists to pass the custom `key` to rememberSaveable, so it keeps doing +// so until the overload itself is removed. Dropping the key here would silently change behaviour +// for apps that still call it. +@Suppress("DEPRECATION") public fun rememberMarkerState(key: String? = null, position: LatLng = LatLng(0.0, 0.0)): MarkerState = rememberSaveable(key = key, saver = MarkerState.Saver) { MarkerState(position) @@ -338,6 +342,8 @@ public fun MarkerComposable( @UiComposable @Composable () -> Unit, ) { + // The library can use its own experimental API. + @OptIn(MapsComposeExperimentalApi::class) val icon = rememberComposeBitmapDescriptor(*keys) { content() } MarkerImpl( @@ -494,6 +500,8 @@ public fun MarkerInfoWindowComposable( @UiComposable @Composable () -> Unit, ) { + // The library can use its own experimental API. + @OptIn(MapsComposeExperimentalApi::class) val icon = rememberComposeBitmapDescriptor(*keys) { content() } MarkerImpl( diff --git a/maps-compose/src/main/java/com/google/maps/android/compose/streetview/StreetView.kt b/maps-compose/src/main/java/com/google/maps/android/compose/streetview/StreetView.kt index 8d10e1970..9b2926224 100644 --- a/maps-compose/src/main/java/com/google/maps/android/compose/streetview/StreetView.kt +++ b/maps-compose/src/main/java/com/google/maps/android/compose/streetview/StreetView.kt @@ -32,10 +32,10 @@ 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.LocalLifecycleOwner import androidx.compose.ui.viewinterop.AndroidView import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.compose.LocalLifecycleOwner import com.google.android.gms.maps.StreetViewPanoramaOptions import com.google.android.gms.maps.StreetViewPanoramaView import com.google.android.gms.maps.model.StreetViewPanoramaOrientation diff --git a/maps-compose/src/main/java/com/google/maps/android/compose/streetview/StreetViewPanoramaUpdater.kt b/maps-compose/src/main/java/com/google/maps/android/compose/streetview/StreetViewPanoramaUpdater.kt index 3e4ebd5ed..6ceef471e 100644 --- a/maps-compose/src/main/java/com/google/maps/android/compose/streetview/StreetViewPanoramaUpdater.kt +++ b/maps-compose/src/main/java/com/google/maps/android/compose/streetview/StreetViewPanoramaUpdater.kt @@ -20,6 +20,8 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.ComposeNode import androidx.compose.runtime.currentComposer import com.google.android.gms.maps.StreetViewPanorama +import com.google.android.gms.maps.model.StreetViewPanoramaCamera +import com.google.android.gms.maps.model.StreetViewPanoramaLocation import com.google.maps.android.compose.MapNode internal class StreetViewPanoramaPropertiesNode( @@ -39,13 +41,13 @@ internal class StreetViewPanoramaPropertiesNode( panorama.setOnStreetViewPanoramaLongClickListener { eventListeners.onLongClick(it) } - // Both Java listener interfaces lack @NonNull, so GMS can deliver null. Guard the - // assignments to prevent the Kotlin compiler's implicit null-check from crashing. - panorama.setOnStreetViewPanoramaCameraChangeListener { - it?.let { cameraPositionState.rawPanoramaCamera = it } + // GMS can deliver null to both listeners even though their parameters are declared + // non-null, so take them as nullable and guard the assignments. + panorama.setOnStreetViewPanoramaCameraChangeListener { camera: StreetViewPanoramaCamera? -> + camera?.let { cameraPositionState.rawPanoramaCamera = it } } - panorama.setOnStreetViewPanoramaChangeListener { - it?.let { cameraPositionState.rawLocation = it } + panorama.setOnStreetViewPanoramaChangeListener { location: StreetViewPanoramaLocation? -> + location?.let { cameraPositionState.rawLocation = it } } }