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 1be9447b31..024c7557ec 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -1251,7 +1251,7 @@ abstract class BaseBrowserFragment : viewLifecycleOwner.lifecycleScope.launch(Main) { val sitePermissions: SitePermissions? = tab.content.url.getOrigin()?.let { origin -> val storage = requireComponents.core.permissionStorage - storage.findSitePermissionsBy(origin) + storage.findSitePermissionsBy(origin, tab.content.private) } view?.let { 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 5a5efcaf4c..cbc70d0e8b 100644 --- a/app/src/main/java/org/mozilla/fenix/components/PermissionStorage.kt +++ b/app/src/main/java/org/mozilla/fenix/components/PermissionStorage.kt @@ -20,26 +20,58 @@ class PermissionStorage( context.components.core.geckoSitePermissionsStorage, ) { + /** + * Persists the [sitePermissions] provided as a parameter. + * @param sitePermissions the [sitePermissions] to be stored. + */ suspend fun add(sitePermissions: SitePermissions) = withContext(dispatcher) { - permissionsStorage.save(sitePermissions) + permissionsStorage.save(sitePermissions, private = false) } - suspend fun findSitePermissionsBy(origin: String): SitePermissions? = withContext(dispatcher) { - permissionsStorage.findSitePermissionsBy(origin) - } + /** + * Finds all SitePermissions that match the [origin]. + * @param origin the site to be used as filter in the search. + * @param private indicates if the [origin] belongs to a private session. + */ + suspend fun findSitePermissionsBy(origin: String, private: Boolean): SitePermissions? = + withContext(dispatcher) { + permissionsStorage.findSitePermissionsBy(origin, private = private) + } - suspend fun updateSitePermissions(sitePermissions: SitePermissions) = withContext(dispatcher) { - permissionsStorage.update(sitePermissions) - } + /** + * Replaces an existing SitePermissions with the values of [sitePermissions] provided as a parameter. + * @param sitePermissions the sitePermissions to be updated. + * @param private indicates if the [SitePermissions] belongs to a private session. + */ + suspend fun updateSitePermissions(sitePermissions: SitePermissions, private: Boolean) = + withContext(dispatcher) { + permissionsStorage.update(sitePermissions, private = private) + } + /** + * Returns all saved [SitePermissions] instances as a [DataSource.Factory]. + * + * A consuming app can transform the data source into a `LiveData` of when using RxJava2 into a + * `Flowable` or `Observable`, that can be observed. + * + * - https://developer.android.com/topic/libraries/architecture/paging/data + * - https://developer.android.com/topic/libraries/architecture/paging/ui + */ suspend fun getSitePermissionsPaged(): DataSource.Factory { return permissionsStorage.getSitePermissionsPaged() } + /** + * Deletes all sitePermissions that match the sitePermissions provided as a parameter. + * @param sitePermissions the sitePermissions to be deleted from the storage. + */ suspend fun deleteSitePermissions(sitePermissions: SitePermissions) = withContext(dispatcher) { - permissionsStorage.remove(sitePermissions) + permissionsStorage.remove(sitePermissions, private = false) } + /** + * Deletes all sitePermissions sitePermissions. + */ suspend fun deleteAllSitePermissions() = withContext(dispatcher) { permissionsStorage.removeAll() } 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 ffb244419a..98dba9fad0 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 @@ -263,8 +263,11 @@ class DefaultQuickSettingsController( */ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) fun handlePermissionsChange(updatedPermissions: SitePermissions) { + val tab = requireNotNull(browserStore.state.findTabOrCustomTab(sessionId)) { + "A session is required to update permission" + } ioScope.launch { - permissionStorage.updateSitePermissions(updatedPermissions) + permissionStorage.updateSitePermissions(updatedPermissions, tab.content.private) reload(sessionId) } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt index c55705e2e0..9b7dbc997d 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt @@ -59,7 +59,12 @@ class SitePermissionsDetailsExceptionsFragment : PreferenceFragmentCompat() { showToolbar(sitePermissions.origin.stripDefaultPort()) viewLifecycleOwner.lifecycleScope.launch(Main) { sitePermissions = - requireNotNull(requireComponents.core.permissionStorage.findSitePermissionsBy(sitePermissions.origin)) + requireNotNull( + requireComponents.core.permissionStorage.findSitePermissionsBy( + sitePermissions.origin, + private = false, + ), + ) bindCategoryPhoneFeatures() } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsManageExceptionsPhoneFeatureFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsManageExceptionsPhoneFeatureFragment.kt index e364e9e111..739b7eb620 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsManageExceptionsPhoneFeatureFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsManageExceptionsPhoneFeatureFragment.kt @@ -224,7 +224,10 @@ class SitePermissionsManageExceptionsPhoneFeatureFragment : Fragment() { private fun updatedSitePermissions(status: SitePermissions.Status) { val updatedSitePermissions = getSitePermission().update(getFeature(), status) viewLifecycleOwner.lifecycleScope.launch(Main) { - requireComponents.core.permissionStorage.updateSitePermissions(updatedSitePermissions) + requireComponents.core.permissionStorage.updateSitePermissions( + sitePermissions = updatedSitePermissions, + private = false, + ) requireComponents.tryReloadTabBy(updatedSitePermissions.origin) } } @@ -233,7 +236,10 @@ class SitePermissionsManageExceptionsPhoneFeatureFragment : Fragment() { internal fun updatedSitePermissions(autoplayValue: AutoplayValue) { val updatedSitePermissions = autoplayValue.updateSitePermissions(getSitePermission()) viewLifecycleOwner.lifecycleScope.launch(Main) { - requireComponents.core.permissionStorage.updateSitePermissions(updatedSitePermissions) + requireComponents.core.permissionStorage.updateSitePermissions( + sitePermissions = updatedSitePermissions, + private = false, + ) requireComponents.tryReloadTabBy(updatedSitePermissions.origin) } } diff --git a/app/src/test/java/org/mozilla/fenix/components/PermissionStorageTest.kt b/app/src/test/java/org/mozilla/fenix/components/PermissionStorageTest.kt index e18ab0f7ec..645dc8b00d 100644 --- a/app/src/test/java/org/mozilla/fenix/components/PermissionStorageTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/PermissionStorageTest.kt @@ -30,7 +30,7 @@ class PermissionStorageTest { storage.add(sitePermissions) - coVerify { sitePermissionsStorage.save(sitePermissions) } + coVerify { sitePermissionsStorage.save(sitePermissions, private = false) } } @Test @@ -39,11 +39,11 @@ class PermissionStorageTest { val sitePermissionsStorage: SitePermissionsStorage = mockk(relaxed = true) val storage = PermissionStorage(testContext, this.coroutineContext, sitePermissionsStorage) - coEvery { sitePermissionsStorage.findSitePermissionsBy(any()) } returns sitePermissions + coEvery { sitePermissionsStorage.findSitePermissionsBy(any(), any(), any()) } returns sitePermissions - val result = storage.findSitePermissionsBy("origin") + val result = storage.findSitePermissionsBy("origin", false) - coVerify { sitePermissionsStorage.findSitePermissionsBy("origin") } + coVerify { sitePermissionsStorage.findSitePermissionsBy("origin", private = false) } assertEquals(sitePermissions, result) } @@ -54,9 +54,9 @@ class PermissionStorageTest { val sitePermissionsStorage: SitePermissionsStorage = mockk(relaxed = true) val storage = PermissionStorage(testContext, this.coroutineContext, sitePermissionsStorage) - storage.updateSitePermissions(sitePermissions) + storage.updateSitePermissions(sitePermissions, private = false) - coVerify { sitePermissionsStorage.update(sitePermissions) } + coVerify { sitePermissionsStorage.update(sitePermissions, private = false) } } @Test @@ -82,7 +82,7 @@ class PermissionStorageTest { storage.deleteSitePermissions(sitePermissions) - coVerify { sitePermissionsStorage.remove(sitePermissions) } + coVerify { sitePermissionsStorage.remove(sitePermissions, private = false) } } @Test diff --git a/app/src/test/java/org/mozilla/fenix/settings/quicksettings/DefaultQuickSettingsControllerTest.kt b/app/src/test/java/org/mozilla/fenix/settings/quicksettings/DefaultQuickSettingsControllerTest.kt index faf035f610..947f038525 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/quicksettings/DefaultQuickSettingsControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/quicksettings/DefaultQuickSettingsControllerTest.kt @@ -284,7 +284,7 @@ class DefaultQuickSettingsControllerTest { advanceUntilIdle() coVerifyOrder { - permissionStorage.updateSitePermissions(testPermissions) + permissionStorage.updateSitePermissions(testPermissions, tab.content.private) reload(tab.id) } }