Skip to content

Commit 8e64aa5

Browse files
authored
Ensure RMF is not shown on app start if browser showing (#4753)
Task/Issue URL: https://app.asana.com/0/1157893581871903/1207786103010682 ### Description ### Steps to test this PR _RMF_ - [ ] checkout develop - [ ] Change RMF endpoint to https://www.jsonblob.com/api/1260259880362434560 - [ ] fresh install - [ ] complete onboarding open a site (don’t open New Tab so that RMF is not triggered) - [ ] close the app and open it again - [ ] See logs filtering by message~:"RMF|m_remote_message” - [ ] verify no pixel is sent - [ ] Open new tab - [ ] verify pixel is sent
1 parent f0f6493 commit 8e64aa5

File tree

6 files changed

+43
-2
lines changed

6 files changed

+43
-2
lines changed

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2377,6 +2377,19 @@ class BrowserTabViewModelTest {
23772377
testee.refreshCta()
23782378
assertNull(testee.ctaViewState.value!!.cta)
23792379
assertTrue(testee.ctaViewState.value!!.daxOnboardingComplete)
2380+
assertFalse(testee.ctaViewState.value!!.isBrowserShowing)
2381+
}
2382+
2383+
@Test
2384+
fun whenCtaRefreshedAndBrowserShowingThenViewStateUpdated() = runTest {
2385+
setBrowserShowing(true)
2386+
whenever(mockWidgetCapabilities.supportsAutomaticWidgetAdd).thenReturn(false)
2387+
whenever(mockWidgetCapabilities.hasInstalledWidgets).thenReturn(true)
2388+
whenever(mockDismissedCtaDao.exists(DAX_END)).thenReturn(true)
2389+
testee.refreshCta()
2390+
assertNull(testee.ctaViewState.value!!.cta)
2391+
assertTrue(testee.ctaViewState.value!!.daxOnboardingComplete)
2392+
assertTrue(testee.ctaViewState.value!!.isBrowserShowing)
23802393
}
23812394

23822395
@Test

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,10 +1148,12 @@ class BrowserTabFragment :
11481148
}
11491149

11501150
private fun showHome() {
1151+
Timber.d("New Tab: showHome")
11511152
viewModel.onHomeShown()
11521153
dismissAppLinkSnackBar()
11531154
errorSnackbar.dismiss()
11541155
newBrowserTab.newTabLayout.show()
1156+
newBrowserTab.newTabContainerLayout.show()
11551157
binding.browserLayout.gone()
11561158
webViewContainer.gone()
11571159
omnibar.appBarLayout.setExpanded(true)
@@ -1162,7 +1164,9 @@ class BrowserTabFragment :
11621164
}
11631165

11641166
private fun showBrowser() {
1167+
Timber.d("New Tab: showBrowser")
11651168
newBrowserTab.newTabLayout.gone()
1169+
newBrowserTab.newTabContainerLayout.gone()
11661170
binding.browserLayout.show()
11671171
webViewContainer.show()
11681172
webView?.show()
@@ -1175,8 +1179,10 @@ class BrowserTabFragment :
11751179
errorType: WebViewErrorResponse,
11761180
url: String?,
11771181
) {
1182+
Timber.d("New Tab: showError")
11781183
webViewContainer.gone()
11791184
newBrowserTab.newTabLayout.gone()
1185+
newBrowserTab.newTabContainerLayout.gone()
11801186
sslErrorView.gone()
11811187
omnibar.appBarLayout.setExpanded(true)
11821188
omnibar.shieldIcon.isInvisible = true
@@ -1197,6 +1203,7 @@ class BrowserTabFragment :
11971203
) {
11981204
webViewContainer.gone()
11991205
newBrowserTab.newTabLayout.gone()
1206+
newBrowserTab.newTabContainerLayout.gone()
12001207
webView?.onPause()
12011208
webView?.hide()
12021209
omnibar.appBarLayout.setExpanded(true)
@@ -3819,6 +3826,10 @@ class BrowserTabFragment :
38193826
showCta(viewState.cta)
38203827
}
38213828

3829+
viewState.isBrowserShowing -> {
3830+
hideNewTab()
3831+
}
3832+
38223833
viewState.daxOnboardingComplete -> {
38233834
showNewTab()
38243835
}
@@ -3925,6 +3936,7 @@ class BrowserTabFragment :
39253936
}
39263937

