From 378ee8c227350f1a2fe35ace1e83fa6ac573a5a4 Mon Sep 17 00:00:00 2001 From: Dimitris Date: Mon, 2 Mar 2026 07:10:09 +0100 Subject: [PATCH] Permission --- .../navigation/car/NavigationSession.kt | 49 +++++++++---------- .../java/com/kouros/navigation/data/Data.kt | 5 +- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/common/car/src/main/java/com/kouros/navigation/car/NavigationSession.kt b/common/car/src/main/java/com/kouros/navigation/car/NavigationSession.kt index cc2fec8..ba74564 100644 --- a/common/car/src/main/java/com/kouros/navigation/car/NavigationSession.kt +++ b/common/car/src/main/java/com/kouros/navigation/car/NavigationSession.kt @@ -36,6 +36,8 @@ import com.kouros.navigation.utils.NavigationUtils.getViewModel import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.launch import android.Manifest.permission +import com.kouros.navigation.data.Constants.AUTOMOTIVE_CAR_SPEED_PERMISSION +import com.kouros.navigation.data.Constants.GMS_CAR_SPEED_PERMISSION /** * Main session for Android Auto/Automotive OS navigation. @@ -83,7 +85,7 @@ class NavigationSession : Session(), NavigationScreen.Listener { lateinit var navigationViewModel: NavigationViewModel // Store for ViewModels to survive configuration changes - lateinit var viewModelStoreOwner : ViewModelStoreOwner + lateinit var viewModelStoreOwner: ViewModelStoreOwner init { lifecycle.addObserver(lifecycleObserver) @@ -93,8 +95,8 @@ class NavigationSession : Session(), NavigationScreen.Listener { * Called when routing engine preference changes. * Creates appropriate repository based on user selection. */ - fun onRoutingEngineStateUpdated(routeEngine : Int) { - navigationViewModel = when (routeEngine) { + fun onRoutingEngineStateUpdated(routeEngine: Int) { + navigationViewModel = when (routeEngine) { RouteEngine.VALHALLA.ordinal -> NavigationViewModel(ValhallaRepository()) RouteEngine.OSRM.ordinal -> NavigationViewModel(OsrmRepository()) else -> NavigationViewModel(TomTomRepository()) @@ -105,10 +107,10 @@ class NavigationSession : Session(), NavigationScreen.Listener { * Called when location permission is granted. * Initializes car hardware sensors if available. */ - fun onPermissionGranted(permission : Boolean) { - if (::carSensorManager.isInitialized) { - carSensorManager.updateConnectionState(routeModel.navState.carConnection) - } + fun onPermissionGranted(permission: Boolean) { + if (::carSensorManager.isInitialized) { + carSensorManager.updateConnectionState(routeModel.navState.carConnection) + } } /** @@ -121,23 +123,12 @@ class NavigationSession : Session(), NavigationScreen.Listener { when (connectionState) { CarConnection.CONNECTION_TYPE_NOT_CONNECTED -> Unit CarConnection.CONNECTION_TYPE_NATIVE -> { - navigationScreen.checkPermission("android.car.permission.CAR_SPEED") - if (carContext.checkSelfPermission("android.car.permission.CAR_SPEED") == PackageManager.PERMISSION_GRANTED) { - if (::carSensorManager.isInitialized) { - carSensorManager.updateConnectionState(connectionState) - } - } + navigationScreen.checkPermission(AUTOMOTIVE_CAR_SPEED_PERMISSION) } CarConnection.CONNECTION_TYPE_PROJECTION -> { - navigationScreen.checkPermission("com.google.android.gms.permission.CAR_SPEED") - if (carContext.checkSelfPermission("com.google.android.gms.permission.CAR_SPEED") == PackageManager.PERMISSION_GRANTED) { - if (::carSensorManager.isInitialized) { - carSensorManager.updateConnectionState(connectionState) - } - } + navigationScreen.checkPermission(GMS_CAR_SPEED_PERMISSION) } } - } /** @@ -202,7 +193,11 @@ class NavigationSession : Session(), NavigationScreen.Listener { shouldUseCarLocationFlow = carSensorManager.shouldUseCarLocation(), onLocationUpdate = ::updateLocation, onInitialLocation = { location -> - navigationViewModel.loadRecentPlace(location, surfaceRenderer.carOrientation, carContext) + navigationViewModel.loadRecentPlace( + location, + surfaceRenderer.carOrientation, + carContext + ) } ) } @@ -225,10 +220,11 @@ class NavigationSession : Session(), NavigationScreen.Listener { * Shows permission request screen if needed, otherwise starts location updates. */ private fun checkPermissionsAndGetScreen(): Screen { - val hasLocationPermission = carContext.checkSelfPermission(permission.ACCESS_FINE_LOCATION) == - PackageManager.PERMISSION_GRANTED + val hasLocationPermission = + carContext.checkSelfPermission(permission.ACCESS_FINE_LOCATION) == + PackageManager.PERMISSION_GRANTED val hasContactsPermission = !useContacts || - carContext.checkSelfPermission(permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED + carContext.checkSelfPermission(permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED return if (hasLocationPermission && hasContactsPermission) { deviceLocationManager.startLocationUpdates() @@ -324,7 +320,8 @@ class NavigationSession : Session(), NavigationScreen.Listener { * Snaps location to route and checks for deviation requiring reroute. */ private fun handleNavigationLocation(location: Location) { - routeModel.navState = routeModel.navState.copy(travelMessage = "${location.latitude} ${location.longitude}") + routeModel.navState = + routeModel.navState.copy(travelMessage = "${location.latitude} ${location.longitude}") navigationScreen.updateTrip(location) if (routeModel.navState.arrived) return val snappedLocation = snapLocation(location, routeModel.route.maneuverLocations()) @@ -333,9 +330,11 @@ class NavigationSession : Session(), NavigationScreen.Listener { distance > MAXIMAL_ROUTE_DEVIATION -> { navigationScreen.calculateNewRoute(routeModel.navState.destination) } + distance < MAXIMAL_SNAP_CORRECTION -> { surfaceRenderer.updateLocation(snappedLocation) } + else -> { surfaceRenderer.updateLocation(location) } diff --git a/common/data/src/main/java/com/kouros/navigation/data/Data.kt b/common/data/src/main/java/com/kouros/navigation/data/Data.kt index ee0e87f..46bc8f3 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/Data.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/Data.kt @@ -135,11 +135,14 @@ object Constants { const val MAXIMUM_LOCATION_DISTANCE = 100000F + const val GMS_CAR_SPEED_PERMISSION = "com.google.android.gms.permission.CAR_SPEED" + + const val AUTOMOTIVE_CAR_SPEED_PERMISSION = "android.car.permission.CAR_SPEED" } enum class RouteEngine { - VALHALLA, OSRM, TOMTOM, GRAPHHOPPER + VALHALLA, OSRM, TOMTOM } enum class NavigationThemeColor(val color: Long) {