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 4b573c374a..e29317e8e7 100644 --- a/app/src/main/java/org/mozilla/fenix/ext/BrowserState.kt +++ b/app/src/main/java/org/mozilla/fenix/ext/BrowserState.kt @@ -60,7 +60,7 @@ val BrowserState.inProgressMediaTab: TabSessionState? */ val BrowserState.lastSearchGroup: RecentTab.SearchGroup? get() { - val tabGroup = normalTabs.toSearchGroup().lastOrNull { it.tabs.count() > 1 } ?: return null + val tabGroup = normalTabs.toSearchGroup().first.lastOrNull() ?: return null val firstTab = tabGroup.tabs.firstOrNull() ?: return null return RecentTab.SearchGroup( @@ -73,9 +73,10 @@ val BrowserState.lastSearchGroup: RecentTab.SearchGroup? } /** - * Get search term groups sorted by last access time. + * Returns a pair containing a list of search term groups sorted by last access time, and "remainder" tabs that have + * search terms but should not be in groups (because the group is of size one). */ -fun List.toSearchGroup(): List { +fun List.toSearchGroup(): Pair, List> { val data = filter { it.isNormalTabActiveWithSearchTerm(maxActiveTime) }.groupBy { @@ -85,7 +86,7 @@ fun List.toSearchGroup(): List { }.lowercase() } - return data.map { mapEntry -> + val groupings = data.map { mapEntry -> val searchTerm = mapEntry.key.replaceFirstChar(Char::uppercase) val groupTabs = mapEntry.value val groupMax = groupTabs.fold(0L) { acc, tab -> @@ -97,5 +98,10 @@ fun List.toSearchGroup(): List { tabs = groupTabs, lastAccess = groupMax ) - }.sortedBy { it.lastAccess } + } + + val groups = groupings.filter { it.tabs.size > 1 }.sortedBy { it.lastAccess } + val remainderTabs = (groupings - groups).flatMap { it.tabs } + + return groups to remainderTabs } diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/ext/TabSelectors.kt b/app/src/main/java/org/mozilla/fenix/tabstray/ext/TabSelectors.kt index a1a5d3d7b0..2f68049878 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/ext/TabSelectors.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/ext/TabSelectors.kt @@ -48,11 +48,13 @@ fun BrowserState.getNormalTrayTabs( ): List { return normalTabs.run { if (searchTermTabGroupsAreEnabled && inactiveTabsEnabled) { - filter { it.isNormalTabActiveWithoutSearchTerm(maxActiveTime) } + val remainderTabs = toSearchGroup().second + filter { it.isNormalTabActiveWithoutSearchTerm(maxActiveTime) } + remainderTabs } else if (inactiveTabsEnabled) { filter { it.isNormalTabActive(maxActiveTime) } } else if (searchTermTabGroupsAreEnabled) { - filter { it.isNormalTabWithSearchTerm() } + val remainderTabs = toSearchGroup().second + filter { it.isNormalTabWithSearchTerm() } + remainderTabs } else { this } @@ -65,7 +67,7 @@ fun BrowserState.getNormalTrayTabs( fun BrowserState.getSearchTabGroups( searchTermTabGroupsAreEnabled: Boolean ): List = if (searchTermTabGroupsAreEnabled) { - normalTabs.toSearchGroup().filter { it.tabs.size > 1 } + normalTabs.toSearchGroup().first } else { emptyList() }