class LocationPermissionController( private val permissionManager: PermissionManager, private val activityProvider: ActivityProvider ) { suspend fun requestLocationPermission(): Boolean { if (permissionManager.hasPermission(Manifest.permission.ACCESS_FINE_LOCATION)) return true val permissionStatus = permissionManager.requestPermission(Manifest.permission.ACCESS_FINE_LOCATION) return when (permissionStatus) { is PermissionDenied -> { if (permissionStatus.shouldShowRationale) { if (showRationale()) requestLocationPermission() else false } else { showDenialSnackBar() false } } PermissionGranted -> true } } private suspend fun showRationale(): Boolean { // Show a dialog with to explain the need, and handle re-requesting the permission } private fun showDenialSnackBar() { // Show a Snackbar to let the user know about the denial } }