diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt index 35dd24bad..8b54f406d 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -399,6 +399,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session sitePermissionsFeature.set( feature = SitePermissionsFeature( context = context, + storage = context.components.core.permissionStorage.permissionsStorage, sessionManager = sessionManager, fragmentManager = parentFragmentManager, promptsStyling = SitePermissionsFeature.PromptsStyling( @@ -407,10 +408,11 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session positiveButtonBackgroundColor = accentHighContrastColor, positiveButtonTextColor = R.color.photonWhite ), - sessionId = customTabSessionId - ) { permissions -> - requestPermissions(permissions, REQUEST_CODE_APP_PERMISSIONS) - }, + sessionId = customTabSessionId, + onNeedToRequestPermissions = { permissions -> + requestPermissions(permissions, REQUEST_CODE_APP_PERMISSIONS) + }, + onShouldShowRequestPermissionRationale = { shouldShowRequestPermissionRationale(it) }), owner = this, view = view ) diff --git a/app/src/main/java/org/mozilla/fenix/components/PermissionStorage.kt b/app/src/main/java/org/mozilla/fenix/components/PermissionStorage.kt index ae1d1ff19..5d31c5a1e 100644 --- a/app/src/main/java/org/mozilla/fenix/components/PermissionStorage.kt +++ b/app/src/main/java/org/mozilla/fenix/components/PermissionStorage.kt @@ -15,7 +15,7 @@ import org.mozilla.fenix.utils.Mockable @Mockable class PermissionStorage(private val context: Context) { - private val permissionsStorage by lazy { + val permissionsStorage by lazy { SitePermissionsStorage(context, context.components.core.engine) } diff --git a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsSheetDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsSheetDialogFragment.kt index fb1bdf0e2..7e6904183 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsSheetDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsSheetDialogFragment.kt @@ -9,6 +9,7 @@ import android.content.Intent import android.content.pm.PackageManager.PERMISSION_GRANTED import android.graphics.Color import android.graphics.drawable.ColorDrawable +import android.net.Uri import android.os.Bundle import android.view.Gravity.BOTTOM import android.view.LayoutInflater @@ -28,6 +29,7 @@ import kotlinx.android.synthetic.main.fragment_quick_settings_dialog_sheet.* import kotlinx.android.synthetic.main.fragment_quick_settings_dialog_sheet.view.* import kotlinx.coroutines.ExperimentalCoroutinesApi import mozilla.components.lib.state.ext.consumeFrom +import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.IntentReceiverActivity import org.mozilla.fenix.R @@ -49,6 +51,7 @@ class QuickSettingsSheetDialogFragment : AppCompatDialogFragment() { private lateinit var websiteInfoView: WebsiteInfoView private lateinit var websitePermissionsView: WebsitePermissionsView private lateinit var interactor: QuickSettingsInteractor + private var tryToRequestPermissions: Boolean = false private val args by navArgs() override fun onCreateView( @@ -82,6 +85,7 @@ class QuickSettingsSheetDialogFragment : AppCompatDialogFragment() { addNewTab = context.components.useCases.tabsUseCases.addTab, requestRuntimePermissions = { permissions -> requestPermissions(permissions, REQUEST_CODE_QUICK_SETTINGS_PERMISSIONS) + tryToRequestPermissions = true }, reportSiteIssue = ::launchIntentReceiver, displayPermissions = ::showPermissionsView, @@ -143,7 +147,18 @@ class QuickSettingsSheetDialogFragment : AppCompatDialogFragment() { PhoneFeature.findFeatureBy(permissions)?.let { quickSettingsController.handleAndroidPermissionGranted(it) } + } else { + val shouldShowRequestPermissionRationale = permissions.all { shouldShowRequestPermissionRationale(it) } + + if (!shouldShowRequestPermissionRationale && tryToRequestPermissions) { + // The user has permanently blocked these permissions and he/she is trying to enabling them. + // at this point, we are not able to request these permissions, the only way to allow + // them, it is to take the user to the system app setting page, and there the user + // can allow the permissions. + openSystemSettings() + } } + tryToRequestPermissions = false } private fun Dialog.applyCustomizationsForTopDialog(rootView: View): Dialog { @@ -179,6 +194,13 @@ class QuickSettingsSheetDialogFragment : AppCompatDialogFragment() { } } + private fun openSystemSettings() { + startActivity(Intent().apply { + action = android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS + data = Uri.fromParts("package", BuildConfig.APPLICATION_ID, null) + }) + } + private companion object { const val REQUEST_CODE_QUICK_SETTINGS_PERMISSIONS = 4 }