Use enum to simplify delete on quit code
parent
fe8a8bfb0a
commit
1777b5a830
|
@ -17,6 +17,7 @@ import kotlin.coroutines.CoroutineContext
|
||||||
interface DeleteBrowsingDataController {
|
interface DeleteBrowsingDataController {
|
||||||
suspend fun deleteTabs()
|
suspend fun deleteTabs()
|
||||||
suspend fun deleteBrowsingData()
|
suspend fun deleteBrowsingData()
|
||||||
|
suspend fun deleteHistoryAndDOMStorages()
|
||||||
suspend fun deleteCollections(collections: List<TabCollection>)
|
suspend fun deleteCollections(collections: List<TabCollection>)
|
||||||
suspend fun deleteCookies()
|
suspend fun deleteCookies()
|
||||||
suspend fun deleteCachedFiles()
|
suspend fun deleteCachedFiles()
|
||||||
|
@ -27,6 +28,7 @@ class DefaultDeleteBrowsingDataController(
|
||||||
val context: Context,
|
val context: Context,
|
||||||
val coroutineContext: CoroutineContext = Dispatchers.Main
|
val coroutineContext: CoroutineContext = Dispatchers.Main
|
||||||
) : DeleteBrowsingDataController {
|
) : DeleteBrowsingDataController {
|
||||||
|
|
||||||
override suspend fun deleteTabs() {
|
override suspend fun deleteTabs() {
|
||||||
withContext(coroutineContext) {
|
withContext(coroutineContext) {
|
||||||
context.components.useCases.tabsUseCases.removeAllTabs.invoke()
|
context.components.useCases.tabsUseCases.removeAllTabs.invoke()
|
||||||
|
@ -44,7 +46,7 @@ class DefaultDeleteBrowsingDataController(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun deleteHistoryAndDOMStorages() {
|
override suspend fun deleteHistoryAndDOMStorages() {
|
||||||
withContext(coroutineContext) {
|
withContext(coroutineContext) {
|
||||||
context.components.core.engine.clearData(Engine.BrowsingData.select(Engine.BrowsingData.DOM_STORAGES))
|
context.components.core.engine.clearData(Engine.BrowsingData.select(Engine.BrowsingData.DOM_STORAGES))
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,9 +12,22 @@ import androidx.preference.PreferenceFragmentCompat
|
||||||
import androidx.preference.SwitchPreference
|
import androidx.preference.SwitchPreference
|
||||||
import org.mozilla.fenix.R
|
import org.mozilla.fenix.R
|
||||||
import org.mozilla.fenix.ext.getPreferenceKey
|
import org.mozilla.fenix.ext.getPreferenceKey
|
||||||
import org.mozilla.fenix.utils.Settings
|
import org.mozilla.fenix.ext.settings
|
||||||
|
|
||||||
class DeleteBrowsingDataOnQuitFragment : PreferenceFragmentCompat() {
|
class DeleteBrowsingDataOnQuitFragment : PreferenceFragmentCompat() {
|
||||||
|
|
||||||
|
private val checkboxes by lazy {
|
||||||
|
val context = requireContext()
|
||||||
|
DeleteBrowsingDataOnQuitType.values()
|
||||||
|
.asSequence()
|
||||||
|
.mapNotNull { type ->
|
||||||
|
findPreference<CheckBoxPreference>(type.getPreferenceKey(context))?.let { pref ->
|
||||||
|
type to pref
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.toMap()
|
||||||
|
}
|
||||||
|
|
||||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||||
setPreferencesFromResource(R.xml.delete_browsing_data_quit_preferences, rootKey)
|
setPreferencesFromResource(R.xml.delete_browsing_data_quit_preferences, rootKey)
|
||||||
}
|
}
|
||||||
|
@ -25,81 +38,42 @@ class DeleteBrowsingDataOnQuitFragment : PreferenceFragmentCompat() {
|
||||||
activity?.title = getString(R.string.preferences_delete_browsing_data_on_quit)
|
activity?.title = getString(R.string.preferences_delete_browsing_data_on_quit)
|
||||||
(activity as AppCompatActivity).supportActionBar?.show()
|
(activity as AppCompatActivity).supportActionBar?.show()
|
||||||
|
|
||||||
val checkboxUpdater = object : SharedPreferenceUpdater() {
|
// Delete Browsing Data on Quit Switch
|
||||||
override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean {
|
val deleteOnQuitPref = findPreference<SwitchPreference>(
|
||||||
super.onPreferenceChange(preference, newValue)
|
|
||||||
if (!Settings.getInstance(preference.context).shouldDeleteAnyDataOnQuit()) {
|
|
||||||
findPreference<SwitchPreference>(
|
|
||||||
getPreferenceKey(R.string.pref_key_delete_browsing_data_on_quit)
|
getPreferenceKey(R.string.pref_key_delete_browsing_data_on_quit)
|
||||||
)?.apply {
|
)
|
||||||
isChecked = false
|
deleteOnQuitPref?.apply {
|
||||||
}
|
onPreferenceChangeListener = object : SharedPreferenceUpdater() {
|
||||||
Settings.getInstance(preference.context).preferences.edit().putBoolean(
|
|
||||||
getString(R.string.pref_key_delete_browsing_data_on_quit),
|
|
||||||
false
|
|
||||||
).apply()
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val switchUpdater = object : SharedPreferenceUpdater() {
|
|
||||||
override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean {
|
override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean {
|
||||||
setAllCheckboxes(newValue as Boolean)
|
setAllCheckboxes(newValue as Boolean)
|
||||||
return super.onPreferenceChange(preference, newValue)
|
return super.onPreferenceChange(preference, newValue)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
isChecked = context.settings().shouldDeleteBrowsingDataOnQuit
|
||||||
findPreference<CheckBoxPreference>(getPreferenceKey(R.string.pref_key_delete_open_tabs_on_quit))?.apply {
|
|
||||||
onPreferenceChangeListener = checkboxUpdater
|
|
||||||
}
|
|
||||||
findPreference<CheckBoxPreference>(getPreferenceKey(R.string.pref_key_delete_browsing_history_on_quit))?.apply {
|
|
||||||
onPreferenceChangeListener = checkboxUpdater
|
|
||||||
}
|
|
||||||
findPreference<CheckBoxPreference>(getPreferenceKey(R.string.pref_key_delete_caches_on_quit))?.apply {
|
|
||||||
onPreferenceChangeListener = checkboxUpdater
|
|
||||||
}
|
|
||||||
findPreference<CheckBoxPreference>(getPreferenceKey(R.string.pref_key_delete_permissions_on_quit))?.apply {
|
|
||||||
onPreferenceChangeListener = checkboxUpdater
|
|
||||||
}
|
|
||||||
findPreference<CheckBoxPreference>(getPreferenceKey(R.string.pref_key_delete_cookies_on_quit))?.apply {
|
|
||||||
onPreferenceChangeListener = checkboxUpdater
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete Browsing Data on Quit Switch
|
val checkboxUpdater = object : SharedPreferenceUpdater() {
|
||||||
val deleteOnQuitKey = getPreferenceKey(R.string.pref_key_delete_browsing_data_on_quit)
|
override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean {
|
||||||
findPreference<SwitchPreference>(deleteOnQuitKey)?.apply {
|
super.onPreferenceChange(preference, newValue)
|
||||||
onPreferenceChangeListener = switchUpdater
|
val settings = preference.context.settings()
|
||||||
isChecked = Settings.getInstance(context!!).shouldDeleteBrowsingDataOnQuit
|
|
||||||
|
if (!settings.shouldDeleteAnyDataOnQuit()) {
|
||||||
|
deleteOnQuitPref?.isChecked = false
|
||||||
|
settings.shouldDeleteBrowsingDataOnQuit = false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
checkboxes.forEach { (_, pref) ->
|
||||||
|
pref.onPreferenceChangeListener = checkboxUpdater
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setAllCheckboxes(newValue: Boolean) {
|
private fun setAllCheckboxes(newValue: Boolean) {
|
||||||
val openTabs =
|
checkboxes.forEach { (type, pref) ->
|
||||||
findPreference<CheckBoxPreference>(getPreferenceKey(R.string.pref_key_delete_open_tabs_on_quit))
|
pref.isChecked = newValue
|
||||||
val history =
|
pref.context.settings().setDeleteDataOnQuit(type, newValue)
|
||||||
findPreference<CheckBoxPreference>(getPreferenceKey(R.string.pref_key_delete_browsing_history_on_quit))
|
}
|
||||||
val cache =
|
|
||||||
findPreference<CheckBoxPreference>(getPreferenceKey(R.string.pref_key_delete_caches_on_quit))
|
|
||||||
val permissions =
|
|
||||||
findPreference<CheckBoxPreference>(getPreferenceKey(R.string.pref_key_delete_permissions_on_quit))
|
|
||||||
val cookies =
|
|
||||||
findPreference<CheckBoxPreference>(getPreferenceKey(R.string.pref_key_delete_cookies_on_quit))
|
|
||||||
|
|
||||||
openTabs?.isChecked = newValue
|
|
||||||
history?.isChecked = newValue
|
|
||||||
cache?.isChecked = newValue
|
|
||||||
permissions?.isChecked = newValue
|
|
||||||
cookies?.isChecked = newValue
|
|
||||||
|
|
||||||
Settings.getInstance(context!!).preferences.edit().putBoolean(openTabs?.key, newValue)
|
|
||||||
.apply()
|
|
||||||
Settings.getInstance(context!!).preferences.edit().putBoolean(history?.key, newValue)
|
|
||||||
.apply()
|
|
||||||
Settings.getInstance(context!!).preferences.edit().putBoolean(cache?.key, newValue).apply()
|
|
||||||
Settings.getInstance(context!!).preferences.edit().putBoolean(permissions?.key, newValue)
|
|
||||||
.apply()
|
|
||||||
Settings.getInstance(context!!).preferences.edit().putBoolean(cookies?.key, newValue)
|
|
||||||
.apply()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
package org.mozilla.fenix.settings
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import androidx.annotation.StringRes
|
||||||
|
import org.mozilla.fenix.R
|
||||||
|
import org.mozilla.fenix.ext.getPreferenceKey
|
||||||
|
|
||||||
|
enum class DeleteBrowsingDataOnQuitType(@StringRes private val prefKey: Int) {
|
||||||
|
TABS(R.string.pref_key_delete_open_tabs_on_quit),
|
||||||
|
HISTORY(R.string.pref_key_delete_browsing_history_on_quit),
|
||||||
|
COOKIES(R.string.pref_key_delete_cookies_on_quit),
|
||||||
|
CACHE(R.string.pref_key_delete_caches_on_quit),
|
||||||
|
PERMISSIONS(R.string.pref_key_delete_permissions_on_quit);
|
||||||
|
|
||||||
|
fun getPreferenceKey(context: Context) = context.getPreferenceKey(prefKey)
|
||||||
|
}
|
|
@ -6,35 +6,43 @@ package org.mozilla.fenix.utils
|
||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers.IO
|
||||||
|
import kotlinx.coroutines.joinAll
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
import org.mozilla.fenix.ext.settings
|
||||||
import org.mozilla.fenix.settings.DefaultDeleteBrowsingDataController
|
import org.mozilla.fenix.settings.DefaultDeleteBrowsingDataController
|
||||||
|
import org.mozilla.fenix.settings.DeleteBrowsingDataController
|
||||||
|
import org.mozilla.fenix.settings.DeleteBrowsingDataOnQuitType
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deletes selected browsing data and finishes the activity.
|
* Deletes selected browsing data and finishes the activity.
|
||||||
*/
|
*/
|
||||||
fun deleteAndQuit(activity: Activity, coroutineScope: CoroutineScope) {
|
fun deleteAndQuit(activity: Activity, coroutineScope: CoroutineScope) {
|
||||||
coroutineScope.launch {
|
coroutineScope.launch {
|
||||||
|
val settings = activity.settings()
|
||||||
val controller = DefaultDeleteBrowsingDataController(activity, coroutineContext)
|
val controller = DefaultDeleteBrowsingDataController(activity, coroutineContext)
|
||||||
|
|
||||||
if (Settings.getInstance(activity).deleteCacheOnQuit) {
|
DeleteBrowsingDataOnQuitType.values().map { type ->
|
||||||
controller.deleteCachedFiles()
|
launch {
|
||||||
}
|
if (settings.getDeleteDataOnQuit(type)) {
|
||||||
if (Settings.getInstance(activity).deleteTabsOnQuit) {
|
controller.deleteType(type)
|
||||||
controller.deleteTabs()
|
|
||||||
}
|
|
||||||
if (Settings.getInstance(activity).deletePermissionsOnQuit) {
|
|
||||||
launch(Dispatchers.IO) {
|
|
||||||
controller.deleteSitePermissions()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Settings.getInstance(activity).deleteCookiesOnQuit) {
|
}.joinAll()
|
||||||
controller.deleteCookies()
|
|
||||||
}
|
|
||||||
if (Settings.getInstance(activity).deleteHistoryOnQuit) {
|
|
||||||
controller.deleteHistoryAndDOMStorages()
|
|
||||||
}
|
|
||||||
|
|
||||||
activity.finish()
|
activity.finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private suspend fun DeleteBrowsingDataController.deleteType(type: DeleteBrowsingDataOnQuitType) {
|
||||||
|
when (type) {
|
||||||
|
DeleteBrowsingDataOnQuitType.TABS -> deleteTabs()
|
||||||
|
DeleteBrowsingDataOnQuitType.HISTORY -> deleteHistoryAndDOMStorages()
|
||||||
|
DeleteBrowsingDataOnQuitType.COOKIES -> deleteCookies()
|
||||||
|
DeleteBrowsingDataOnQuitType.CACHE -> deleteCachedFiles()
|
||||||
|
DeleteBrowsingDataOnQuitType.PERMISSIONS -> withContext(IO) {
|
||||||
|
deleteSitePermissions()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ import org.mozilla.fenix.Config
|
||||||
import org.mozilla.fenix.R
|
import org.mozilla.fenix.R
|
||||||
import org.mozilla.fenix.components.metrics.MozillaProductDetector
|
import org.mozilla.fenix.components.metrics.MozillaProductDetector
|
||||||
import org.mozilla.fenix.ext.getPreferenceKey
|
import org.mozilla.fenix.ext.getPreferenceKey
|
||||||
|
import org.mozilla.fenix.settings.DeleteBrowsingDataOnQuitType
|
||||||
import org.mozilla.fenix.settings.PhoneFeature
|
import org.mozilla.fenix.settings.PhoneFeature
|
||||||
import java.security.InvalidParameterException
|
import java.security.InvalidParameterException
|
||||||
|
|
||||||
|
@ -174,39 +175,16 @@ class Settings private constructor(
|
||||||
default = false
|
default = false
|
||||||
)
|
)
|
||||||
|
|
||||||
var deleteTabsOnQuit by booleanPreference(
|
fun getDeleteDataOnQuit(type: DeleteBrowsingDataOnQuitType): Boolean =
|
||||||
appContext.getPreferenceKey(R.string.pref_key_delete_open_tabs_on_quit),
|
preferences.getBoolean(type.getPreferenceKey(appContext), false)
|
||||||
default = false
|
|
||||||
)
|
|
||||||
|
|
||||||
var deleteHistoryOnQuit by booleanPreference(
|
fun setDeleteDataOnQuit(type: DeleteBrowsingDataOnQuitType, value: Boolean) {
|
||||||
appContext.getPreferenceKey(R.string.pref_key_delete_browsing_history_on_quit),
|
preferences.edit().putBoolean(type.getPreferenceKey(appContext), value).apply()
|
||||||
default = false
|
|
||||||
)
|
|
||||||
|
|
||||||
var deleteCookiesOnQuit by booleanPreference(
|
|
||||||
appContext.getPreferenceKey(R.string.pref_key_delete_cookies_on_quit),
|
|
||||||
default = false
|
|
||||||
)
|
|
||||||
|
|
||||||
var deleteCacheOnQuit by booleanPreference(
|
|
||||||
appContext.getPreferenceKey(R.string.pref_key_delete_caches_on_quit),
|
|
||||||
default = false
|
|
||||||
)
|
|
||||||
|
|
||||||
var deletePermissionsOnQuit by booleanPreference(
|
|
||||||
appContext.getPreferenceKey(R.string.pref_key_delete_permissions_on_quit),
|
|
||||||
default = false
|
|
||||||
)
|
|
||||||
|
|
||||||
fun shouldDeleteAnyDataOnQuit(): Boolean {
|
|
||||||
return deleteCacheOnQuit ||
|
|
||||||
deleteCookiesOnQuit ||
|
|
||||||
deleteHistoryOnQuit ||
|
|
||||||
deletePermissionsOnQuit ||
|
|
||||||
deleteTabsOnQuit
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun shouldDeleteAnyDataOnQuit() =
|
||||||
|
DeleteBrowsingDataOnQuitType.values().any { getDeleteDataOnQuit(it) }
|
||||||
|
|
||||||
val themeSettingString: String
|
val themeSettingString: String
|
||||||
get() = when {
|
get() = when {
|
||||||
shouldFollowDeviceTheme -> appContext.getString(R.string.preference_follow_device_theme)
|
shouldFollowDeviceTheme -> appContext.getString(R.string.preference_follow_device_theme)
|
||||||
|
|
|
@ -30,6 +30,7 @@ import org.mozilla.fenix.TestApplication
|
||||||
import org.mozilla.fenix.components.PermissionStorage
|
import org.mozilla.fenix.components.PermissionStorage
|
||||||
import org.mozilla.fenix.ext.clearAndCommit
|
import org.mozilla.fenix.ext.clearAndCommit
|
||||||
import org.mozilla.fenix.ext.components
|
import org.mozilla.fenix.ext.components
|
||||||
|
import org.mozilla.fenix.settings.DeleteBrowsingDataOnQuitType
|
||||||
import org.robolectric.annotation.Config
|
import org.robolectric.annotation.Config
|
||||||
|
|
||||||
@ObsoleteCoroutinesApi
|
@ObsoleteCoroutinesApi
|
||||||
|
@ -76,7 +77,7 @@ class DeleteAndQuitTest {
|
||||||
@Test
|
@Test
|
||||||
fun `delete only tabs and quit`() = runBlockingTest {
|
fun `delete only tabs and quit`() = runBlockingTest {
|
||||||
// When
|
// When
|
||||||
settings.deleteTabsOnQuit = true
|
settings.setDeleteDataOnQuit(DeleteBrowsingDataOnQuitType.TABS, true)
|
||||||
|
|
||||||
deleteAndQuit(activity, this)
|
deleteAndQuit(activity, this)
|
||||||
|
|
||||||
|
@ -103,11 +104,9 @@ class DeleteAndQuitTest {
|
||||||
@Test
|
@Test
|
||||||
fun `delete everything and quit`() = runBlockingTest {
|
fun `delete everything and quit`() = runBlockingTest {
|
||||||
// When
|
// When
|
||||||
settings.deleteTabsOnQuit = true
|
DeleteBrowsingDataOnQuitType.values().forEach {
|
||||||
settings.deletePermissionsOnQuit = true
|
settings.setDeleteDataOnQuit(it, true)
|
||||||
settings.deleteHistoryOnQuit = true
|
}
|
||||||
settings.deleteCookiesOnQuit = true
|
|
||||||
settings.deleteCacheOnQuit = true
|
|
||||||
|
|
||||||
deleteAndQuit(activity, this)
|
deleteAndQuit(activity, this)
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ import org.junit.runner.RunWith
|
||||||
import org.mozilla.fenix.TestApplication
|
import org.mozilla.fenix.TestApplication
|
||||||
import org.mozilla.fenix.ext.clearAndCommit
|
import org.mozilla.fenix.ext.clearAndCommit
|
||||||
import org.mozilla.fenix.ext.settings
|
import org.mozilla.fenix.ext.settings
|
||||||
|
import org.mozilla.fenix.settings.DeleteBrowsingDataOnQuitType
|
||||||
import org.mozilla.fenix.settings.PhoneFeature
|
import org.mozilla.fenix.settings.PhoneFeature
|
||||||
import org.robolectric.annotation.Config
|
import org.robolectric.annotation.Config
|
||||||
|
|
||||||
|
@ -80,20 +81,20 @@ class SettingsTest {
|
||||||
assertFalse(settings.shouldDeleteAnyDataOnQuit())
|
assertFalse(settings.shouldDeleteAnyDataOnQuit())
|
||||||
|
|
||||||
// When
|
// When
|
||||||
settings.deleteTabsOnQuit = true
|
settings.setDeleteDataOnQuit(DeleteBrowsingDataOnQuitType.TABS, true)
|
||||||
|
|
||||||
// Then
|
// Then
|
||||||
assertTrue(settings.shouldDeleteAnyDataOnQuit())
|
assertTrue(settings.shouldDeleteAnyDataOnQuit())
|
||||||
|
|
||||||
// When
|
// When
|
||||||
settings.deletePermissionsOnQuit = true
|
settings.setDeleteDataOnQuit(DeleteBrowsingDataOnQuitType.PERMISSIONS, true)
|
||||||
|
|
||||||
// Then
|
// Then
|
||||||
assertTrue(settings.shouldDeleteAnyDataOnQuit())
|
assertTrue(settings.shouldDeleteAnyDataOnQuit())
|
||||||
|
|
||||||
// When
|
// When
|
||||||
settings.deletePermissionsOnQuit = false
|
settings.setDeleteDataOnQuit(DeleteBrowsingDataOnQuitType.TABS, false)
|
||||||
settings.deleteTabsOnQuit = false
|
settings.setDeleteDataOnQuit(DeleteBrowsingDataOnQuitType.PERMISSIONS, false)
|
||||||
|
|
||||||
// Then
|
// Then
|
||||||
assertFalse(settings.shouldDeleteAnyDataOnQuit())
|
assertFalse(settings.shouldDeleteAnyDataOnQuit())
|
||||||
|
|
Loading…
Reference in New Issue