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..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 @@ -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 @@ -86,7 +88,7 @@ class GoogleMapViewTests { composeTestRule.waitUntil(1000) { cameraPositionState.isMoving } - composeTestRule.waitUntil(1000) { + composeTestRule.waitUntil(3000) { !cameraPositionState.isMoving } assertFalse(cameraPositionState.isMoving) @@ -150,7 +152,7 @@ class GoogleMapViewTests { composeTestRule.waitUntil(1000) { cameraPositionState.isMoving } - composeTestRule.waitUntil(1000) { + composeTestRule.waitUntil(3000) { !cameraPositionState.isMoving } assertEquals( @@ -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, 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.