diff --git a/site-permissions/site-permissions-impl/src/main/java/com/duckduckgo/site/permissions/impl/SitePermissionsDialogActivityLauncher.kt b/site-permissions/site-permissions-impl/src/main/java/com/duckduckgo/site/permissions/impl/SitePermissionsDialogActivityLauncher.kt index fa06340cd664..c75ab5a9ad49 100644 --- a/site-permissions/site-permissions-impl/src/main/java/com/duckduckgo/site/permissions/impl/SitePermissionsDialogActivityLauncher.kt +++ b/site-permissions/site-permissions-impl/src/main/java/com/duckduckgo/site/permissions/impl/SitePermissionsDialogActivityLauncher.kt @@ -433,7 +433,9 @@ class SitePermissionsDialogActivityLauncher @Inject constructor( systemPermissionGranted() } else { systemPermissionsHelper.requestMultiplePermissions( - arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION), + // ACCESS_FINE_LOCATION is now considered optional, so ACCESS_COARSE_LOCATION should be first on the list, + // because of how systemPermissionsHelper handles showing rationale dialog in case permissions are rejected. + arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION), ) } } diff --git a/site-permissions/site-permissions-impl/src/main/java/com/duckduckgo/site/permissions/impl/SystemPermissionsHelper.kt b/site-permissions/site-permissions-impl/src/main/java/com/duckduckgo/site/permissions/impl/SystemPermissionsHelper.kt index a614b24d5589..d3a0ef235262 100644 --- a/site-permissions/site-permissions-impl/src/main/java/com/duckduckgo/site/permissions/impl/SystemPermissionsHelper.kt +++ b/site-permissions/site-permissions-impl/src/main/java/com/duckduckgo/site/permissions/impl/SystemPermissionsHelper.kt @@ -60,10 +60,8 @@ class SystemPermissionsHelperImpl @Inject constructor( override fun hasCameraPermissionsGranted(): Boolean = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED - override fun hasLocationPermissionsGranted(): Boolean { - return ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED && - ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED - } + override fun hasLocationPermissionsGranted(): Boolean = + ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED override fun registerPermissionLaunchers( caller: ActivityResultCaller, @@ -75,7 +73,8 @@ class SystemPermissionsHelperImpl @Inject constructor( } multiplePermissionsLauncher = caller.registerForActivityResult(RequestMultiplePermissions()) { - onResultMultiplePermissionsRequest(it) + val permissionsRequestResult = optimiseLocationPermissions(it) + onResultMultiplePermissionsRequest(permissionsRequestResult) } } @@ -99,4 +98,15 @@ class SystemPermissionsHelperImpl @Inject constructor( override fun isPermissionsRejectedForever(activity: Activity): Boolean = currentPermissionRequested?.let { !ActivityCompat.shouldShowRequestPermissionRationale(activity, it) } ?: true + + private fun optimiseLocationPermissions(permissionsRequestedResult: Map): Map { + val locationPermissions = setOf(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION) + + return if (permissionsRequestedResult.keys == locationPermissions) { + // For location permissions request, it is enough for the user to grant access to approximate location + mapOf(Manifest.permission.ACCESS_COARSE_LOCATION to permissionsRequestedResult.getValue(Manifest.permission.ACCESS_COARSE_LOCATION)) + } else { + permissionsRequestedResult + } + } }