From 5105d4eb9ace034d93e007e75a9467d37a69f524 Mon Sep 17 00:00:00 2001 From: Dimitris Date: Sun, 5 Apr 2026 09:22:06 +0200 Subject: [PATCH] ExitNumber, Flow --- app/build.gradle.kts | 4 ++-- .../navigation/car/DeviceLocationManager.kt | 23 +++++++++++++++++++ .../navigation/car/screen/NavigationScreen.kt | 3 +-- .../navigation/data/tomtom/TomTomRoute.kt | 6 ++++- .../navigation/model/NavigationViewModel.kt | 15 ++++++++++++ 5 files changed, 46 insertions(+), 5 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e5b5403..534974e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -17,8 +17,8 @@ android { applicationId = "com.kouros.navigation" minSdk = 33 targetSdk = 36 - versionCode = 91 - versionName = "0.2.3.91" + versionCode = 92 + versionName = "0.2.3.92" base.archivesName = "navi-$versionName" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/common/car/src/main/java/com/kouros/navigation/car/DeviceLocationManager.kt b/common/car/src/main/java/com/kouros/navigation/car/DeviceLocationManager.kt index cd19690..d507d05 100644 --- a/common/car/src/main/java/com/kouros/navigation/car/DeviceLocationManager.kt +++ b/common/car/src/main/java/com/kouros/navigation/car/DeviceLocationManager.kt @@ -3,6 +3,7 @@ package com.kouros.navigation.car import android.annotation.SuppressLint import android.content.Context import android.location.Location +import android.location.LocationListener import android.location.LocationManager import androidx.car.app.CarContext import androidx.core.location.LocationListenerCompat @@ -10,7 +11,9 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle +import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @@ -59,6 +62,26 @@ class DeviceLocationManager( } } + /** + * Provides a flow of location updates from device GPS. + * + * deviceLocationManager.locationFlow().asLiveData().observe(this, ::updateLocation2) + * + * @return Flow emitting location updates + */ + @SuppressLint("MissingPermission") + fun locationFlow(): Flow = callbackFlow { + val listener = LocationListener { location -> + if (shouldUseDeviceLocation && isListening) { + trySend(location) // Emit the location update to the flow + } + } + locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 5f, listener) + awaitClose { + locationManager.removeUpdates(listener) // Unregister listener on cancellation + } + } + /** * Starts requesting location updates from device GPS. * Provides initial location via callback and then starts continuous updates. diff --git a/common/car/src/main/java/com/kouros/navigation/car/screen/NavigationScreen.kt b/common/car/src/main/java/com/kouros/navigation/car/screen/NavigationScreen.kt index d245965..43e2ec1 100644 --- a/common/car/src/main/java/com/kouros/navigation/car/screen/NavigationScreen.kt +++ b/common/car/src/main/java/com/kouros/navigation/car/screen/NavigationScreen.kt @@ -4,7 +4,6 @@ import android.os.CountDownTimer import android.os.Handler import android.util.Log import androidx.car.app.CarContext -import androidx.car.app.CarToast import androidx.car.app.Screen import androidx.car.app.model.Action import androidx.car.app.model.Action.FLAG_IS_PERSISTENT @@ -21,7 +20,6 @@ import androidx.car.app.navigation.model.Destination import androidx.car.app.navigation.model.MapWithContentTemplate import androidx.car.app.navigation.model.MessageInfo import androidx.car.app.navigation.model.NavigationTemplate -import androidx.car.app.navigation.model.PanModeListener import androidx.car.app.navigation.model.RoutingInfo import androidx.car.app.navigation.model.Step import androidx.car.app.navigation.model.TravelEstimate @@ -100,6 +98,7 @@ open class NavigationScreen( repository.tripSuggestionFlow.asLiveData().observe(this, Observer { navigationViewModel.recentPlaces.observe(this, observerRecentPlaces) + //navigationViewModel.recentPlacesFlow(carContext, surfaceRenderer.lastLocation ).asLiveData().observe(this, ::test) tripSuggestion = it }) repository.alternativeRoutesFlow.asLiveData().observe(this, Observer { diff --git a/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRoute.kt b/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRoute.kt index 9984065..6def103 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRoute.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRoute.kt @@ -221,6 +221,10 @@ private fun exitNumber( ) { 0 } else { - instruction.exitNumber.toInt() + try { + instruction.exitNumber.toInt() + } catch (e: NumberFormatException) { + 0 + } } } \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/model/NavigationViewModel.kt b/common/data/src/main/java/com/kouros/navigation/model/NavigationViewModel.kt index 68ba635..a2803fd 100644 --- a/common/data/src/main/java/com/kouros/navigation/model/NavigationViewModel.kt +++ b/common/data/src/main/java/com/kouros/navigation/model/NavigationViewModel.kt @@ -3,6 +3,8 @@ package com.kouros.navigation.model //import com.kouros.navigation.data.Preferences.boxStore import android.content.Context import android.location.Location +import android.location.LocationListener +import android.location.LocationManager import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.compose.runtime.toMutableStateList import androidx.lifecycle.MutableLiveData @@ -22,6 +24,9 @@ import com.kouros.navigation.utils.Levenshtein import com.kouros.navigation.utils.getSettingsRepository import com.kouros.navigation.utils.location import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking @@ -102,6 +107,16 @@ class NavigationViewModel(private val repository: NavigationRepository) : ViewMo } val gson: com.google.gson.Gson = GsonBuilder().create() + /** + * Retrieves recent places from Preferences as a Flow. + */ + fun recentPlacesFlow(context: Context, location: Location,): Flow = callbackFlow { + for (place in recentPlaces.value!!) { + trySend(place) + } + awaitClose { + } + } /** * Loads all recent places from Preferences and calculates distances.