Commit 2257dbb8 authored by Gabriel Luong's avatar Gabriel Luong Committed by gluong@mozilla.com
Browse files

Bug 1914852 - Ensure there's always a single private homepage tab when...

Bug 1914852 - Ensure there's always a single private homepage tab when switching to private mode when Homepage as a New Tab is enabled r=android-reviewers,Roger

- Adds a new private homepage tab when there are no private tabs available when switching from normal to private mode.
- This fixes the reported issue of switching from private mode to normal mode when performing a search or loading a URL in private mode because without a selected private tab it will load it from the selected normal tab under the Hompeage as a New Tab feature. Therefore, we need to guarantee that there's a private tab to load from by ensuring there's always a private tab in private mode.

Differential Revision: https://phabricator.services.mozilla.com/D250522
parent 2adbd4a4
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ import mozilla.components.browser.state.action.MediaSessionAction
import mozilla.components.browser.state.action.SearchAction
import mozilla.components.browser.state.search.SearchEngine
import mozilla.components.browser.state.selector.getNormalOrPrivateTabs
import mozilla.components.browser.state.selector.privateTabs
import mozilla.components.browser.state.selector.selectedTab
import mozilla.components.browser.state.state.WebExtensionState
import mozilla.components.concept.engine.EngineSession
@@ -1292,6 +1293,7 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
    private fun createBrowsingModeManager(initialMode: BrowsingMode): BrowsingModeManager {
        return DefaultBrowsingModeManager(initialMode, components.settings) { newMode ->
            updateSecureWindowFlags(newMode)
            addPrivateHomepageTabIfNecessary(newMode)
            themeManager.currentTheme = newMode
        }.also {
            updateSecureWindowFlags(initialMode)
@@ -1306,6 +1308,22 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
        }
    }

    /**
     * When switching to private mode, add a private homepage tab if there are
     * no private tabs available.
     *
     * @param mode The new [BrowsingMode] that is being swapped to.
     */
    @VisibleForTesting
    internal fun addPrivateHomepageTabIfNecessary(mode: BrowsingMode) {
        if (settings().enableHomepageAsNewTab &&
            mode.isPrivate &&
            components.core.store.state.privateTabs.isEmpty()
        ) {
            components.useCases.fenixBrowserUseCases.addNewHomepageTab(private = true)
        }
    }

    private fun createThemeManager(): ThemeManager {
        return DefaultThemeManager(browsingModeManager.mode, this)
    }
+58 −0
Original line number Diff line number Diff line
@@ -12,6 +12,9 @@ import io.mockk.just
import io.mockk.mockk
import io.mockk.spyk
import io.mockk.verify
import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.state.state.createTab
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.service.pocket.PocketStoriesService
import mozilla.components.support.test.robolectric.testContext
import mozilla.components.support.utils.toSafeIntent
@@ -31,6 +34,7 @@ import org.mozilla.fenix.browser.browsingmode.BrowsingMode
import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager
import org.mozilla.fenix.components.AppStore
import org.mozilla.fenix.components.appstate.AppAction
import org.mozilla.fenix.components.usecases.FenixBrowserUseCases
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.getIntentSource
import org.mozilla.fenix.ext.settings
@@ -47,15 +51,18 @@ class HomeActivityTest {
    private lateinit var activity: HomeActivity
    private lateinit var appStore: AppStore
    private lateinit var settings: Settings
    private lateinit var fenixBrowserUseCases: FenixBrowserUseCases

    @Before
    fun setup() {
        activity = spyk(HomeActivity())
        settings = mockk(relaxed = true)
        appStore = mockk(relaxed = true)
        fenixBrowserUseCases = mockk(relaxed = true)

        every { testContext.settings() } returns settings
        every { testContext.components.appStore } returns appStore
        every { activity.components.useCases.fenixBrowserUseCases } returns fenixBrowserUseCases
    }

    private fun assertNoPromptWasShown() {
@@ -251,4 +258,55 @@ class HomeActivityTest {
        )
        assertNoPromptWasShown()
    }

    @Test
    fun `GIVEN homepage as a new tab is disabled WHEN addPrivateHomepageTabIfNecessary is called THEN do nothing`() {
        every { activity.components.settings.enableHomepageAsNewTab } returns false

        activity.addPrivateHomepageTabIfNecessary(mode = BrowsingMode.Private)

        verify(exactly = 0) {
            fenixBrowserUseCases.addNewHomepageTab(private = false)
        }

        activity.addPrivateHomepageTabIfNecessary(mode = BrowsingMode.Normal)

        verify(exactly = 0) {
            fenixBrowserUseCases.addNewHomepageTab(private = false)
        }
    }

    @Test
    fun `GIVEN homepage as a new tab is enabled and no private tabs WHEN addPrivateHomepageTabIfNecessary is called THEN add a private homepage tab`() {
        every { activity.components.settings.enableHomepageAsNewTab } returns true

        val store = BrowserStore(BrowserState())
        every { activity.components.core.store } returns store

        activity.addPrivateHomepageTabIfNecessary(mode = BrowsingMode.Private)

        verify {
            fenixBrowserUseCases.addNewHomepageTab(private = true)
        }

        activity.addPrivateHomepageTabIfNecessary(mode = BrowsingMode.Normal)

        verify(exactly = 0) {
            fenixBrowserUseCases.addNewHomepageTab(private = false)
        }
    }

    @Test
    fun `GIVEN homepage as a new tab is enabled and private tabs exist WHEN addPrivateHomepageTabIfNecessary is called THEN do nothing`() {
        every { activity.components.settings.enableHomepageAsNewTab } returns true

        val store = BrowserStore(BrowserState(tabs = listOf(createTab(url = "https://mozilla.org", private = true))))
        every { activity.components.core.store } returns store

        activity.addPrivateHomepageTabIfNecessary(mode = BrowsingMode.Private)

        verify(exactly = 0) {
            fenixBrowserUseCases.addNewHomepageTab(private = true)
        }
    }
}