diff --git a/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt b/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt index 618f1ba0ade1..ad65bd089067 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt @@ -1831,6 +1831,110 @@ class BrowserTabViewModelTest { verify(mockPixel).fire(Pixel.PixelName.FIREPROOF_WEBSITE_UNDO) } + @Test + fun whenUserBrowsingPressesBackThenCannotAddBookmark() { + setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false) + assertTrue(testee.onUserPressedBack()) + assertFalse(browserViewState().canAddBookmarks) + } + + @Test + fun whenUserBrowsingPressesBackThenCannotSharePage() { + setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false) + assertTrue(testee.onUserPressedBack()) + assertFalse(browserViewState().canSharePage) + } + + @Test + fun whenUserBrowsingPressesBackThenCannotReportSite() { + setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false) + assertTrue(testee.onUserPressedBack()) + assertFalse(browserViewState().canReportSite) + } + + @Test + fun whenUserBrowsingPressesBackThenCannotAddToHome() { + setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false) + assertTrue(testee.onUserPressedBack()) + assertFalse(browserViewState().addToHomeEnabled) + } + + @Test + fun whenUserBrowsingPressesBackThenCannotWhitelist() { + setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false) + assertTrue(testee.onUserPressedBack()) + assertFalse(browserViewState().canWhitelist) + } + + @Test + fun whenUserBrowsingPressesBackThenCannotNavigateBack() { + setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false) + assertTrue(testee.onUserPressedBack()) + assertFalse(browserViewState().canGoBack) + } + + @Test + fun whenUserBrowsingPressesBackThenCannotFindInPage() { + setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false) + assertTrue(testee.onUserPressedBack()) + assertFalse(findInPageViewState().canFindInPage) + } + + @Test + fun whenUserBrowsingPressesBackThenCanGoForward() { + setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false) + assertTrue(testee.onUserPressedBack()) + assertTrue(browserViewState().canGoForward) + } + + @Test + fun whenUserBrowsingPressesBackAndForwardThenCanAddBookmark() { + setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false) + testee.onUserPressedBack() + testee.onUserPressedForward() + assertTrue(browserViewState().canAddBookmarks) + } + + @Test + fun whenUserBrowsingPressesBackAndForwardThenCanWhitelist() { + setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false) + testee.onUserPressedBack() + testee.onUserPressedForward() + assertTrue(browserViewState().canWhitelist) + } + + @Test + fun whenUserBrowsingPressesBackAndForwardThenCanShare() { + setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false) + testee.onUserPressedBack() + testee.onUserPressedForward() + assertTrue(browserViewState().canSharePage) + } + + @Test + fun whenUserBrowsingPressesBackAndForwardThenCanReportSite() { + setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false) + testee.onUserPressedBack() + testee.onUserPressedForward() + assertTrue(browserViewState().canReportSite) + } + + @Test + fun whenUserBrowsingPressesBackAndForwardThenCanAddToHome() { + setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false) + testee.onUserPressedBack() + testee.onUserPressedForward() + assertTrue(browserViewState().addToHomeEnabled) + } + + @Test + fun whenUserBrowsingPressesBackAndForwardThenCanFindInPage() { + setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false) + testee.onUserPressedBack() + testee.onUserPressedForward() + assertTrue(findInPageViewState().canFindInPage) + } + private inline fun assertCommandIssued(instanceAssertions: T.() -> Unit = {}) { verify(mockCommandObserver, atLeastOnce()).onChanged(commandCaptor.capture()) val issuedCommand = commandCaptor.allValues.find { it is T } diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserStateModifier.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserStateModifier.kt new file mode 100644 index 000000000000..8a997c782489 --- /dev/null +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserStateModifier.kt @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 DuckDuckGo + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.duckduckgo.app.browser + +import com.duckduckgo.app.browser.BrowserTabViewModel.BrowserViewState +import io.reactivex.annotations.CheckReturnValue + +class BrowserStateModifier { + + @CheckReturnValue + fun copyForBrowserShowing(original: BrowserViewState): BrowserViewState { + return original.copy( + browserShowing = true, + canWhitelist = true, + canFireproofSite = true, + canReportSite = true, + canSharePage = true, + canAddBookmarks = true, + addToHomeEnabled = true + ) + } + + @CheckReturnValue + fun copyForHomeShowing(original: BrowserViewState): BrowserViewState { + return original.copy( + browserShowing = false, + canWhitelist = false, + canFireproofSite = false, + canReportSite = false, + canSharePage = false, + canAddBookmarks = false, + addToHomeEnabled = false, + canGoBack = false + ) + } +} diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt index 23a6c14ba38b..bb83dee2ffa9 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt @@ -249,6 +249,7 @@ class BrowserTabViewModel( private lateinit var tabId: String private var webNavigationState: WebNavigationState? = null private var httpsUpgraded = false + private val browserStateModifier = BrowserStateModifier() private val fireproofWebsitesObserver = Observer> { browserViewState.value = currentBrowserViewState().copy(canFireproofSite = canFireproofWebsite()) } @@ -417,7 +418,8 @@ class BrowserTabViewModel( fun onUserPressedForward() { if (!currentBrowserViewState().browserShowing) { - browserViewState.value = currentBrowserViewState().copy(browserShowing = true) + browserViewState.value = browserStateModifier.copyForBrowserShowing(currentBrowserViewState()) + findInPageViewState.value = currentFindInPageViewState().copy(canFindInPage = true) command.value = Refresh } else { command.value = NavigateForward @@ -466,13 +468,14 @@ class BrowserTabViewModel( private fun navigateHome() { site = null onSiteChanged() + webNavigationState = null - browserViewState.value = currentBrowserViewState().copy( - browserShowing = false, - canGoBack = false, - canFireproofSite = false, + val browserState = browserStateModifier.copyForHomeShowing(currentBrowserViewState()).copy( canGoForward = currentGlobalLayoutState() !is Invalidated ) + browserViewState.value = browserState + + findInPageViewState.value = FindInPageViewState() omnibarViewState.value = currentOmnibarViewState().copy(omnibarText = "", shouldMoveCaretToEnd = false) loadingViewState.value = currentLoadingViewState().copy(isLoading = false)