diff --git a/app/src/main/java/org/mozilla/fenix/BrowsingModeManager.kt b/app/src/main/java/org/mozilla/fenix/BrowsingModeManager.kt index 33645203b..0b13da4d7 100644 --- a/app/src/main/java/org/mozilla/fenix/BrowsingModeManager.kt +++ b/app/src/main/java/org/mozilla/fenix/BrowsingModeManager.kt @@ -4,7 +4,7 @@ package org.mozilla.fenix -import android.preference.PreferenceManager +import org.mozilla.fenix.utils.Settings interface BrowsingModeManager { enum class Mode { @@ -20,8 +20,8 @@ class DefaultBrowsingModeManager(private val homeActivity: HomeActivity) : Brows get() = temporaryModeStorage!! set(value) { temporaryModeStorage = value - updateTheme(value) setPreference() + updateTheme(value) } private fun updateTheme(mode: BrowsingModeManager.Mode) { @@ -35,14 +35,12 @@ class DefaultBrowsingModeManager(private val homeActivity: HomeActivity) : Brows } private fun setPreference() { - PreferenceManager.getDefaultSharedPreferences(homeActivity) - .edit().putBoolean(homeActivity.getString(R.string.pref_key_private_mode), isPrivate).apply() + Settings.getInstance(homeActivity).setPrivateMode(isPrivate) } init { if (temporaryModeStorage == null) { - mode = when (PreferenceManager.getDefaultSharedPreferences(homeActivity) - .getBoolean(homeActivity.getString(R.string.pref_key_private_mode), false)) { + mode = when (Settings.getInstance(homeActivity).usePrivateMode) { true -> BrowsingModeManager.Mode.Private false -> BrowsingModeManager.Mode.Normal } diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt index db73fc4ee..3150a8494 100644 --- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt +++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -7,12 +7,11 @@ package org.mozilla.fenix import android.annotation.SuppressLint import android.app.Application import androidx.appcompat.app.AppCompatDelegate -import androidx.preference.PreferenceManager +import kotlinx.coroutines.Deferred import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.async import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.Deferred import mozilla.components.concept.fetch.Client import mozilla.components.lib.fetch.httpurlconnection.HttpURLConnectionClient import mozilla.components.service.fretboard.Fretboard @@ -212,14 +211,12 @@ open class FenixApplication : Application() { AppCompatDelegate.setDefaultNightMode( AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM ) - PreferenceManager.getDefaultSharedPreferences(this).edit() - .putBoolean(getString(R.string.pref_key_follow_device_theme), true).apply() + Settings.getInstance(this).setFollowDeviceTheme(true) } else { AppCompatDelegate.setDefaultNightMode( AppCompatDelegate.MODE_NIGHT_NO ) - PreferenceManager.getDefaultSharedPreferences(this).edit() - .putBoolean(getString(R.string.pref_key_light_theme), true).apply() + Settings.getInstance(this).setLightTheme(true) } } } diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index bc2c36c70..27bf3a03e 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -7,7 +7,6 @@ package org.mozilla.fenix import android.content.Context import android.content.Intent import android.os.Bundle -import android.preference.PreferenceManager import android.util.AttributeSet import android.view.View import androidx.appcompat.app.AppCompatActivity @@ -33,6 +32,7 @@ import org.mozilla.fenix.library.bookmarks.selectfolder.SelectBookmarkFolderFrag import org.mozilla.fenix.library.history.HistoryFragmentDirections import org.mozilla.fenix.search.SearchFragmentDirections import org.mozilla.fenix.settings.SettingsFragmentDirections +import org.mozilla.fenix.utils.Settings @SuppressWarnings("TooManyFunctions") open class HomeActivity : AppCompatActivity() { @@ -56,8 +56,7 @@ open class HomeActivity : AppCompatActivity() { super.onCreate(savedInstanceState) themeManager.temporaryThemeManagerStorage = - when (PreferenceManager.getDefaultSharedPreferences(this) - .getBoolean(this.getString(R.string.pref_key_private_mode), false)) { + when (Settings.getInstance(this).usePrivateMode) { true -> ThemeManager.Theme.Private false -> ThemeManager.Theme.Normal } diff --git a/app/src/main/java/org/mozilla/fenix/IntentReceiverActivity.kt b/app/src/main/java/org/mozilla/fenix/IntentReceiverActivity.kt index cc3e75a5f..4fcdf524d 100644 --- a/app/src/main/java/org/mozilla/fenix/IntentReceiverActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/IntentReceiverActivity.kt @@ -7,11 +7,11 @@ package org.mozilla.fenix import android.app.Activity import android.content.Intent import android.os.Bundle -import android.preference.PreferenceManager import mozilla.components.browser.session.tab.CustomTabConfig import mozilla.components.support.utils.SafeIntent import org.mozilla.fenix.customtabs.CustomTabActivity import org.mozilla.fenix.ext.components +import org.mozilla.fenix.utils.Settings class IntentReceiverActivity : Activity() { @@ -23,8 +23,7 @@ class IntentReceiverActivity : Activity() { // the HomeActivity. val intent = intent?.let { Intent(intent) } ?: Intent() - val isPrivate = PreferenceManager - .getDefaultSharedPreferences(this).getBoolean(getString(R.string.pref_key_private_mode), false) + val isPrivate = Settings.getInstance(this).usePrivateMode if (isPrivate) { components.utils.privateIntentProcessor.process(intent) 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 3f5b5ec77..83a60ebfe 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 @@ -4,13 +4,14 @@ package org.mozilla.fenix.settings.quicksettings +import android.content.Context import android.content.pm.PackageManager.PERMISSION_GRANTED import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.appcompat.view.ContextThemeWrapper import androidx.constraintlayout.widget.ConstraintLayout -import androidx.preference.PreferenceManager import com.google.android.material.bottomsheet.BottomSheetDialogFragment import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -18,6 +19,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.launch import mozilla.components.feature.sitepermissions.SitePermissions import org.mozilla.fenix.HomeActivity +import org.mozilla.fenix.R import org.mozilla.fenix.browser.BrowserFragment import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.requireComponents @@ -25,9 +27,8 @@ import org.mozilla.fenix.mvi.ActionBusFactory import org.mozilla.fenix.mvi.getAutoDisposeObservable import org.mozilla.fenix.mvi.getManagedEmitter import org.mozilla.fenix.settings.PhoneFeature +import org.mozilla.fenix.utils.Settings import kotlin.coroutines.CoroutineContext -import androidx.appcompat.view.ContextThemeWrapper -import org.mozilla.fenix.R private const val KEY_URL = "KEY_URL" private const val KEY_IS_SECURED = "KEY_IS_SECURED" @@ -133,6 +134,23 @@ class QuickSettingsSheetDialogFragment : BottomSheetDialogFragment(), CoroutineS private fun arePermissionsGranted(requestCode: Int, grantResults: IntArray) = requestCode == REQUEST_CODE_QUICK_SETTINGS_PERMISSIONS && grantResults.all { it == PERMISSION_GRANTED } + private fun toggleTrackingProtection(trackingEnabled: Boolean, context: Context) { + with(requireComponents.core) { + val policy = + createTrackingProtectionPolicy(trackingEnabled) + Settings.getInstance(context).setTrackingProtection(trackingEnabled) + engine.settings.trackingProtectionPolicy = policy + + with(sessionManager) { + sessions.forEach { + getEngineSession(it)?.enableTrackingProtection( + policy + ) + } + } + } + } + override fun onResume() { super.onResume() getAutoDisposeObservable() @@ -150,24 +168,7 @@ class QuickSettingsSheetDialogFragment : BottomSheetDialogFragment(), CoroutineS } is QuickSettingsAction.ToggleTrackingProtection -> { val trackingEnabled = it.trackingProtection - with(requireComponents.core) { - val policy = - createTrackingProtectionPolicy(trackingEnabled) - PreferenceManager.getDefaultSharedPreferences(context).edit() - .putBoolean( - context!!.getString(R.string.pref_key_tracking_protection), - trackingEnabled - ).apply() - engine.settings.trackingProtectionPolicy = policy - - with(sessionManager) { - sessions.forEach { - getEngineSession(it)?.enableTrackingProtection( - policy - ) - } - } - } + context?.let { toggleTrackingProtection(trackingEnabled, it) } launch(Dispatchers.Main) { getManagedEmitter().onNext( QuickSettingsChange.Change( diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 8e3c8246e..a4fb28fba 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -5,8 +5,8 @@ package org.mozilla.fenix.utils file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import android.content.Context +import android.content.Context.MODE_PRIVATE import android.content.SharedPreferences -import android.preference.PreferenceManager import mozilla.components.feature.sitepermissions.SitePermissionsRules import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.R @@ -21,6 +21,7 @@ class Settings private constructor(context: Context) { companion object { const val autoBounceMaximumCount = 2 + const val FENIX_PREFERENCES = "fenix_preferences" var instance: Settings? = null @@ -36,8 +37,15 @@ class Settings private constructor(context: Context) { private val appContext = context.applicationContext - private val preferences: SharedPreferences = - PreferenceManager.getDefaultSharedPreferences(context) + val preferences: SharedPreferences = + appContext.getSharedPreferences(FENIX_PREFERENCES, MODE_PRIVATE) + + val usePrivateMode: Boolean + get() = preferences.getBoolean(appContext.getPreferenceKey(R.string.pref_key_private_mode), false) + + fun setPrivateMode(newValue: Boolean) { + preferences.edit().putBoolean(appContext.getPreferenceKey(R.string.pref_key_private_mode), newValue).apply() + } val defaultSearchEngineName: String get() = preferences.getString(appContext.getPreferenceKey(R.string.pref_key_search_engine), "") ?: "" @@ -61,6 +69,13 @@ class Settings private constructor(context: Context) { false ) + fun setLightTheme(newValue: Boolean) { + preferences.edit().putBoolean( + appContext.getPreferenceKey(R.string.pref_key_light_theme), + newValue + ).apply() + } + val shouldShowVisitedSitesBookmarks: Boolean get() = preferences.getBoolean( appContext.getPreferenceKey(R.string.pref_key_show_visited_sites_bookmarks), @@ -79,12 +94,26 @@ class Settings private constructor(context: Context) { false ) + fun setFollowDeviceTheme(newValue: Boolean) { + preferences.edit().putBoolean( + appContext.getPreferenceKey(R.string.pref_key_follow_device_theme), + newValue + ).apply() + } + val shouldUseTrackingProtection: Boolean get() = preferences.getBoolean( appContext.getPreferenceKey(R.string.pref_key_tracking_protection), true ) + fun setTrackingProtection(newValue: Boolean) { + preferences.edit().putBoolean( + appContext.getPreferenceKey(R.string.pref_key_tracking_protection), + newValue + ).apply() + } + val shouldUseAutoBatteryTheme: Boolean get() = preferences.getBoolean( appContext.getPreferenceKey(R.string.pref_key_auto_battery_theme), @@ -107,8 +136,10 @@ class Settings private constructor(context: Context) { get() = (preferences.getInt(appContext.getPreferenceKey(R.string.pref_key_bounce_quick_action), 0)) fun incrementAutomaticBounceQuickActionSheetCount() { - preferences.edit().putInt(appContext.getPreferenceKey(R.string.pref_key_bounce_quick_action), - autoBounceQuickActionSheetCount + 1).apply() + preferences.edit().putInt( + appContext.getPreferenceKey(R.string.pref_key_bounce_quick_action), + autoBounceQuickActionSheetCount + 1 + ).apply() } fun setDefaultSearchEngineByName(name: String) { @@ -141,7 +172,7 @@ class Settings private constructor(context: Context) { fun getSitePermissionsPhoneFeatureMicrophoneAction(): SitePermissionsRules.Action { return preferences.getInt(appContext.getPreferenceKey(R.string.pref_key_phone_feature_microphone), 1) - .toSitePermissionsRulesAction() + .toSitePermissionsRulesAction() } fun setSitePermissionsPhoneFeatureNotificationAction(action: SitePermissionsRules.Action) { @@ -152,7 +183,7 @@ class Settings private constructor(context: Context) { fun getSitePermissionsPhoneFeatureNotificationAction(): SitePermissionsRules.Action { return preferences.getInt(appContext.getPreferenceKey(R.string.pref_key_phone_feature_notification), 1) - .toSitePermissionsRulesAction() + .toSitePermissionsRulesAction() } fun setSitePermissionsPhoneFeatureLocation(action: SitePermissionsRules.Action) { @@ -163,7 +194,7 @@ class Settings private constructor(context: Context) { fun getSitePermissionsPhoneFeatureLocation(): SitePermissionsRules.Action { return preferences.getInt(appContext.getPreferenceKey(R.string.pref_key_phone_feature_location), 1) - .toSitePermissionsRulesAction() + .toSitePermissionsRulesAction() } fun getSitePermissionsCustomSettingsRules(): SitePermissionsRules {