Permission

This commit is contained in:
Dimitris
2026-03-02 07:10:09 +01:00
parent a468529ca4
commit 378ee8c227
2 changed files with 28 additions and 26 deletions

View File

@@ -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)
}

View File

@@ -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) {