Skip to content

Commit d03a97c

Browse files
authored
Feature/craig/fix overflow menu state upon navigating back home (#846)
* Ensure overflow menu state in sync when navigating back home * Fix forward navigation * Set navigation state to null when returning to empty tab state This ensures that when you navigate forwards, the state is correctly identified as having changed from the previous state. Without this, the states are compared and we conclude the state is unchanged, and the `site` is never rebuilt so remains null.
1 parent 478d13c commit d03a97c

File tree

3 files changed

+162
-5
lines changed

3 files changed

+162
-5
lines changed

app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1831,6 +1831,110 @@ class BrowserTabViewModelTest {
18311831
verify(mockPixel).fire(Pixel.PixelName.FIREPROOF_WEBSITE_UNDO)
18321832
}
18331833

1834+
@Test
1835+
fun whenUserBrowsingPressesBackThenCannotAddBookmark() {
1836+
setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false)
1837+
assertTrue(testee.onUserPressedBack())
1838+
assertFalse(browserViewState().canAddBookmarks)
1839+
}
1840+
1841+
@Test
1842+
fun whenUserBrowsingPressesBackThenCannotSharePage() {
1843+
setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false)
1844+
assertTrue(testee.onUserPressedBack())
1845+
assertFalse(browserViewState().canSharePage)
1846+
}
1847+
1848+
@Test
1849+
fun whenUserBrowsingPressesBackThenCannotReportSite() {
1850+
setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false)
1851+
assertTrue(testee.onUserPressedBack())
1852+
assertFalse(browserViewState().canReportSite)
1853+
}
1854+
1855+
@Test
1856+
fun whenUserBrowsingPressesBackThenCannotAddToHome() {
1857+
setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false)
1858+
assertTrue(testee.onUserPressedBack())
1859+
assertFalse(browserViewState().addToHomeEnabled)
1860+
}
1861+
1862+
@Test
1863+
fun whenUserBrowsingPressesBackThenCannotWhitelist() {
1864+
setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false)
1865+
assertTrue(testee.onUserPressedBack())
1866+
assertFalse(browserViewState().canWhitelist)
1867+
}
1868+
1869+
@Test
1870+
fun whenUserBrowsingPressesBackThenCannotNavigateBack() {
1871+
setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false)
1872+
assertTrue(testee.onUserPressedBack())
1873+
assertFalse(browserViewState().canGoBack)
1874+
}
1875+
1876+
@Test
1877+
fun whenUserBrowsingPressesBackThenCannotFindInPage() {
1878+
setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false)
1879+
assertTrue(testee.onUserPressedBack())
1880+
assertFalse(findInPageViewState().canFindInPage)
1881+
}
1882+
1883+
@Test
1884+
fun whenUserBrowsingPressesBackThenCanGoForward() {
1885+
setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false)
1886+
assertTrue(testee.onUserPressedBack())
1887+
assertTrue(browserViewState().canGoForward)
1888+
}
1889+
1890+
@Test
1891+
fun whenUserBrowsingPressesBackAndForwardThenCanAddBookmark() {
1892+
setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false)
1893+
testee.onUserPressedBack()
1894+
testee.onUserPressedForward()
1895+
assertTrue(browserViewState().canAddBookmarks)
1896+
}
1897+
1898+
@Test
1899+
fun whenUserBrowsingPressesBackAndForwardThenCanWhitelist() {
1900+
setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false)
1901+
testee.onUserPressedBack()
1902+
testee.onUserPressedForward()
1903+
assertTrue(browserViewState().canWhitelist)
1904+
}
1905+
1906+
@Test
1907+
fun whenUserBrowsingPressesBackAndForwardThenCanShare() {
1908+
setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false)
1909+
testee.onUserPressedBack()
1910+
testee.onUserPressedForward()
1911+
assertTrue(browserViewState().canSharePage)
1912+
}
1913+
1914+
@Test
1915+
fun whenUserBrowsingPressesBackAndForwardThenCanReportSite() {
1916+
setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false)
1917+
testee.onUserPressedBack()
1918+
testee.onUserPressedForward()
1919+
assertTrue(browserViewState().canReportSite)
1920+
}
1921+
1922+
@Test
1923+
fun whenUserBrowsingPressesBackAndForwardThenCanAddToHome() {
1924+
setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false)
1925+
testee.onUserPressedBack()
1926+
testee.onUserPressedForward()
1927+
assertTrue(browserViewState().addToHomeEnabled)
1928+
}
1929+
1930+
@Test
1931+
fun whenUserBrowsingPressesBackAndForwardThenCanFindInPage() {
1932+
setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false)
1933+
testee.onUserPressedBack()
1934+
testee.onUserPressedForward()
1935+
assertTrue(findInPageViewState().canFindInPage)
1936+
}
1937+
18341938
private inline fun <reified T : Command> assertCommandIssued(instanceAssertions: T.() -> Unit = {}) {
18351939
verify(mockCommandObserver, atLeastOnce()).onChanged(commandCaptor.capture())
18361940
val issuedCommand = commandCaptor.allValues.find { it is T }
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Copyright (c) 2020 DuckDuckGo
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.duckduckgo.app.browser
18+
19+
import com.duckduckgo.app.browser.BrowserTabViewModel.BrowserViewState
20+
import io.reactivex.annotations.CheckReturnValue
21+
22+
class BrowserStateModifier {
23+
24+
@CheckReturnValue
25+
fun copyForBrowserShowing(original: BrowserViewState): BrowserViewState {
26+
return original.copy(
27+
browserShowing = true,
28+
canWhitelist = true,
29+
canFireproofSite = true,
30+
canReportSite = true,
31+
canSharePage = true,
32+
canAddBookmarks = true,
33+
addToHomeEnabled = true
34+
)
35+
}
36+
37+
@CheckReturnValue
38+
fun copyForHomeShowing(original: BrowserViewState): BrowserViewState {
39+
return original.copy(
40+
browserShowing = false,
41+
canWhitelist = false,
42+
canFireproofSite = false,
43+
canReportSite = false,
44+
canSharePage = false,
45+
canAddBookmarks = false,
46+
addToHomeEnabled = false,
47+
canGoBack = false
48+
)
49+
}
50+
}

app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ class BrowserTabViewModel(
249249
private lateinit var tabId: String
250250
private var webNavigationState: WebNavigationState? = null
251251
private var httpsUpgraded = false
252+
private val browserStateModifier = BrowserStateModifier()
252253
private val fireproofWebsitesObserver = Observer<List<FireproofWebsiteEntity>> {
253254
browserViewState.value = currentBrowserViewState().copy(canFireproofSite = canFireproofWebsite())
254255
}
@@ -417,7 +418,8 @@ class BrowserTabViewModel(
417418

418419
fun onUserPressedForward() {
419420
if (!currentBrowserViewState().browserShowing) {
420-
browserViewState.value = currentBrowserViewState().copy(browserShowing = true)
421+
browserViewState.value = browserStateModifier.copyForBrowserShowing(currentBrowserViewState())
422+
findInPageViewState.value = currentFindInPageViewState().copy(canFindInPage = true)
421423
command.value = Refresh
422424
} else {
423425
command.value = NavigateForward
@@ -466,13 +468,14 @@ class BrowserTabViewModel(
466468
private fun navigateHome() {
467469
site = null
468470
onSiteChanged()
471+
webNavigationState = null
469472

470-
browserViewState.value = currentBrowserViewState().copy(
471-
browserShowing = false,
472-
canGoBack = false,
473-
canFireproofSite = false,
473+
val browserState = browserStateModifier.copyForHomeShowing(currentBrowserViewState()).copy(
474474
canGoForward = currentGlobalLayoutState() !is Invalidated
475475
)
476+
browserViewState.value = browserState
477+
478+
findInPageViewState.value = FindInPageViewState()
476479
omnibarViewState.value = currentOmnibarViewState().copy(omnibarText = "", shouldMoveCaretToEnd = false)
477480
loadingViewState.value = currentLoadingViewState().copy(isLoading = false)
478481

0 commit comments

Comments
 (0)