diff --git a/maps-app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt b/maps-app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt index 9ef1dde58..96da893c9 100644 --- a/maps-app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt +++ b/maps-app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt @@ -91,6 +91,47 @@ class GoogleMapViewTests { assertThat(cameraPositionState.position.target).isEqualTo(startingPosition) } + @Test + fun testInitialCameraPositionIsAppliedToGoogleMapOptions() { + var capturedOptions: GoogleMapOptions? = null + composeTestRule.setContent { + GoogleMap( + cameraPositionState = cameraPositionState, + mapViewFactory = { context, options -> + capturedOptions = options + MapView(context, options) + } + ) + } + + assertThat(capturedOptions?.camera?.target).isEqualTo(startingPosition) + assertThat(capturedOptions?.camera?.zoom).isEqualTo(startingZoom) + } + + @Test + fun testInitialCameraPositionDoesNotOverrideGoogleMapOptionsFactory() { + val configuredPosition = LatLng(7.89, 10.11) + val configuredZoom = 12f + var capturedOptions: GoogleMapOptions? = null + composeTestRule.setContent { + GoogleMap( + cameraPositionState = cameraPositionState, + googleMapOptionsFactory = { + GoogleMapOptions().camera( + CameraPosition.fromLatLngZoom(configuredPosition, configuredZoom) + ) + }, + mapViewFactory = { context, options -> + capturedOptions = options + MapView(context, options) + } + ) + } + + assertThat(capturedOptions?.camera?.target).isEqualTo(configuredPosition) + assertThat(capturedOptions?.camera?.zoom).isEqualTo(configuredZoom) + } + @Test fun testDefaultColorSchemeIsFollowSystem() { var capturedOptions: GoogleMapOptions? = null 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 6edd9d4e7..67c6c1691 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 @@ -176,6 +176,12 @@ public fun GoogleMap( modifier = if (focusable) modifier.focusable() else modifier, factory = { context -> val options = googleMapOptionsFactory().let { opts -> + // If the initial camera position is not explicitly set in + // googleMapOptionsFactory, apply CameraPositionState.position before MapView + // creation to avoid displaying the default camera while the map initializes. + if (opts.camera == null) { + opts.camera(cameraPositionState.position) + } // If mapColorScheme is passed to GoogleMap() and has not been explicitly set // in googleMapOptionsFactory (where 0 / MapColorScheme.LIGHT is the Java int default), // apply it to GoogleMapOptions so MapView is created with it.