From e6791b5c0892bcb5becba96b5b3a0fa31d501e73 Mon Sep 17 00:00:00 2001 From: Rushab Kumar Date: Thu, 9 Jan 2020 03:21:45 +0530 Subject: [PATCH] For #7154 - Fix crash when tapping on "Blocked" in the site info panel (#7404) --- .../quicksettings/QuickSettingsController.kt | 34 ++++++++++++++----- app/src/main/res/navigation/nav_graph.xml | 4 +++ .../DefaultQuickSettingsControllerTest.kt | 33 ++++++++++++++++++ 3 files changed, 62 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsController.kt b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsController.kt index 141ad0fbf..9bbe28137 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsController.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsController.kt @@ -95,17 +95,22 @@ class DefaultQuickSettingsController( when (permission.isBlockedByAndroid) { true -> handleAndroidPermissionRequest(featureToggled.androidPermissionsList) false -> { - sitePermissions = sitePermissions!!.toggle(featureToggled).also { - handlePermissionsChange(it) - } + val permissions = sitePermissions + if (permissions != null) { + val newPermissions = permissions.toggle(featureToggled).also { + handlePermissionsChange(it) + } - quickSettingsStore.dispatch( - WebsitePermissionAction.TogglePermission( - permission, - featureToggled.getActionLabel(context, sitePermissions, settings), - featureToggled.shouldBeEnabled(context, sitePermissions, settings) + quickSettingsStore.dispatch( + WebsitePermissionAction.TogglePermission( + permission, + featureToggled.getActionLabel(context, newPermissions, settings), + featureToggled.shouldBeEnabled(context, newPermissions, settings) + ) ) - ) + } else { + navigateToManagePhoneFeature(featureToggled) + } } } } @@ -189,4 +194,15 @@ class DefaultQuickSettingsController( PhoneFeature.AUTOPLAY -> defaultWebsitePermission!! // fail-fast } } + + /** + * Navigate to toggle [SitePermissions] for the specified [PhoneFeature] + * + * @param phoneFeature [PhoneFeature] to toggle [SitePermissions] for. + */ + private fun navigateToManagePhoneFeature(phoneFeature: PhoneFeature) { + val directions = QuickSettingsSheetDialogFragmentDirections + .actionQuickSettingsSheetDialogFragmentToSitePermissionsManagePhoneFeature(phoneFeature.id) + navController.navigate(directions) + } } diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index dd7eaacf8..c677d528a 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -596,6 +596,10 @@ android:name="gravity" android:defaultValue="80" app:argType="integer" /> + () + val invalidSitePermissionsController = DefaultQuickSettingsController( + context = context, + quickSettingsStore = store, + coroutineScope = coroutinesScope, + navController = navController, + session = browserSession, + sitePermissions = null, + settings = appSettings, + permissionStorage = permissionStorage, + reload = reload, + addNewTab = addNewTab, + requestRuntimePermissions = requestPermissions, + reportSiteIssue = reportIssue, + displayPermissions = displayPermissions, + dismiss = dismiss + ) + + every { websitePermission.isBlockedByAndroid } returns false + every { navController.navigate(any()) } just Runs + + invalidSitePermissionsController.handlePermissionToggled(websitePermission) + + verify { + navController.navigate(any()) + } + } + @Test fun `handleAndroidPermissionGranted should update the View's state`() { val featureGranted = PhoneFeature.CAMERA