From 6b10b32c08fc76095f91d774aeed1d834e4b6660 Mon Sep 17 00:00:00 2001 From: dkhawk <107309+dkhawk@users.noreply.github.com> Date: Mon, 19 Aug 2024 07:39:18 -0600 Subject: [PATCH 1/3] feat: adds camera tracking example code --- .../com/example/mountainmarkers/MainActivity.kt | 7 ++++++- .../com/example/mountainmarkers/MountainMap.kt | 16 +++++++++++++++- .../presentation/MountainsViewModel.kt | 4 ++++ .../presentation/MountainsViewModelEvent.kt | 3 +++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/solution/app/src/main/java/com/example/mountainmarkers/MainActivity.kt b/solution/app/src/main/java/com/example/mountainmarkers/MainActivity.kt index c8d50e5..1a5ed7f 100644 --- a/solution/app/src/main/java/com/example/mountainmarkers/MainActivity.kt +++ b/solution/app/src/main/java/com/example/mountainmarkers/MainActivity.kt @@ -99,7 +99,12 @@ class MainActivity : ComponentActivity() { paddingValues, viewState, viewModel.getEventChannel(), - selectedMarkerType + selectedMarkerType, + onCameraChange = { + viewModel.onEvent( + MountainsViewModelEvent.OnCameraChange(it) + ) + } ) } } diff --git a/solution/app/src/main/java/com/example/mountainmarkers/MountainMap.kt b/solution/app/src/main/java/com/example/mountainmarkers/MountainMap.kt index 076def0..dfe8ba5 100644 --- a/solution/app/src/main/java/com/example/mountainmarkers/MountainMap.kt +++ b/solution/app/src/main/java/com/example/mountainmarkers/MountainMap.kt @@ -18,6 +18,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue +import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -33,6 +34,7 @@ import com.example.mountainmarkers.presentation.MountainsScreenEvent import com.example.mountainmarkers.presentation.MountainsScreenViewState import com.google.android.gms.maps.CameraUpdateFactory import com.google.android.gms.maps.GoogleMapOptions +import com.google.android.gms.maps.Projection import com.google.android.gms.maps.model.CameraPosition import com.google.android.gms.maps.model.LatLng import com.google.android.gms.maps.model.LatLngBounds @@ -49,19 +51,23 @@ import com.google.maps.android.compose.rememberCameraPositionState import com.google.maps.android.compose.widgets.ScaleBar import com.google.maps.android.data.kml.KmlLayer import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.launch /** * Shows a [GoogleMap] with collection of markers */ -@OptIn(MapsComposeExperimentalApi::class) +@OptIn(MapsComposeExperimentalApi::class, FlowPreview::class) @Composable fun MountainMap( paddingValues: PaddingValues, viewState: MountainsScreenViewState.MountainList, eventFlow: Flow, selectedMarkerType: MarkerType, + onCameraChange: (Projection) -> Unit = {} ) { var isMapLoaded by remember { mutableStateOf(false) } val context = LocalContext.current @@ -72,6 +78,14 @@ fun MountainMap( position = CameraPosition.fromLatLngZoom(viewState.boundingBox.center, 5f) } + LaunchedEffect(cameraPositionState) { + snapshotFlow { cameraPositionState.position } + .debounce(300) + .collect { + cameraPositionState.projection?.let(onCameraChange) + } + } + val mapProperties by remember { mutableStateOf( MapProperties( diff --git a/solution/app/src/main/java/com/example/mountainmarkers/presentation/MountainsViewModel.kt b/solution/app/src/main/java/com/example/mountainmarkers/presentation/MountainsViewModel.kt index 12c736c..e8b03b3 100644 --- a/solution/app/src/main/java/com/example/mountainmarkers/presentation/MountainsViewModel.kt +++ b/solution/app/src/main/java/com/example/mountainmarkers/presentation/MountainsViewModel.kt @@ -14,6 +14,7 @@ package com.example.mountainmarkers.presentation +import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.example.mountainmarkers.data.local.MountainsRepository @@ -80,6 +81,9 @@ constructor( when (event) { OnZoomAll -> onZoomAll() OnToggleAllPeaks -> toggleAllPeaks() + is MountainsViewModelEvent.OnCameraChange -> { + Log.d("Camera changed", event.cameraProjection.visibleRegion.latLngBounds.toString()) + } } } diff --git a/solution/app/src/main/java/com/example/mountainmarkers/presentation/MountainsViewModelEvent.kt b/solution/app/src/main/java/com/example/mountainmarkers/presentation/MountainsViewModelEvent.kt index c594aab..eef031a 100644 --- a/solution/app/src/main/java/com/example/mountainmarkers/presentation/MountainsViewModelEvent.kt +++ b/solution/app/src/main/java/com/example/mountainmarkers/presentation/MountainsViewModelEvent.kt @@ -14,10 +14,13 @@ package com.example.mountainmarkers.presentation +import com.google.android.gms.maps.Projection + /** * Events that the UI can send to the [MountainsViewModel] */ sealed class MountainsViewModelEvent { + data class OnCameraChange(val cameraProjection: Projection) : MountainsViewModelEvent() data object OnZoomAll: MountainsViewModelEvent() data object OnToggleAllPeaks: MountainsViewModelEvent() } From 7d033ed0d5994c56b2479c76f5abcd25541a7e21 Mon Sep 17 00:00:00 2001 From: dkhawk <107309+dkhawk@users.noreply.github.com> Date: Mon, 16 Dec 2024 12:39:44 -0700 Subject: [PATCH 2/3] chore: version catalog, kotlin update, library versions updated Update to use version catalog Update to Kotlin 2.0.21 Update numerous libraries --- solution/.idea/AndroidProjectSystem.xml | 6 ++ solution/.idea/compiler.xml | 2 +- solution/.idea/deploymentTargetSelector.xml | 18 ++++ solution/.idea/gradle.xml | 1 + .../inspectionProfiles/Project_Default.xml | 30 +++++++ solution/.idea/kotlinc.xml | 2 +- solution/.idea/misc.xml | 2 +- solution/.idea/runConfigurations.xml | 17 ++++ solution/app/build.gradle.kts | 82 +++++++++---------- solution/app/src/main/AndroidManifest.xml | 2 +- .../data/local/MountainsRepositoryTest.kt | 2 + solution/build.gradle.kts | 21 +++-- solution/gradle/libs.versions.toml | 46 +++++++++++ .../gradle/wrapper/gradle-wrapper.properties | 2 +- starter/.idea/.name | 2 +- starter/.idea/compiler.xml | 2 +- starter/.idea/deploymentTargetSelector.xml | 13 +++ starter/.idea/runConfigurations.xml | 13 +++ 18 files changed, 204 insertions(+), 59 deletions(-) create mode 100644 solution/.idea/AndroidProjectSystem.xml create mode 100644 solution/.idea/deploymentTargetSelector.xml create mode 100644 solution/.idea/runConfigurations.xml create mode 100644 solution/gradle/libs.versions.toml create mode 100644 starter/.idea/deploymentTargetSelector.xml create mode 100644 starter/.idea/runConfigurations.xml diff --git a/solution/.idea/AndroidProjectSystem.xml b/solution/.idea/AndroidProjectSystem.xml new file mode 100644 index 0000000..4a53bee --- /dev/null +++ b/solution/.idea/AndroidProjectSystem.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/solution/.idea/compiler.xml b/solution/.idea/compiler.xml index b589d56..b86273d 100644 --- a/solution/.idea/compiler.xml +++ b/solution/.idea/compiler.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/solution/.idea/deploymentTargetSelector.xml b/solution/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..11900fa --- /dev/null +++ b/solution/.idea/deploymentTargetSelector.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/solution/.idea/gradle.xml b/solution/.idea/gradle.xml index 0897082..7b3006b 100644 --- a/solution/.idea/gradle.xml +++ b/solution/.idea/gradle.xml @@ -4,6 +4,7 @@