Permission
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user