From 7ec6ef70bbae6d4d53c710c6e1b65b581b36fca0 Mon Sep 17 00:00:00 2001 From: catalinradoiu Date: Fri, 19 Dec 2025 17:48:08 +0200 Subject: [PATCH 1/3] Pop the fragment in the backstack when custom tab is active and the onCloseWindow window callback of the BrowserChromeClient is triggered --- .../java/com/duckduckgo/app/browser/BrowserTabFragment.kt | 8 +++++++- .../com/duckduckgo/app/browser/BrowserTabViewModel.kt | 8 ++++++-- .../java/com/duckduckgo/app/browser/commands/Command.kt | 2 ++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt index 7832aa2c72b1..d32b36725f02 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt @@ -1736,7 +1736,7 @@ class BrowserTabFragment : val wasActive = isActiveTab isActiveTab = it.tabId == tabId if (wasActive && !isActiveTab) { - logcat { "Tab $tabId is newly inactive" } + logcat(tag = "RadoiuC") { "Tab $tabId is newly inactive" } // want to ensure that we aren't offering to inject credentials from an inactive tab hideDialogWithTag(CredentialAutofillPickerDialog.TAG) @@ -2080,6 +2080,12 @@ class BrowserTabFragment : browserActivity?.launchNewTab() } + is Command.NavigateBackInCustomTab -> { + if (isActiveCustomTab() && parentFragmentManager.backStackEntryCount > 0) { + parentFragmentManager.popBackStack() + } + } + is Command.ShowSavedSiteAddedConfirmation -> savedSiteAdded(it.savedSiteChangedViewState) is Command.ShowEditSavedSiteDialog -> editSavedSite(it.savedSiteChangedViewState) is Command.DeleteFavoriteConfirmation -> 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 52e09fee3377..078c17e5d5b5 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt @@ -1317,8 +1317,12 @@ class BrowserTabViewModel @Inject constructor( } override fun closeCurrentTab() { - viewModelScope.launch { - removeCurrentTabFromRepository() + if (isCustomTabScreen) { + command.value = Command.NavigateBackInCustomTab + } else { + viewModelScope.launch { + removeCurrentTabFromRepository() + } } } diff --git a/app/src/main/java/com/duckduckgo/app/browser/commands/Command.kt b/app/src/main/java/com/duckduckgo/app/browser/commands/Command.kt index ce0b7f6e4593..261e0fed5936 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/commands/Command.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/commands/Command.kt @@ -67,6 +67,8 @@ sealed class Command { val query: String, ) : Command() + object NavigateBackInCustomTab : Command() + data object LaunchNewTab : Command() data object ResetHistory : Command() From 939032a73dcb490da5eb23ad42a8418f3279a34e Mon Sep 17 00:00:00 2001 From: catalinradoiu Date: Fri, 19 Dec 2025 17:49:47 +0200 Subject: [PATCH 2/3] Update unit tests --- .../app/browser/BrowserTabViewModelTest.kt | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) 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 52c54c53182b..b5ac2af64167 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt @@ -2924,11 +2924,27 @@ class BrowserTabViewModelTest { } @Test - fun whenCloseCurrentTabSelectedThenTabDeletedFromRepository() = + fun whenCloseCurrentTabSelectedAndNotInCustomTabThenTabDeletedFromRepository() = runTest { + testee.setIsCustomTab(false) givenOneActiveTabSelected() testee.closeCurrentTab() + verify(mockCommandObserver, atLeastOnce()).onChanged(commandCaptor.capture()) verify(mockTabRepository).deleteTabAndSelectSource(selectedTabLiveData.value!!.tabId) + val command = commandCaptor.allValues.find { it is Command.NavigateBackInCustomTab } + assertNull(command) + } + + @Test + fun whenCloseCurrentTabAndCustomTabAndCustomTabScreenEmitNavigateBackInCustomTabCommand() = + runTest { + testee.setIsCustomTab(true) + testee.closeCurrentTab() + verify(mockTabRepository, never()).deleteTabAndSelectSource(any()) + verify(mockCommandObserver, atLeastOnce()).onChanged(commandCaptor.capture()) + val command = commandCaptor.allValues.find { it is Command.NavigateBackInCustomTab } + assertNotNull(command) + assertTrue(command is Command.NavigateBackInCustomTab) } @Test From 32d48b31b556393a0f80b21618452b314e8d69bb Mon Sep 17 00:00:00 2001 From: catalinradoiu Date: Fri, 19 Dec 2025 18:09:32 +0200 Subject: [PATCH 3/3] Revert logcat change --- .../main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt index d32b36725f02..4b4f1301239e 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt @@ -1736,7 +1736,7 @@ class BrowserTabFragment : val wasActive = isActiveTab isActiveTab = it.tabId == tabId if (wasActive && !isActiveTab) { - logcat(tag = "RadoiuC") { "Tab $tabId is newly inactive" } + logcat { "Tab $tabId is newly inactive" } // want to ensure that we aren't offering to inject credentials from an inactive tab hideDialogWithTag(CredentialAutofillPickerDialog.TAG)