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.awaitCancellation
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import android.Manifest.permission 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. * Main session for Android Auto/Automotive OS navigation.
@@ -121,24 +123,13 @@ class NavigationSession : Session(), NavigationScreen.Listener {
when (connectionState) { when (connectionState) {
CarConnection.CONNECTION_TYPE_NOT_CONNECTED -> Unit CarConnection.CONNECTION_TYPE_NOT_CONNECTED -> Unit
CarConnection.CONNECTION_TYPE_NATIVE -> { CarConnection.CONNECTION_TYPE_NATIVE -> {
navigationScreen.checkPermission("android.car.permission.CAR_SPEED") navigationScreen.checkPermission(AUTOMOTIVE_CAR_SPEED_PERMISSION)
if (carContext.checkSelfPermission("android.car.permission.CAR_SPEED") == PackageManager.PERMISSION_GRANTED) {
if (::carSensorManager.isInitialized) {
carSensorManager.updateConnectionState(connectionState)
}
}
} }
CarConnection.CONNECTION_TYPE_PROJECTION -> { CarConnection.CONNECTION_TYPE_PROJECTION -> {
navigationScreen.checkPermission("com.google.android.gms.permission.CAR_SPEED") navigationScreen.checkPermission(GMS_CAR_SPEED_PERMISSION)
if (carContext.checkSelfPermission("com.google.android.gms.permission.CAR_SPEED") == PackageManager.PERMISSION_GRANTED) {
if (::carSensorManager.isInitialized) {
carSensorManager.updateConnectionState(connectionState)
} }
} }
} }
}
}
/** /**
* Creates the initial screen for the session. * Creates the initial screen for the session.
@@ -202,7 +193,11 @@ class NavigationSession : Session(), NavigationScreen.Listener {
shouldUseCarLocationFlow = carSensorManager.shouldUseCarLocation(), shouldUseCarLocationFlow = carSensorManager.shouldUseCarLocation(),
onLocationUpdate = ::updateLocation, onLocationUpdate = ::updateLocation,
onInitialLocation = { location -> onInitialLocation = { location ->
navigationViewModel.loadRecentPlace(location, surfaceRenderer.carOrientation, carContext) navigationViewModel.loadRecentPlace(
location,
surfaceRenderer.carOrientation,
carContext
)
} }
) )
} }
@@ -225,7 +220,8 @@ class NavigationSession : Session(), NavigationScreen.Listener {
* Shows permission request screen if needed, otherwise starts location updates. * Shows permission request screen if needed, otherwise starts location updates.
*/ */
private fun checkPermissionsAndGetScreen(): Screen { private fun checkPermissionsAndGetScreen(): Screen {
val hasLocationPermission = carContext.checkSelfPermission(permission.ACCESS_FINE_LOCATION) == val hasLocationPermission =
carContext.checkSelfPermission(permission.ACCESS_FINE_LOCATION) ==
PackageManager.PERMISSION_GRANTED PackageManager.PERMISSION_GRANTED
val hasContactsPermission = !useContacts || val hasContactsPermission = !useContacts ||
carContext.checkSelfPermission(permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED carContext.checkSelfPermission(permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED
@@ -324,7 +320,8 @@ class NavigationSession : Session(), NavigationScreen.Listener {
* Snaps location to route and checks for deviation requiring reroute. * Snaps location to route and checks for deviation requiring reroute.
*/ */
private fun handleNavigationLocation(location: Location) { 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) navigationScreen.updateTrip(location)
if (routeModel.navState.arrived) return if (routeModel.navState.arrived) return
val snappedLocation = snapLocation(location, routeModel.route.maneuverLocations()) val snappedLocation = snapLocation(location, routeModel.route.maneuverLocations())
@@ -333,9 +330,11 @@ class NavigationSession : Session(), NavigationScreen.Listener {
distance > MAXIMAL_ROUTE_DEVIATION -> { distance > MAXIMAL_ROUTE_DEVIATION -> {
navigationScreen.calculateNewRoute(routeModel.navState.destination) navigationScreen.calculateNewRoute(routeModel.navState.destination)
} }
distance < MAXIMAL_SNAP_CORRECTION -> { distance < MAXIMAL_SNAP_CORRECTION -> {
surfaceRenderer.updateLocation(snappedLocation) surfaceRenderer.updateLocation(snappedLocation)
} }
else -> { else -> {
surfaceRenderer.updateLocation(location) surfaceRenderer.updateLocation(location)
} }

View File

@@ -135,11 +135,14 @@ object Constants {
const val MAXIMUM_LOCATION_DISTANCE = 100000F 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 { enum class RouteEngine {
VALHALLA, OSRM, TOMTOM, GRAPHHOPPER VALHALLA, OSRM, TOMTOM
} }
enum class NavigationThemeColor(val color: Long) { enum class NavigationThemeColor(val color: Long) {