1
0
Fork 0

Use enum to simplify delete on quit code

master
Tiger Oakes 2019-09-14 12:35:17 -07:00 committed by Emily Kager
parent fe8a8bfb0a
commit 1777b5a830
7 changed files with 105 additions and 123 deletions

View File

@ -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))
} }

View File

@ -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()
} }
} }

View File

@ -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)
}

View File

@ -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()
}
}
}

View File

@ -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)

View File

@ -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)

View File

@ -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())