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