Permission
This commit is contained in:
@@ -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.
|
||||||
@@ -83,7 +85,7 @@ class NavigationSession : Session(), NavigationScreen.Listener {
|
|||||||
lateinit var navigationViewModel: NavigationViewModel
|
lateinit var navigationViewModel: NavigationViewModel
|
||||||
|
|
||||||
// Store for ViewModels to survive configuration changes
|
// Store for ViewModels to survive configuration changes
|
||||||
lateinit var viewModelStoreOwner : ViewModelStoreOwner
|
lateinit var viewModelStoreOwner: ViewModelStoreOwner
|
||||||
|
|
||||||
init {
|
init {
|
||||||
lifecycle.addObserver(lifecycleObserver)
|
lifecycle.addObserver(lifecycleObserver)
|
||||||
@@ -93,7 +95,7 @@ class NavigationSession : Session(), NavigationScreen.Listener {
|
|||||||
* Called when routing engine preference changes.
|
* Called when routing engine preference changes.
|
||||||
* Creates appropriate repository based on user selection.
|
* Creates appropriate repository based on user selection.
|
||||||
*/
|
*/
|
||||||
fun onRoutingEngineStateUpdated(routeEngine : Int) {
|
fun onRoutingEngineStateUpdated(routeEngine: Int) {
|
||||||
navigationViewModel = when (routeEngine) {
|
navigationViewModel = when (routeEngine) {
|
||||||
RouteEngine.VALHALLA.ordinal -> NavigationViewModel(ValhallaRepository())
|
RouteEngine.VALHALLA.ordinal -> NavigationViewModel(ValhallaRepository())
|
||||||
RouteEngine.OSRM.ordinal -> NavigationViewModel(OsrmRepository())
|
RouteEngine.OSRM.ordinal -> NavigationViewModel(OsrmRepository())
|
||||||
@@ -105,7 +107,7 @@ class NavigationSession : Session(), NavigationScreen.Listener {
|
|||||||
* Called when location permission is granted.
|
* Called when location permission is granted.
|
||||||
* Initializes car hardware sensors if available.
|
* Initializes car hardware sensors if available.
|
||||||
*/
|
*/
|
||||||
fun onPermissionGranted(permission : Boolean) {
|
fun onPermissionGranted(permission: Boolean) {
|
||||||
if (::carSensorManager.isInitialized) {
|
if (::carSensorManager.isInitialized) {
|
||||||
carSensorManager.updateConnectionState(routeModel.navState.carConnection)
|
carSensorManager.updateConnectionState(routeModel.navState.carConnection)
|
||||||
}
|
}
|
||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user