From 12e30f888512e98f067de1a6c5e7f2e9b362f4fd Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Thu, 3 Mar 2022 08:26:10 -0800 Subject: [PATCH 1/3] feat: Add support to get projection. Change-Id: I999c56e6a31e33dd4c8d20215d24f56509a3e967 --- .../google/maps/android/compose/CameraPositionState.kt | 8 ++++++++ 1 file changed, 8 insertions(+) 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 2e28740e..cd752c98 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 @@ -24,6 +24,7 @@ import androidx.compose.runtime.setValue import com.google.android.gms.maps.CameraUpdate import com.google.android.gms.maps.CameraUpdateFactory import com.google.android.gms.maps.GoogleMap +import com.google.android.gms.maps.Projection import com.google.android.gms.maps.model.CameraPosition import com.google.android.gms.maps.model.LatLng import kotlinx.coroutines.CancellableContinuation @@ -65,6 +66,13 @@ class CameraPositionState( var isMoving by mutableStateOf(false) internal set + /** + * Returns the current [Projection] to be used for converting between screen + * coordinates and lat/lng. + */ + val projection: Projection? + get() = map?.projection + /** * Local source of truth for the current camera position. * While [map] is non-null this reflects the current position of [map] as it changes. From a0f45f257230ddc888519d92ec784daf550a7009 Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Thu, 10 Mar 2022 09:46:34 -0800 Subject: [PATCH 2/3] Add tests for projection. Change-Id: Ia1a9b3dd95080e5df62e4aadf5fd46b03d82175b --- .../android/compose/GoogleMapViewTests.kt | 29 ++++++++++++++++++- .../maps/android/compose/MapSampleActivity.kt | 10 ++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt index 56e09732..b6afc1f7 100644 --- a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt +++ b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt @@ -21,10 +21,12 @@ import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick +import androidx.test.annotation.UiThreadTest import com.google.android.gms.maps.model.CameraPosition import com.google.android.gms.maps.model.LatLng import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotNull import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule @@ -161,7 +163,32 @@ class GoogleMapViewTests { } } - private fun zoom(shouldAnimate: Boolean, zoomIn: Boolean, assertionBlock: () -> Unit) { + @Test + @UiThreadTest + fun testLatLngInVisibleRegion() { + val projection = cameraPositionState.projection + assertNotNull(projection) + assertTrue( + projection!!.visibleRegion.latLngBounds.contains(startingPosition) + ) + } + + @Test + @UiThreadTest + fun testLatLngNotInVisibleRegion() { + val projection = cameraPositionState.projection + assertNotNull(projection) + val latLng = LatLng(23.4, 25.6) + assertFalse( + projection!!.visibleRegion.latLngBounds.contains(latLng) + ) + } + + private fun zoom( + shouldAnimate: Boolean, + zoomIn: Boolean, + assertionBlock: () -> Unit + ) { if (!shouldAnimate) { composeTestRule.onNodeWithTag("cameraAnimations") .assertIsDisplayed() diff --git a/app/src/main/java/com/google/maps/android/compose/MapSampleActivity.kt b/app/src/main/java/com/google/maps/android/compose/MapSampleActivity.kt index a3075fea..87936ebe 100644 --- a/app/src/main/java/com/google/maps/android/compose/MapSampleActivity.kt +++ b/app/src/main/java/com/google/maps/android/compose/MapSampleActivity.kt @@ -49,7 +49,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.testTag import androidx.compose.ui.unit.dp import com.google.android.gms.maps.CameraUpdateFactory -import com.google.android.gms.maps.GoogleMapOptions import com.google.android.gms.maps.model.BitmapDescriptorFactory import com.google.android.gms.maps.model.CameraPosition import com.google.android.gms.maps.model.LatLng @@ -60,6 +59,7 @@ private const val TAG = "MapSampleActivity" val singapore = LatLng(1.35, 103.87) val singapore2 = LatLng(1.40, 103.77) +val singapore3 = LatLng(1.45, 103.77) class MapSampleActivity : ComponentActivity() { @@ -126,6 +126,9 @@ fun GoogleMapView( // Drawing on the map is accomplished with a child-based API val markerClick: (Marker) -> Boolean = { Log.d(TAG, "${it.title} was clicked") + cameraPositionState.projection?.let { projection -> + Log.d(TAG, "The current projection is: $projection") + } false } MarkerInfoWindowContent( @@ -143,6 +146,11 @@ fun GoogleMapView( ) { Text(it.title ?: "Title", color = Color.Blue) } + Marker( + position = singapore3, + title = "Marker in Singapore", + onClick = markerClick + ) Circle( center = singapore, fillColor = MaterialTheme.colors.secondary, From 5607aecb70d06e880efc23b3255303df3cd3281e Mon Sep 17 00:00:00 2001 From: Chris Arriola Date: Thu, 10 Mar 2022 10:15:42 -0800 Subject: [PATCH 3/3] Update waitUntil duration. Change-Id: Ic71bdd2fa8efe9a7a949d96b25010ee744c54a68 --- .../com/google/maps/android/compose/GoogleMapViewTests.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt index b6afc1f7..eb61fdd2 100644 --- a/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt +++ b/app/src/androidTest/java/com/google/maps/android/compose/GoogleMapViewTests.kt @@ -88,7 +88,7 @@ class GoogleMapViewTests { composeTestRule.waitUntil(1000) { cameraPositionState.isMoving } - composeTestRule.waitUntil(1000) { + composeTestRule.waitUntil(3000) { !cameraPositionState.isMoving } assertFalse(cameraPositionState.isMoving) @@ -152,7 +152,7 @@ class GoogleMapViewTests { composeTestRule.waitUntil(1000) { cameraPositionState.isMoving } - composeTestRule.waitUntil(1000) { + composeTestRule.waitUntil(3000) { !cameraPositionState.isMoving } assertEquals(