diff --git a/app/src/main/java/org/mozilla/fenix/ext/BrowserState.kt b/app/src/main/java/org/mozilla/fenix/ext/BrowserState.kt index a76b802b3a..31847b13a9 100644 --- a/app/src/main/java/org/mozilla/fenix/ext/BrowserState.kt +++ b/app/src/main/java/org/mozilla/fenix/ext/BrowserState.kt @@ -19,12 +19,15 @@ import mozilla.components.feature.tabs.ext.hasMediaPlayed fun BrowserState.asRecentTabs(): List { return mutableListOf().apply { val lastOpenedNormalTab = lastOpenedNormalTab + val inProgressMediaTab = inProgressMediaTab + lastOpenedNormalTab?.let { add(it) } - inProgressMediaTab - ?.takeUnless { it == lastOpenedNormalTab } - ?.let { - add(it) - } + + if (inProgressMediaTab == lastOpenedNormalTab) { + secondToLastOpenedNormalTab?.let { add(it) } + } else { + inProgressMediaTab?.let { add(it) } + } } } @@ -35,6 +38,15 @@ fun BrowserState.asRecentTabs(): List { val BrowserState.lastOpenedNormalTab: TabSessionState? get() = selectedNormalTab ?: normalTabs.maxByOrNull { it.lastAccess } +/** + * Get the second-to-last accessed normal tab. + */ +val BrowserState.secondToLastOpenedNormalTab: TabSessionState? + get() = when { + normalTabs.size <= 1 -> null + else -> normalTabs.sortedByDescending { it.lastAccess }[1] + } + /** * Get the last tab with in progress media. */ diff --git a/app/src/test/java/org/mozilla/fenix/ext/BrowserStateTest.kt b/app/src/test/java/org/mozilla/fenix/ext/BrowserStateTest.kt index c453987db9..f8697bc1e4 100644 --- a/app/src/test/java/org/mozilla/fenix/ext/BrowserStateTest.kt +++ b/app/src/test/java/org/mozilla/fenix/ext/BrowserStateTest.kt @@ -114,7 +114,7 @@ class BrowserStateTest { } @Test - fun `GIVEN the selected tab is a private tab and the media tab is the last accessed normal tab WHEN asRecentTabs is called THEN a list of the media tab`() { + fun `GIVEN the selected tab is a private tab and the media tab is the last accessed normal tab WHEN asRecentTabs is called THEN return a list of the media tab and the second-to-last normal tab`() { val selectedPrivateTab = createTab(url = "url", id = "1", lastAccess = 1, private = true) val normalTab = createTab(url = "url2", id = "2", lastAccess = 2) val mediaTab = createTab( @@ -128,7 +128,7 @@ class BrowserStateTest { val result = browserState.asRecentTabs() - assertEquals(1, result.size) + assertEquals(2, result.size) assertEquals(mediaTab, result[0]) } @@ -168,4 +168,43 @@ class BrowserStateTest { assertEquals(normalTab1, browserState.lastOpenedNormalTab) } + + @Test + fun `GIVEN no normal tabs are open WHEN secondToLastOpenedNormalTab is called THEN return null`() { + val browserState = BrowserState( + tabs = listOf(mockk(relaxed = true)), + ) + assertNull(browserState.secondToLastOpenedNormalTab) + } + + @Test + fun `GIVEN one normal tab is open WHEN secondToLastOpenedNormalTab is called THEN return the one tab`() { + val lastAccessedNormalTab = createTab(url = "url2", id = "2", lastAccess = 1) + val browserState = BrowserState( + tabs = listOf(lastAccessedNormalTab), + ) + assertNull(browserState.secondToLastOpenedNormalTab) + } + + @Test + fun `GIVEN two normal tabs are open WHEN secondToLastOpenedNormalTab is called THEN return the second-to-last opened tab`() { + val normalTab1 = createTab(url = "url1", id = "1", lastAccess = 1) + val normalTab2 = createTab(url = "url2", id = "2", lastAccess = 2) + val browserState = BrowserState( + tabs = listOf(normalTab1, normalTab2), + ) + assertEquals(normalTab1.id, browserState.secondToLastOpenedNormalTab!!.id) + } + + @Test + fun `GIVEN four normal tabs are open WHEN secondToLastOpenedNormalTab is called THEN return the second-to-last opened tab`() { + val normalTab1 = createTab(url = "url1", id = "1", lastAccess = 1) + val normalTab2 = createTab(url = "url2", id = "2", lastAccess = 4) + val normalTab3 = createTab(url = "url3", id = "3", lastAccess = 3) + val normalTab4 = createTab(url = "url4", id = "4", lastAccess = 2) + val browserState = BrowserState( + tabs = listOf(normalTab1, normalTab2, normalTab3, normalTab4), + ) + assertEquals(normalTab3.id, browserState.secondToLastOpenedNormalTab!!.id) + } } diff --git a/app/src/test/java/org/mozilla/fenix/home/RecentTabsListFeatureTest.kt b/app/src/test/java/org/mozilla/fenix/home/RecentTabsListFeatureTest.kt index 21ea245438..8cf602d3ac 100644 --- a/app/src/test/java/org/mozilla/fenix/home/RecentTabsListFeatureTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/RecentTabsListFeatureTest.kt @@ -226,7 +226,7 @@ class RecentTabsListFeatureTest { feature.start() homeStore.waitUntilIdle() - assertEquals(1, homeStore.state.recentTabs.size) + assertEquals(2, homeStore.state.recentTabs.size) assertEquals(initialMediaTab, homeStore.state.recentTabs[0]) browserStore.dispatch(