diff --git a/app/src/androidTest/java/com/duckduckgo/app/browser/omnibar/animations/LottiePrivacyShieldAnimationHelperTest.kt b/app/src/androidTest/java/com/duckduckgo/app/browser/omnibar/animations/LottiePrivacyShieldAnimationHelperTest.kt index f3a34a726bea..43c26d07def0 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/browser/omnibar/animations/LottiePrivacyShieldAnimationHelperTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/browser/omnibar/animations/LottiePrivacyShieldAnimationHelperTest.kt @@ -23,7 +23,11 @@ import com.duckduckgo.app.browser.senseofprotection.SenseOfProtectionExperiment import com.duckduckgo.app.global.model.PrivacyShield.MALICIOUS import com.duckduckgo.app.global.model.PrivacyShield.PROTECTED import com.duckduckgo.app.global.model.PrivacyShield.UNPROTECTED +import com.duckduckgo.common.ui.experiments.visual.store.VisualDesignExperimentDataStore +import com.duckduckgo.common.ui.experiments.visual.store.VisualDesignExperimentDataStore.FeatureState import com.duckduckgo.common.ui.store.AppTheme +import kotlinx.coroutines.flow.MutableStateFlow +import org.junit.Before import org.junit.Test import org.mockito.kotlin.mock import org.mockito.kotlin.verify @@ -32,13 +36,25 @@ import org.mockito.kotlin.whenever class LottiePrivacyShieldAnimationHelperTest { private val senseOfProtectionExperiment: SenseOfProtectionExperiment = mock() + private val visualDesignExperimentDataStore: VisualDesignExperimentDataStore = mock() + private val enabledVisualExperimentStateFlow = MutableStateFlow(FeatureState(isAvailable = true, isEnabled = true)) + private val disabledVisualExperimentStateFlow = MutableStateFlow(FeatureState(isAvailable = false, isEnabled = false)) + + @Before + fun setup() { + whenever(visualDesignExperimentDataStore.experimentState).thenReturn( + disabledVisualExperimentStateFlow, + ) + } @Test fun whenLightModeAndPrivacyShieldProtectedThenSetLightShieldAnimation() { + whenever(senseOfProtectionExperiment.shouldShowNewPrivacyShield()).thenReturn(false) + val holder: LottieAnimationView = mock() val appTheme: AppTheme = mock() whenever(appTheme.isLightModeEnabled()).thenReturn(true) - val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment) + val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment, visualDesignExperimentDataStore) testee.setAnimationView(holder, PROTECTED) @@ -47,10 +63,12 @@ class LottiePrivacyShieldAnimationHelperTest { @Test fun whenDarkModeAndPrivacyShieldProtectedThenSetDarkShieldAnimation() { + whenever(senseOfProtectionExperiment.shouldShowNewPrivacyShield()).thenReturn(false) + val holder: LottieAnimationView = mock() val appTheme: AppTheme = mock() whenever(appTheme.isLightModeEnabled()).thenReturn(false) - val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment) + val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment, visualDesignExperimentDataStore) testee.setAnimationView(holder, PROTECTED) @@ -59,10 +77,12 @@ class LottiePrivacyShieldAnimationHelperTest { @Test fun whenLightModeAndPrivacyShieldUnProtectedThenUseLightAnimation() { + whenever(senseOfProtectionExperiment.shouldShowNewPrivacyShield()).thenReturn(false) + val holder: LottieAnimationView = mock() val appTheme: AppTheme = mock() whenever(appTheme.isLightModeEnabled()).thenReturn(true) - val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment) + val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment, visualDesignExperimentDataStore) testee.setAnimationView(holder, UNPROTECTED) @@ -72,10 +92,12 @@ class LottiePrivacyShieldAnimationHelperTest { @Test fun whenDarkModeAndPrivacyShieldUnProtectedThenUseDarkAnimation() { + whenever(senseOfProtectionExperiment.shouldShowNewPrivacyShield()).thenReturn(false) + val holder: LottieAnimationView = mock() val appTheme: AppTheme = mock() whenever(appTheme.isLightModeEnabled()).thenReturn(false) - val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment) + val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment, visualDesignExperimentDataStore) testee.setAnimationView(holder, UNPROTECTED) @@ -85,10 +107,12 @@ class LottiePrivacyShieldAnimationHelperTest { @Test fun whenLightModeAndPrivacyShieldMaliciousThenUseLightAnimation() { + whenever(senseOfProtectionExperiment.shouldShowNewPrivacyShield()).thenReturn(false) + val holder: LottieAnimationView = mock() val appTheme: AppTheme = mock() whenever(appTheme.isLightModeEnabled()).thenReturn(true) - val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment) + val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment, visualDesignExperimentDataStore) testee.setAnimationView(holder, MALICIOUS) @@ -98,10 +122,12 @@ class LottiePrivacyShieldAnimationHelperTest { @Test fun whenDarkModeAndPrivacyShieldMaliciousThenUseDarkAnimation() { + whenever(senseOfProtectionExperiment.shouldShowNewPrivacyShield()).thenReturn(false) + val holder: LottieAnimationView = mock() val appTheme: AppTheme = mock() whenever(appTheme.isLightModeEnabled()).thenReturn(false) - val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment) + val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment, visualDesignExperimentDataStore) testee.setAnimationView(holder, MALICIOUS) @@ -118,7 +144,7 @@ class LottiePrivacyShieldAnimationHelperTest { val appTheme: AppTheme = mock() whenever(appTheme.isLightModeEnabled()).thenReturn(true) - val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment) + val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment, visualDesignExperimentDataStore) testee.setAnimationView(holder, PROTECTED) @@ -134,7 +160,7 @@ class LottiePrivacyShieldAnimationHelperTest { val appTheme: AppTheme = mock() whenever(appTheme.isLightModeEnabled()).thenReturn(true) - val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment) + val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment, visualDesignExperimentDataStore) testee.setAnimationView(holder, UNPROTECTED) @@ -150,7 +176,7 @@ class LottiePrivacyShieldAnimationHelperTest { val appTheme: AppTheme = mock() whenever(appTheme.isLightModeEnabled()).thenReturn(false) - val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment) + val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment, visualDesignExperimentDataStore) testee.setAnimationView(holder, PROTECTED) @@ -166,7 +192,7 @@ class LottiePrivacyShieldAnimationHelperTest { val appTheme: AppTheme = mock() whenever(appTheme.isLightModeEnabled()).thenReturn(false) - val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment) + val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment, visualDesignExperimentDataStore) testee.setAnimationView(holder, UNPROTECTED) @@ -182,7 +208,102 @@ class LottiePrivacyShieldAnimationHelperTest { val appTheme: AppTheme = mock() whenever(appTheme.isLightModeEnabled()).thenReturn(true) - val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment) + val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment, visualDesignExperimentDataStore) + + testee.setAnimationView(holder, PROTECTED) + + verify(holder).setAnimation(R.raw.protected_shield) + } + + @SuppressLint("DenyListedApi") + @Test + fun whenLightModeAndProtectedAndSelfEnabledAndShouldShowNewVisualDesignShieldThenUseExperimentAssets() { + whenever(senseOfProtectionExperiment.shouldShowNewPrivacyShield()).thenReturn(false) + whenever(visualDesignExperimentDataStore.experimentState).thenReturn( + enabledVisualExperimentStateFlow, + ) + + val holder: LottieAnimationView = mock() + val appTheme: AppTheme = mock() + whenever(appTheme.isLightModeEnabled()).thenReturn(true) + + val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment, visualDesignExperimentDataStore) + + testee.setAnimationView(holder, PROTECTED) + + verify(holder).setAnimation(R.raw.protected_shield_visual_updates) + } + + @SuppressLint("DenyListedApi") + @Test + fun whenLightModeAndUnprotectedAndSelfEnabledAndShouldShowNewVisualDesignShieldThenUseExperimentAssets() { + whenever(senseOfProtectionExperiment.shouldShowNewPrivacyShield()).thenReturn(false) + whenever(visualDesignExperimentDataStore.experimentState).thenReturn( + enabledVisualExperimentStateFlow, + ) + + val holder: LottieAnimationView = mock() + val appTheme: AppTheme = mock() + whenever(appTheme.isLightModeEnabled()).thenReturn(true) + + val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment, visualDesignExperimentDataStore) + + testee.setAnimationView(holder, UNPROTECTED) + + verify(holder).setAnimation(R.raw.unprotected_shield_visual_updates) + } + + @SuppressLint("DenyListedApi") + @Test + fun whenDarkModeAndProtectedAndSelfEnabledAndShouldShowNewVisualDesignShieldThenUseExperimentAssets() { + whenever(senseOfProtectionExperiment.shouldShowNewPrivacyShield()).thenReturn(false) + whenever(visualDesignExperimentDataStore.experimentState).thenReturn( + enabledVisualExperimentStateFlow, + ) + + val holder: LottieAnimationView = mock() + val appTheme: AppTheme = mock() + whenever(appTheme.isLightModeEnabled()).thenReturn(false) + + val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment, visualDesignExperimentDataStore) + + testee.setAnimationView(holder, PROTECTED) + + verify(holder).setAnimation(R.raw.dark_protected_shield_visual_updates) + } + + @SuppressLint("DenyListedApi") + @Test + fun whenDarkModeAndUnprotectedAndSelfEnabledAndShouldShowNewVisualDesignShieldThenUseExperimentAssets() { + whenever(senseOfProtectionExperiment.shouldShowNewPrivacyShield()).thenReturn(false) + whenever(visualDesignExperimentDataStore.experimentState).thenReturn( + enabledVisualExperimentStateFlow, + ) + + val holder: LottieAnimationView = mock() + val appTheme: AppTheme = mock() + whenever(appTheme.isLightModeEnabled()).thenReturn(false) + + val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment, visualDesignExperimentDataStore) + + testee.setAnimationView(holder, UNPROTECTED) + + verify(holder).setAnimation(R.raw.dark_unprotected_shield_visual_updates) + } + + @SuppressLint("DenyListedApi") + @Test + fun whenLightModeAndProtectedAndSelfEnabledAndShouldShowNotNewVisualDesignShieldThenUseNonExperimentAssets() { + whenever(senseOfProtectionExperiment.isUserEnrolledInAVariantAndExperimentEnabled()).thenReturn(false) + whenever(visualDesignExperimentDataStore.experimentState).thenReturn( + disabledVisualExperimentStateFlow, + ) + + val holder: LottieAnimationView = mock() + val appTheme: AppTheme = mock() + whenever(appTheme.isLightModeEnabled()).thenReturn(true) + + val testee = LottiePrivacyShieldAnimationHelper(appTheme, senseOfProtectionExperiment, visualDesignExperimentDataStore) testee.setAnimationView(holder, PROTECTED) diff --git a/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayout.kt b/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayout.kt index 8c7ac66bef6c..8d6709e464d8 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayout.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayout.kt @@ -72,6 +72,7 @@ import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.Command.StartCo import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.Command.StartExperimentVariant1Animation import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.Command.StartExperimentVariant2OrVariant3Animation import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.Command.StartTrackersAnimation +import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.Command.StartVisualDesignTrackersAnimation import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.LeadingIconState.PRIVACY_SHIELD import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.ViewState import com.duckduckgo.app.browser.omnibar.animations.BrowserTrackersAnimatorHelper @@ -496,7 +497,7 @@ open class OmnibarLayout @JvmOverloads constructor( } if (viewState.leadingIconState == PRIVACY_SHIELD) { - renderPrivacyShield(viewState.privacyShield, viewState.viewMode) + renderPrivacyShield(viewState.privacyShield, viewState.viewMode, viewState.isVisualDesignExperimentEnabled) } else { lastSeenPrivacyShield = null } @@ -526,6 +527,10 @@ open class OmnibarLayout @JvmOverloads constructor( moveCaretToFront() } + is StartVisualDesignTrackersAnimation -> { + startVisualDesignTrackersAnimation(command.entities) + } + is StartExperimentVariant1Animation -> { startExperimentVariant1Animation() } @@ -549,8 +554,8 @@ open class OmnibarLayout @JvmOverloads constructor( } } - private fun renderLeadingIconState(iconState: OmnibarLayoutViewModel.LeadingIconState) { - when (iconState) { + private fun renderLeadingIconState(viewState: ViewState) { + when (viewState.leadingIconState) { OmnibarLayoutViewModel.LeadingIconState.SEARCH -> { searchIcon.show() shieldIcon.gone() @@ -561,7 +566,7 @@ open class OmnibarLayout @JvmOverloads constructor( } OmnibarLayoutViewModel.LeadingIconState.PRIVACY_SHIELD -> { - if (senseOfProtectionExperiment.shouldShowNewPrivacyShield()) { + if (shouldShowUpdatedPrivacyShield(viewState.isVisualDesignExperimentEnabled)) { shieldIcon.gone() shieldIconExperiment.show() } else { @@ -603,6 +608,10 @@ open class OmnibarLayout @JvmOverloads constructor( } } + private fun shouldShowUpdatedPrivacyShield(navigationBarEnabled: Boolean): Boolean { + return senseOfProtectionExperiment.shouldShowNewPrivacyShield() || navigationBarEnabled + } + open fun renderButtons(viewState: ViewState) { val newTransitionState = TransitionState( showClearButton = viewState.showClearButton, @@ -674,7 +683,7 @@ open class OmnibarLayout @JvmOverloads constructor( renderTabIcon(viewState) renderPulseAnimation(viewState) - renderLeadingIconState(viewState.leadingIconState) + renderLeadingIconState(viewState) renderHint(viewState) } @@ -832,6 +841,17 @@ open class OmnibarLayout @JvmOverloads constructor( ) } + private fun startVisualDesignTrackersAnimation(events: List?) { + animatorHelper.startTrackersAnimation( + context = context, + shieldAnimationView = shieldIconExperiment, + trackersAnimationView = trackersAnimation, + omnibarViews = omnibarViews(), + entities = events, + visualDesignExperimentEnabled = true, + ) + } + private fun startExperimentVariant1Animation() { if (this::animatorHelper.isInitialized) { animatorHelper.startExperimentVariant1Animation( @@ -862,11 +882,12 @@ open class OmnibarLayout @JvmOverloads constructor( private fun renderPrivacyShield( privacyShield: PrivacyShield, viewMode: ViewMode, + navigationBarEnabled: Boolean, ) { renderIfChanged(privacyShield, lastSeenPrivacyShield) { lastSeenPrivacyShield = privacyShield val shieldIconView = if (viewMode is ViewMode.Browser) { - val isExperimentEnabled = senseOfProtectionExperiment.shouldShowNewPrivacyShield() + val isExperimentEnabled = shouldShowUpdatedPrivacyShield(navigationBarEnabled) if (isExperimentEnabled) shieldIconExperiment else shieldIcon } else { customTabToolbarContainer.customTabShieldIcon diff --git a/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayoutViewModel.kt b/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayoutViewModel.kt index c6aae0c13b8d..ec69c23a133f 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayoutViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayoutViewModel.kt @@ -94,14 +94,14 @@ class OmnibarLayoutViewModel @Inject constructor( _viewState, tabRepository.flowTabs, defaultBrowserPromptsExperiment.highlightPopupMenu, - visualDesignExperimentDataStore.navigationBarState, - ) { state, tabs, highlightOverflowMenu, navigationBarState -> + visualDesignExperimentDataStore.experimentState, + ) { state, tabs, highlightOverflowMenu, visualDesignExperiment -> state.copy( shouldUpdateTabsCount = tabs.size != state.tabCount && tabs.isNotEmpty(), tabCount = tabs.size, hasUnreadTabs = tabs.firstOrNull { !it.viewed } != null, showBrowserMenuHighlight = highlightOverflowMenu, - isNavigationBarEnabled = navigationBarState.isEnabled, + isVisualDesignExperimentEnabled = visualDesignExperiment.isEnabled, ) }.flowOn(dispatcherProvider.io()).stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000L), ViewState()) @@ -134,7 +134,7 @@ class OmnibarLayoutViewModel @Inject constructor( val loadingProgress: Int = 0, val highlightPrivacyShield: HighlightableButton = HighlightableButton.Visible(enabled = false), val highlightFireButton: HighlightableButton = HighlightableButton.Visible(), - val isNavigationBarEnabled: Boolean = false, + val isVisualDesignExperimentEnabled: Boolean = false, val trackersBlocked: Int = 0, val previouslyTrackersBlocked: Int = 0, ) { @@ -146,6 +146,7 @@ class OmnibarLayoutViewModel @Inject constructor( sealed class Command { data object CancelAnimations : Command() data class StartTrackersAnimation(val entities: List?) : Command() + data class StartVisualDesignTrackersAnimation(val entities: List?) : Command() data class StartCookiesAnimation(val isCosmetic: Boolean) : Command() data object StartExperimentVariant1Animation : Command() data class StartExperimentVariant2OrVariant3Animation(val entities: List?) : Command() @@ -593,9 +594,9 @@ class OmnibarLayoutViewModel @Inject constructor( } is LaunchTrackersAnimation -> { - Timber.d("Omnibar: LaunchTrackersAnimation") if (!decoration.entities.isNullOrEmpty()) { val hasFocus = _viewState.value.hasFocus + val visualDesignExperiment = viewState.value.isVisualDesignExperimentEnabled if (!hasFocus) { _viewState.update { it.copy( @@ -614,6 +615,12 @@ class OmnibarLayoutViewModel @Inject constructor( ) } + visualDesignExperiment -> { + command.send( + Command.StartVisualDesignTrackersAnimation(decoration.entities), + ) + } + else -> { command.send(Command.StartTrackersAnimation(decoration.entities)) } diff --git a/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/BrowserLottieTrackersAnimatorHelper.kt b/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/BrowserLottieTrackersAnimatorHelper.kt index bf614fbeaeab..7454b081a4e4 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/BrowserLottieTrackersAnimatorHelper.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/BrowserLottieTrackersAnimatorHelper.kt @@ -87,6 +87,7 @@ class BrowserLottieTrackersAnimatorHelper @Inject constructor( trackersAnimationView: LottieAnimationView, omnibarViews: List, entities: List?, + visualDesignExperimentEnabled: Boolean, ) { if (isCookiesAnimationRunning) return // If cookies animation is running let it finish to avoid weird glitches with the other animations if (trackersAnimationView.isAnimating) return @@ -105,7 +106,12 @@ class BrowserLottieTrackersAnimatorHelper @Inject constructor( return } - val animationRawRes = getAnimationRawRes(logos, theme) + val animationRawRes = if (visualDesignExperimentEnabled) { + getVisualDesignAnimationRawRes(logos, theme) + } else { + getAnimationRawRes(logos, theme) + } + with(trackersAnimationView) { this.setCacheComposition(false) // ensure assets are not cached this.setAnimation(animationRawRes) @@ -456,6 +462,20 @@ class BrowserLottieTrackersAnimatorHelper @Inject constructor( } } + private fun getVisualDesignAnimationRawRes( + logos: List, + theme: AppTheme, + ): Int { + val trackers = logos.size + return when { + trackers == 1 -> if (theme.isLightModeEnabled()) R.raw.light_trackers_visual_updates else R.raw.dark_trackers_visual_updates + trackers == 2 -> if (theme.isLightModeEnabled()) R.raw.light_trackers_1_visual_updates else R.raw.dark_trackers_1_visual_updates + trackers >= 3 -> if (theme.isLightModeEnabled()) R.raw.light_trackers_2_visual_updates else R.raw.dark_trackers_2_visual_updates + // we shouldn't be here but we also don't want to crash so we'll show the default + else -> if (theme.isLightModeEnabled()) R.raw.light_trackers_visual_updates else R.raw.dark_trackers_visual_updates + } + } + private fun getLogos( context: Context, entities: List, diff --git a/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/BrowserTrackersAnimatorHelper.kt b/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/BrowserTrackersAnimatorHelper.kt index b88f35ee5d7f..edcbda8c2a9d 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/BrowserTrackersAnimatorHelper.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/BrowserTrackersAnimatorHelper.kt @@ -35,6 +35,7 @@ interface BrowserTrackersAnimatorHelper { * @param trackersAnimationView holder of the trackers animations. * @param omnibarViews are the views that should be hidden while the animation is running * @param entities are the tracker entities detected on the current site + * @param visualDesignExperimentEnabled if the visual design experiment is enabled */ fun startTrackersAnimation( context: Context, @@ -42,6 +43,7 @@ interface BrowserTrackersAnimatorHelper { trackersAnimationView: LottieAnimationView, omnibarViews: List, entities: List?, + visualDesignExperimentEnabled: Boolean = false, ) fun startExperimentVariant1Animation( diff --git a/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/LottiePrivacyShieldAnimationHelper.kt b/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/LottiePrivacyShieldAnimationHelper.kt index 11d77d918d4f..34a1d6c7a1aa 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/LottiePrivacyShieldAnimationHelper.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/LottiePrivacyShieldAnimationHelper.kt @@ -24,6 +24,7 @@ import com.duckduckgo.app.global.model.PrivacyShield.MALICIOUS import com.duckduckgo.app.global.model.PrivacyShield.PROTECTED import com.duckduckgo.app.global.model.PrivacyShield.UNKNOWN import com.duckduckgo.app.global.model.PrivacyShield.UNPROTECTED +import com.duckduckgo.common.ui.experiments.visual.store.VisualDesignExperimentDataStore import com.duckduckgo.common.ui.store.AppTheme import com.duckduckgo.di.scopes.AppScope import com.squareup.anvil.annotations.ContributesBinding @@ -36,6 +37,7 @@ import timber.log.Timber class LottiePrivacyShieldAnimationHelper @Inject constructor( private val appTheme: AppTheme, private val senseOfProtectionExperiment: SenseOfProtectionExperiment, + private val visualDesignExperimentDataStore: VisualDesignExperimentDataStore, ) : PrivacyShieldAnimationHelper { override fun setAnimationView( @@ -51,6 +53,11 @@ class LottiePrivacyShieldAnimationHelper @Inject constructor( protectedShieldDark = R.raw.protected_shield_experiment unprotectedShield = R.raw.unprotected_shield_experiment unprotectedShieldDark = R.raw.unprotected_shield_experiment_dark + } else if (visualDesignExperimentDataStore.experimentState.value.isEnabled) { + protectedShield = R.raw.protected_shield_visual_updates + protectedShieldDark = R.raw.dark_protected_shield_visual_updates + unprotectedShield = R.raw.unprotected_shield_visual_updates + unprotectedShieldDark = R.raw.dark_unprotected_shield_visual_updates } else { protectedShield = R.raw.protected_shield protectedShieldDark = R.raw.dark_protected_shield diff --git a/app/src/main/res/layout/view_fade_omnibar.xml b/app/src/main/res/layout/view_fade_omnibar.xml index eb14fbf1a7c0..490195341608 100644 --- a/app/src/main/res/layout/view_fade_omnibar.xml +++ b/app/src/main/res/layout/view_fade_omnibar.xml @@ -84,6 +84,7 @@ android:id="@+id/trackersAnimation" android:layout_width="wrap_content" android:layout_height="0dp" + android:layout_marginStart="4dp" android:importantForAccessibility="no" android:paddingStart="@dimen/keyline_4" android:saveEnabled="false" @@ -103,6 +104,15 @@ app:layout_constraintStart_toStartOf="@id/omniBarContentContainer" app:layout_constraintTop_toTopOf="parent" /> + + - - - true DuckDuckGoTheme.EXPERIMENT_LIGHT -> true DuckDuckGoTheme.DARK -> false @@ -45,6 +46,8 @@ class BrowserAppTheme @Inject constructor( !isNightMode(context) } } + Log.d("Trackers", "isLightModeEnabled for ${themeDataStore.theme} $lightModeEnabled") + return lightModeEnabled } private fun isNightMode(context: Context): Boolean {