Skip to content

Commit 7d3f979

Browse files
authored
fix an issue where Custom Tab URL or icon wouldn't update according to page redirects (#6091)
Task/Issue URL: https://app.asana.com/1/137249556945/project/1208671518894266/task/1210137390470561?focus=true ### Description Adds a missing change to #5829 and ensures that the domain and/or duck chat icon are updated when Custom Tab page loads and redirects. ### Steps to test this PR - [ ] Set DDG as the default browser. - [ ] Open a link from Gmail or any other source that would redirect. - [ ] Ensure that the domain is correct after the page fully loads.
1 parent 1b2c670 commit 7d3f979

File tree

2 files changed

+58
-2
lines changed

2 files changed

+58
-2
lines changed

app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayoutViewModel.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -708,7 +708,11 @@ class OmnibarLayoutViewModel @Inject constructor(
708708
if (customTabMode is CustomTab) {
709709
_viewState.update {
710710
it.copy(
711-
viewMode = customTabMode.copy(title = decoration.title),
711+
viewMode = customTabMode.copy(
712+
title = decoration.title,
713+
domain = decoration.domain,
714+
showDuckPlayerIcon = decoration.showDuckPlayerIcon,
715+
),
712716
)
713717
}
714718
}

app/src/test/java/com/duckduckgo/app/browser/omnibar/OmnibarLayoutViewModelTest.kt

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.duckduckgo.app.browser.DuckDuckGoUrlDetectorImpl
88
import com.duckduckgo.app.browser.defaultbrowsing.prompts.DefaultBrowserPromptsExperiment
99
import com.duckduckgo.app.browser.omnibar.Omnibar.ViewMode
1010
import com.duckduckgo.app.browser.omnibar.OmnibarLayout.Decoration
11+
import com.duckduckgo.app.browser.omnibar.OmnibarLayout.Decoration.ChangeCustomTabTitle
1112
import com.duckduckgo.app.browser.omnibar.OmnibarLayout.StateChange
1213
import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.Command
1314
import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.LeadingIconState
@@ -298,16 +299,67 @@ class OmnibarLayoutViewModelTest {
298299

299300
@Test
300301
fun whenViewModeChangedToCustomTabThenViewStateCorrect() = runTest {
301-
testee.onViewModeChanged(ViewMode.CustomTab(0, "example", "example.com", false))
302+
val expectedToolbarColor = 100
303+
val expectedTitle = "example"
304+
val expectedDomain = "example.com"
305+
val expectedShowDuckPlayerIcon = false
306+
testee.onViewModeChanged(
307+
ViewMode.CustomTab(
308+
toolbarColor = expectedToolbarColor,
309+
title = expectedTitle,
310+
domain = expectedDomain,
311+
showDuckPlayerIcon = expectedShowDuckPlayerIcon,
312+
),
313+
)
302314

303315
testee.viewState.test {
304316
val viewState = awaitItem()
317+
assertFalse(viewState.showClearButton)
318+
assertFalse(viewState.showVoiceSearch)
319+
assertFalse(viewState.showTabsMenu)
320+
assertFalse(viewState.showFireIcon)
321+
assertTrue(viewState.showBrowserMenu)
322+
305323
assertTrue(viewState.viewMode is ViewMode.CustomTab)
324+
val customTabMode = viewState.viewMode as ViewMode.CustomTab
325+
assertEquals(expectedToolbarColor, customTabMode.toolbarColor)
326+
assertEquals(expectedTitle, customTabMode.title)
327+
assertEquals(expectedDomain, customTabMode.domain)
328+
assertEquals(expectedShowDuckPlayerIcon, customTabMode.showDuckPlayerIcon)
329+
}
330+
}
331+
332+
@Test
333+
fun `when custom tab title updates, update view mode state`() = runTest {
334+
val expectedTitle = "newTitle"
335+
val expectedDomain = "newDomain"
336+
val expectedShowDuckPlayerIcon = true
337+
val decoration = ChangeCustomTabTitle(
338+
title = expectedTitle,
339+
domain = expectedDomain,
340+
showDuckPlayerIcon = expectedShowDuckPlayerIcon,
341+
)
342+
343+
testee.onViewModeChanged(ViewMode.CustomTab(100, "example", "example.com", showDuckPlayerIcon = false))
344+
testee.viewState.test {
345+
// skipping initial update
346+
skipItems(1)
347+
// this function needs to be called only when the flow is consumed,
348+
// otherwise, the values are not produced and the internal check for custom tab state fails
349+
testee.onCustomTabTitleUpdate(decoration)
350+
val viewState = awaitItem()
306351
assertFalse(viewState.showClearButton)
307352
assertFalse(viewState.showVoiceSearch)
308353
assertFalse(viewState.showTabsMenu)
309354
assertFalse(viewState.showFireIcon)
310355
assertTrue(viewState.showBrowserMenu)
356+
357+
assertTrue(viewState.viewMode is ViewMode.CustomTab)
358+
val customTabMode = viewState.viewMode as ViewMode.CustomTab
359+
assertEquals(100, customTabMode.toolbarColor)
360+
assertEquals(expectedTitle, customTabMode.title)
361+
assertEquals(expectedDomain, customTabMode.domain)
362+
assertEquals(expectedShowDuckPlayerIcon, customTabMode.showDuckPlayerIcon)
311363
}
312364
}
313365

0 commit comments

Comments
 (0)