From a58decd7087e7009ad9a9e282234f81a93bcecec Mon Sep 17 00:00:00 2001 From: Sawyer Blatz Date: Thu, 9 Jan 2020 11:28:21 -0800 Subject: [PATCH] For #6304 & #7577: Persist private mode between app launches --- .../java/org/mozilla/fenix/HomeActivity.kt | 19 ++++++------- .../browsingmode/BrowsingModeManager.kt | 3 +++ .../java/org/mozilla/fenix/utils/Settings.kt | 27 +++++++++++++++++++ app/src/main/res/values/preference_keys.xml | 2 ++ .../org/mozilla/fenix/HomeActivityTest.kt | 27 +++++++++++++++++++ 5 files changed, 67 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index 78b36fe81..71e55a605 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -54,10 +54,10 @@ import org.mozilla.fenix.library.history.HistoryFragmentDirections import org.mozilla.fenix.onboarding.FenixOnboarding import org.mozilla.fenix.perf.HotStartPerformanceMonitor import org.mozilla.fenix.search.SearchFragmentDirections -import org.mozilla.fenix.settings.about.AboutFragmentDirections import org.mozilla.fenix.settings.DefaultBrowserSettingsFragmentDirections import org.mozilla.fenix.settings.SettingsFragmentDirections import org.mozilla.fenix.settings.TrackingProtectionFragmentDirections +import org.mozilla.fenix.settings.about.AboutFragmentDirections import org.mozilla.fenix.theme.DefaultThemeManager import org.mozilla.fenix.theme.ThemeManager import org.mozilla.fenix.utils.BrowsersCache @@ -88,13 +88,10 @@ open class HomeActivity : LocaleAwareAppCompatActivity() { final override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val mode = getPrivateModeFromIntent(intent) - components.publicSuffixList.prefetch() - setupThemeAndBrowsingMode(mode) + setupThemeAndBrowsingMode(getModeFromIntentOrLastKnown(intent)) setContentView(R.layout.activity_home) - setupToolbarAndNavigation() if (intent.getBooleanExtra(EXTRA_FINISH_ONBOARDING, false)) { @@ -159,7 +156,7 @@ open class HomeActivity : LocaleAwareAppCompatActivity() { val intentProcessors = listOf(CrashReporterIntentProcessor()) + externalSourceIntentProcessors intentProcessors.any { it.process(intent, navHost.navController, this.intent) } - browsingModeManager.mode = getPrivateModeFromIntent(intent) + browsingModeManager.mode = getModeFromIntentOrLastKnown(intent) } /** @@ -200,21 +197,21 @@ open class HomeActivity : LocaleAwareAppCompatActivity() { /** * External sources such as 3rd party links and shortcuts use this function to enter - * private mode directly before the content view is created. + * private mode directly before the content view is created. Returns the mode set by the intent + * otherwise falls back to the last known mode. */ - private fun getPrivateModeFromIntent(intent: Intent?): BrowsingMode { + internal fun getModeFromIntentOrLastKnown(intent: Intent?): BrowsingMode { intent?.toSafeIntent()?.let { if (it.hasExtra(PRIVATE_BROWSING_MODE)) { val startPrivateMode = it.getBooleanExtra(PRIVATE_BROWSING_MODE, false) - intent.removeExtra(PRIVATE_BROWSING_MODE) - return BrowsingMode.fromBoolean(isPrivate = startPrivateMode) } } - return BrowsingMode.Normal + return settings().lastKnownMode } private fun setupThemeAndBrowsingMode(mode: BrowsingMode) { + settings().lastKnownMode = mode browsingModeManager = createBrowsingModeManager(mode) themeManager = createThemeManager() themeManager.setActivityTheme(this) diff --git a/app/src/main/java/org/mozilla/fenix/browser/browsingmode/BrowsingModeManager.kt b/app/src/main/java/org/mozilla/fenix/browser/browsingmode/BrowsingModeManager.kt index 6d7462b08..cfe32f6f3 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/browsingmode/BrowsingModeManager.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/browsingmode/BrowsingModeManager.kt @@ -4,6 +4,8 @@ package org.mozilla.fenix.browser.browsingmode +import org.mozilla.fenix.utils.Settings + /** * Enum that represents whether or not private browsing is active. */ @@ -42,5 +44,6 @@ class DefaultBrowsingModeManager( set(value) { _mode = value modeDidChange(value) + Settings.instance?.lastKnownMode = value } } 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 5d74a505a..bfb634a85 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -24,6 +24,7 @@ import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.Config import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.R +import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.MozillaProductDetector import org.mozilla.fenix.ext.components @@ -209,6 +210,32 @@ class Settings private constructor( return touchExplorationIsEnabled || switchServiceIsEnabled } + var lastKnownMode: BrowsingMode = BrowsingMode.Normal + get() { + val lastKnownModeWasPrivate = preferences.getBoolean( + appContext.getPreferenceKey(R.string.pref_key_last_known_mode_private), + false + ) + + return if (lastKnownModeWasPrivate) { + BrowsingMode.Private + } else { + BrowsingMode.Normal + } + } + + set(value) { + val lastKnownModeWasPrivate = (value == BrowsingMode.Private) + + preferences.edit() + .putBoolean( + appContext.getPreferenceKey(R.string.pref_key_last_known_mode_private), + lastKnownModeWasPrivate) + .apply() + + field = value + } + var shouldDeleteBrowsingDataOnQuit by booleanPreference( appContext.getPreferenceKey(R.string.pref_key_delete_browsing_data_on_quit), default = false diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index 2e62e0729..a762b8534 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -26,6 +26,8 @@ pref_key_delete_caches_on_quit pref_key_delete_permissions_on_quit pref_key_delete_browsing_data_on_quit_categories + pref_key_last_known_mode_private + pref_key_last_maintenance pref_key_help diff --git a/app/src/test/java/org/mozilla/fenix/HomeActivityTest.kt b/app/src/test/java/org/mozilla/fenix/HomeActivityTest.kt index bc5e80488..b1069493c 100644 --- a/app/src/test/java/org/mozilla/fenix/HomeActivityTest.kt +++ b/app/src/test/java/org/mozilla/fenix/HomeActivityTest.kt @@ -5,12 +5,17 @@ package org.mozilla.fenix import android.content.Intent +import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.utils.toSafeIntent import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotEquals import org.junit.Assert.assertNull import org.junit.Test import org.junit.runner.RunWith +import org.mozilla.fenix.HomeActivity.Companion.PRIVATE_BROWSING_MODE +import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.components.metrics.Event +import org.mozilla.fenix.ext.settings import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config @@ -33,4 +38,26 @@ class HomeActivityTest { val otherIntent = Intent().toSafeIntent() assertNull(activity.getIntentSource(otherIntent)) } + + @Test + fun `getModeFromIntentOrLastKnown returns mode from settings when intent does not set`() { + val activity = HomeActivity() + + testContext.settings().lastKnownMode = BrowsingMode.Private + + assertEquals(testContext.settings().lastKnownMode, activity.getModeFromIntentOrLastKnown(null)) + } + + @Test + fun `getModeFromIntentOrLastKnown returns mode from intent when set`() { + val activity = HomeActivity() + + testContext.settings().lastKnownMode = BrowsingMode.Normal + + val intent = Intent() + intent.putExtra(PRIVATE_BROWSING_MODE, true) + + assertNotEquals(testContext.settings().lastKnownMode, activity.getModeFromIntentOrLastKnown(intent)) + assertEquals(BrowsingMode.Private, activity.getModeFromIntentOrLastKnown(intent)) + } }