39273938
private fun showNewTab() {
3939+
Timber.d("New Tab: showNewTab")
39283940
newTabPageProvider.provideNewTabPageVersion().onEach { newTabPage ->
39293941
newBrowserTab.newTabContainerLayout.addView(
39303942
newTabPage.getView(requireContext()),
@@ -3936,9 +3948,11 @@ class BrowserTabFragment :
39363948
}
39373949
.launchIn(lifecycleScope)
39383950
newBrowserTab.newTabContainerLayout.show()
3951+
newBrowserTab.newTabLayout.show()
39393952
}
39403953

39413954
private fun hideNewTab() {
3955+
Timber.d("New Tab: hideNewTab")
39423956
newBrowserTab.newTabContainerLayout.gone()
39433957
}
39443958

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2453,7 +2453,11 @@ class BrowserTabViewModel @Inject constructor(
24532453
ctaViewModel.daxDialogEndShown()
24542454
}
24552455
if (isBrowserShowing && cta != null) hasCtaBeenShownForCurrentPage.set(true)
2456-
ctaViewState.value = currentCtaViewState().copy(cta = cta, daxOnboardingComplete = isOnboardingComplete)
2456+
ctaViewState.value = currentCtaViewState().copy(
2457+
cta = cta,
2458+
daxOnboardingComplete = isOnboardingComplete,
2459+
isBrowserShowing = isBrowserShowing,
2460+
)
24572461
ctaChangedTicker.emit(System.currentTimeMillis().toString())
24582462
return cta
24592463
}

app/src/main/java/com/duckduckgo/app/browser/newtab/NewTabLegacyPageView.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,11 @@ import android.content.Context
2323
import android.content.Intent
2424
import android.text.Spanned
2525
import android.util.AttributeSet
26+
import android.view.View
2627
import android.widget.LinearLayout
2728
import androidx.core.text.toSpannable
2829
import androidx.core.view.isGone
30+
import androidx.core.view.isVisible
2931
import androidx.fragment.app.findFragment
3032
import androidx.lifecycle.ViewModelProvider
3133
import androidx.lifecycle.findViewTreeLifecycleOwner
@@ -217,6 +219,7 @@ class NewTabLegacyPageView @JvmOverloads constructor(
217219
}
218220

219221
private fun render(viewState: ViewState) {
222+
Timber.d("New Tab: render $viewState")
220223
if (viewState.message == null && viewState.favourites.isEmpty()) {
221224
homeBackgroundLogo.showLogo()
222225
} else {
@@ -344,7 +347,10 @@ class NewTabLegacyPageView @JvmOverloads constructor(
344347
message: RemoteMessage,
345348
newMessage: Boolean,
346349
) {
347-
val shouldRender = newMessage || binding.messageCta.isGone
350+
val parentVisible = (this.parent as? View)?.isVisible ?: false
351+
Timber.d("New Tab: RMF isParentVisible $parentVisible")
352+
353+
val shouldRender = parentVisible && (newMessage || binding.messageCta.isGone)
348354

349355
if (shouldRender) {
350356
binding.messageCta.setMessage(message.asMessage())

app/src/main/java/com/duckduckgo/app/browser/newtab/NewTabLegacyPageViewModel.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import kotlinx.coroutines.flow.onEach
6060
import kotlinx.coroutines.flow.receiveAsFlow
6161
import kotlinx.coroutines.launch
6262
import kotlinx.coroutines.withContext
63+
import timber.log.Timber
6364

6465
@SuppressLint("NoLifecycleObserver") // we don't observe app lifecycle
6566
@ContributesViewModel(ViewScope::class)
@@ -118,6 +119,7 @@ class NewTabLegacyPageViewModel @Inject constructor(
118119
override fun onStart(owner: LifecycleOwner) {
119120
super.onStart(owner)
120121

122+
Timber.d("New Tab: onStart")
121123
viewModelScope.launch(dispatchers.io()) {
122124
savedSitesRepository.getFavorites()
123125
.combine(hiddenIds) { favorites, hiddenIds ->
@@ -131,6 +133,7 @@ class NewTabLegacyPageViewModel @Inject constructor(
131133
}
132134
.flowOn(dispatchers.io())
133135
.onEach { snapshot ->
136+
Timber.d("New Tab: $snapshot")
134137
val newMessage = snapshot.remoteMessage?.id != lastRemoteMessageSeen?.id
135138
if (newMessage) {
136139
lastRemoteMessageSeen = snapshot.remoteMessage

app/src/main/java/com/duckduckgo/app/browser/viewstate/CtaViewState.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@ import com.duckduckgo.app.cta.ui.Cta
2121
data class CtaViewState(
2222
val cta: Cta? = null,
2323
val daxOnboardingComplete: Boolean = false,
24+
val isBrowserShowing: Boolean = true,
2425
)

0 commit comments

Comments
 (0)