diff --git a/app/src/google/java/net/vonforst/evmap/auto/CarAppService.kt b/app/src/google/java/net/vonforst/evmap/auto/CarAppService.kt
index 8463c336..782e3719 100644
--- a/app/src/google/java/net/vonforst/evmap/auto/CarAppService.kt
+++ b/app/src/google/java/net/vonforst/evmap/auto/CarAppService.kt
@@ -1,9 +1,7 @@
package net.vonforst.evmap.auto
-import android.Manifest
import android.content.*
import android.content.pm.ApplicationInfo
-import android.content.pm.PackageManager
import android.location.Location
import android.os.IBinder
import androidx.car.app.CarContext
@@ -18,6 +16,7 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
import androidx.localbroadcastmanager.content.LocalBroadcastManager
+import net.vonforst.evmap.utils.checkAnyLocationPermission
interface LocationAwareScreen {
@@ -72,11 +71,7 @@ class EVMapSession(val cas: CarAppService) : Session(), LifecycleObserver {
return WelcomeScreen(carContext, this)
}
- fun locationPermissionGranted() =
- ContextCompat.checkSelfPermission(
- carContext,
- Manifest.permission.ACCESS_FINE_LOCATION
- ) == PackageManager.PERMISSION_GRANTED
+ fun locationPermissionGranted() = carContext.checkAnyLocationPermission()
private val locationReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
diff --git a/app/src/google/java/net/vonforst/evmap/auto/WelcomeScreen.kt b/app/src/google/java/net/vonforst/evmap/auto/WelcomeScreen.kt
index aa8b3632..239bf88f 100644
--- a/app/src/google/java/net/vonforst/evmap/auto/WelcomeScreen.kt
+++ b/app/src/google/java/net/vonforst/evmap/auto/WelcomeScreen.kt
@@ -23,7 +23,10 @@ class WelcomeScreen(ctx: CarContext, val session: EVMapSession) : Screen(ctx), L
PermissionScreen(
carContext,
R.string.auto_location_permission_needed,
- listOf(Manifest.permission.ACCESS_FINE_LOCATION)
+ listOf(
+ Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.ACCESS_COARSE_LOCATION
+ )
)
) {
session.bindLocationService()
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 9dc09ab1..83ec18ac 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -3,6 +3,7 @@
package="net.vonforst.evmap">
+
diff --git a/app/src/main/java/net/vonforst/evmap/fragment/FavoritesFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/FavoritesFragment.kt
index 492c5fb3..60ee6746 100644
--- a/app/src/main/java/net/vonforst/evmap/fragment/FavoritesFragment.kt
+++ b/app/src/main/java/net/vonforst/evmap/fragment/FavoritesFragment.kt
@@ -1,7 +1,5 @@
package net.vonforst.evmap.fragment
-import android.Manifest
-import android.content.pm.PackageManager
import android.graphics.Canvas
import android.os.Bundle
import android.view.Gravity
@@ -9,7 +7,6 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
-import androidx.core.content.ContextCompat
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
@@ -30,6 +27,7 @@ import net.vonforst.evmap.adapter.FavoritesAdapter
import net.vonforst.evmap.databinding.FragmentFavoritesBinding
import net.vonforst.evmap.databinding.ItemFavoriteBinding
import net.vonforst.evmap.model.ChargeLocation
+import net.vonforst.evmap.utils.checkAnyLocationPermission
import net.vonforst.evmap.viewmodel.FavoritesViewModel
import net.vonforst.evmap.viewmodel.viewModelFactory
@@ -100,11 +98,7 @@ class FavoritesFragment : Fragment(), LostApiClient.ConnectionCallbacks {
override fun onConnected() {
val context = this.context ?: return
- if (ContextCompat.checkSelfPermission(
- context,
- Manifest.permission.ACCESS_FINE_LOCATION
- ) == PackageManager.PERMISSION_GRANTED
- ) {
+ if (context.checkAnyLocationPermission()) {
val location = LocationServices.FusedLocationApi.getLastLocation(locationClient!!)
if (location != null) {
vm.location.value = LatLng(location.latitude, location.longitude)
diff --git a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt
index 6521f686..2f56ea40 100644
--- a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt
+++ b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt
@@ -1,5 +1,6 @@
package net.vonforst.evmap.fragment
+import android.Manifest.permission.ACCESS_COARSE_LOCATION
import android.Manifest.permission.ACCESS_FINE_LOCATION
import android.annotation.SuppressLint
import android.content.Context
@@ -81,6 +82,8 @@ import net.vonforst.evmap.ui.ClusterIconGenerator
import net.vonforst.evmap.ui.MarkerAnimator
import net.vonforst.evmap.ui.getMarkerTint
import net.vonforst.evmap.utils.boundingBox
+import net.vonforst.evmap.utils.checkAnyLocationPermission
+import net.vonforst.evmap.utils.checkFineLocationPermission
import net.vonforst.evmap.utils.distanceBetween
import net.vonforst.evmap.viewmodel.*
import java.io.IOException
@@ -262,10 +265,8 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac
)
vm.reloadPrefs()
- if (requestingLocationUpdates && ContextCompat.checkSelfPermission(
- requireContext(),
- ACCESS_FINE_LOCATION
- ) == PackageManager.PERMISSION_GRANTED && locationClient.isConnected
+ if (requestingLocationUpdates && requireContext().checkAnyLocationPermission()
+ && locationClient.isConnected
) {
requestLocationUpdates()
}
@@ -273,16 +274,14 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac
private fun setupClickListeners() {
binding.fabLocate.setOnClickListener {
- if (ContextCompat.checkSelfPermission(
- requireContext(),
- ACCESS_FINE_LOCATION
- ) != PackageManager.PERMISSION_GRANTED
- ) {
- requestPermissions(
- arrayOf(ACCESS_FINE_LOCATION),
+ if (!requireContext().checkFineLocationPermission()) {
+ ActivityCompat.requestPermissions(
+ requireActivity(),
+ arrayOf(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION),
REQUEST_LOCATION_PERMISSION
)
- } else {
+ }
+ if (requireContext().checkAnyLocationPermission()) {
enableLocation(moveTo = true, animate = true)
}
}
@@ -883,11 +882,7 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac
}
}
}
- if (ContextCompat.checkSelfPermission(
- requireContext(),
- ACCESS_FINE_LOCATION
- ) == PackageManager.PERMISSION_GRANTED
- ) {
+ if (context?.checkAnyLocationPermission() ?: false) {
enableLocation(!positionSet, false)
positionSet = true
}
@@ -903,7 +898,7 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac
)
}
- @RequiresPermission(ACCESS_FINE_LOCATION)
+ @RequiresPermission(anyOf = [ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION])
private fun enableLocation(moveTo: Boolean, animate: Boolean) {
val map = this.map ?: return
map.setMyLocationEnabled(true)
@@ -917,7 +912,7 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac
}
}
- @RequiresPermission(ACCESS_FINE_LOCATION)
+ @RequiresPermission(anyOf = [ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION])
private fun moveToLastLocation(map: AnyMap, animate: Boolean) {
val location = LocationServices.FusedLocationApi.getLastLocation(locationClient)
if (location != null) {
@@ -1027,7 +1022,7 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac
) {
when (requestCode) {
REQUEST_LOCATION_PERMISSION -> {
- if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
+ if ((grantResults.isNotEmpty() && grantResults.any { it == PackageManager.PERMISSION_GRANTED })) {
enableLocation(moveTo = true, animate = true)
}
}
@@ -1200,11 +1195,7 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac
val map = this.map ?: return
val context = this.context ?: return
if (vm.myLocationEnabled.value == true) {
- if (ActivityCompat.checkSelfPermission(
- context,
- ACCESS_FINE_LOCATION
- ) == PackageManager.PERMISSION_GRANTED
- ) {
+ if (context.checkAnyLocationPermission()) {
moveToLastLocation(map, false)
requestLocationUpdates()
}
diff --git a/app/src/main/java/net/vonforst/evmap/utils/LocationUtils.kt b/app/src/main/java/net/vonforst/evmap/utils/LocationUtils.kt
index e8f79569..ae13608d 100644
--- a/app/src/main/java/net/vonforst/evmap/utils/LocationUtils.kt
+++ b/app/src/main/java/net/vonforst/evmap/utils/LocationUtils.kt
@@ -1,7 +1,11 @@
package net.vonforst.evmap.utils
+import android.Manifest
+import android.content.Context
import android.content.Intent
+import android.content.pm.PackageManager
import android.location.Location
+import androidx.core.content.ContextCompat
import com.car2go.maps.model.LatLng
import com.car2go.maps.model.LatLngBounds
import kotlin.math.*
@@ -75,3 +79,17 @@ fun boundingBox(pos: LatLng, sizeMeters: Double): LatLngBounds {
pos.plusMeters(sizeMeters, sizeMeters)
)
}
+
+fun Context.checkAnyLocationPermission() = ContextCompat.checkSelfPermission(
+ this,
+ Manifest.permission.ACCESS_FINE_LOCATION
+) == PackageManager.PERMISSION_GRANTED ||
+ ContextCompat.checkSelfPermission(
+ this,
+ Manifest.permission.ACCESS_COARSE_LOCATION
+ ) == PackageManager.PERMISSION_GRANTED
+
+fun Context.checkFineLocationPermission() = ContextCompat.checkSelfPermission(
+ this,
+ Manifest.permission.ACCESS_FINE_LOCATION
+) == PackageManager.PERMISSION_GRANTED
\ No newline at end of file