From ea6cbf35ca06e384386d45c5be09018f6a51d407 Mon Sep 17 00:00:00 2001 From: Mike Scamell Date: Thu, 14 Aug 2025 15:56:44 +0100 Subject: [PATCH 1/4] Attempt to fix animations running between dialog closing and new dialog opening It would result in some parts of the content e.g. the primary CTA button being visible when the dialog was opened and used for a new CTA type. --- .../java/com/duckduckgo/app/cta/ui/Cta.kt | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/duckduckgo/app/cta/ui/Cta.kt b/app/src/main/java/com/duckduckgo/app/cta/ui/Cta.kt index d7593d1f9403..b3858bc693e3 100644 --- a/app/src/main/java/com/duckduckgo/app/cta/ui/Cta.kt +++ b/app/src/main/java/com/duckduckgo/app/cta/ui/Cta.kt @@ -1144,6 +1144,8 @@ sealed class DaxBubbleCta( ) : Cta, ViewCta, DaxCta { var isModifiedControlOnboardingExperimentEnabled: Boolean? = null + private var buckAnimators: List = emptyList() + private var bbAnimators: List = emptyList() protected var ctaView: View? = null @@ -1326,13 +1328,13 @@ sealed class DaxBubbleCta( val afterAnimation = { daxBubbleDialogTitle.finishAnimation() dialogTextCta.finishAnimation() - placeholder?.let { placeholderImageView.fadeIn() } - primaryCta.fadeIn() - secondaryCta.fadeIn() + placeholder?.let { bbAnimators += placeholderImageView.fadeIn() } + bbAnimators += primaryCta.fadeIn() + bbAnimators += secondaryCta.fadeIn() options?.let { optionsViews.forEachIndexed { index, buttonView -> if (it.size > index) { - buttonView.fadeIn() + bbAnimators += buttonView.fadeIn() } } } @@ -1357,9 +1359,9 @@ sealed class DaxBubbleCta( } } - root.fadeIn().setStartDelay(500).withEndAction { + bbAnimators += root.fadeIn().setStartDelay(500).withEndAction { if (configuration is DaxEndCta) { - headerImage.fadeIn().withEndAction { + bbAnimators += headerImage.fadeIn().withEndAction { runTypingAnimations() } } else { @@ -1455,13 +1457,13 @@ sealed class DaxBubbleCta( val afterAnimation = { dialogTextCta.finishAnimation() - placeholder?.let { placeholderImageView.fadeIn() } - primaryCta.fadeIn() - secondaryCta.fadeIn() + placeholder?.let { buckAnimators += placeholderImageView.fadeIn() } + buckAnimators += primaryCta.fadeIn() + buckAnimators += secondaryCta.fadeIn() options?.let { optionsViews.forEachIndexed { index, buttonView -> if (it.size > index) { - buttonView.fadeIn() + buckAnimators += buttonView.fadeIn() } } } @@ -1472,8 +1474,8 @@ sealed class DaxBubbleCta( with(buckOnboardingDialogView) { animateEntrance( onAnimationEnd = { - daxDialogDismissButton.fadeIn() - daxBubbleDialogTitle.fadeIn() + buckAnimators += daxDialogDismissButton.fadeIn() + buckAnimators += daxBubbleDialogTitle.fadeIn() .withEndAction { dialogTextCta.startTypingAnimation(daxText, true) { afterAnimation() @@ -1508,17 +1510,33 @@ sealed class DaxBubbleCta( private fun clearBubbleBuckDialog(binding: IncludeOnboardingBubbleBuckDialogBinding) { binding.apply { + buckAnimators.forEach { it.cancel() } + buckAnimators = emptyList() + daxBubbleDialogTitle.text = "" + dialogTextCta.cancelAnimation() + dialogTextCta.text = "" this.daxDialogDismissButton.alpha = 0f this.primaryCta.gone() + this.primaryCta.alpha = 0f this.secondaryCta.gone() + this.secondaryCta.alpha = 0f + this.daxDialogOption1.alpha = 0f this.daxDialogOption1.gone() + this.daxDialogOption2.alpha = 0f this.daxDialogOption2.gone() + this.daxDialogOption3.alpha = 0f this.daxDialogOption3.gone() } } private fun clearBubbleBBDialog(binding: IncludeOnboardingBubbleBbDialogBinding) { binding.apply { + bbAnimators.forEach { it.cancel() } + bbAnimators = emptyList() + daxBubbleDialogTitle.cancelAnimation() + daxBubbleDialogTitle.text = "" + dialogTextCta.cancelAnimation() + dialogTextCta.text = "" primaryCta.alpha = 0f primaryCta.gone() secondaryCta.alpha = 0f From ba6dad281268c1f8e213cbe8db8778ef3ff838ad Mon Sep 17 00:00:00 2001 From: Mike Scamell Date: Thu, 14 Aug 2025 19:07:13 +0100 Subject: [PATCH 2/4] hide magnifying glass animation when dismissing or showing next dialog --- .../app/browser/BrowserTabFragment.kt | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 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 8dd60383121d..04d4fab99455 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt @@ -3174,8 +3174,10 @@ class BrowserTabFragment : daxBubbleCta.hideDaxBubbleCta(binding) hideDaxBubbleCta() if (onboardingDesignExperimentManager.isBuckEnrolledAndEnabled()) { - if (daxBubbleCta is DaxBubbleCta.DaxEndCta) { - hideBuckEndAnimation() + when (daxBubbleCta) { + is DaxBubbleCta.DaxIntroSearchOptionsCta -> hideBuckMagnifyingGlassAnimation() + is DaxBubbleCta.DaxEndCta -> hideBuckEndAnimation() + else -> Unit } } renderer.showNewTab() @@ -4520,12 +4522,15 @@ class BrowserTabFragment : } if (onboardingDesignExperimentManager.isBuckEnrolledAndEnabled()) { - if (configuration is DaxIntroVisitSiteOptionsCta && context?.resources?.getBoolean(R.bool.show_wing_animation) == true) { - lifecycleScope.launch { - with(newBrowserTab.wingAnimation) { - delay(2.5.seconds) - show() - playAnimation() + if (configuration is DaxIntroVisitSiteOptionsCta) { + hideBuckMagnifyingGlassAnimation() + if (context?.resources?.getBoolean(R.bool.show_wing_animation) == true) { + lifecycleScope.launch { + with(newBrowserTab.wingAnimation) { + delay(2.5.seconds) + show() + playAnimation() + } } } } @@ -4736,6 +4741,10 @@ class BrowserTabFragment : } } + private fun hideBuckMagnifyingGlassAnimation() { + newBrowserTab.buckMagnifyingGlassAnimation.isGone = true + } + private fun hideBuckEndAnimation() { newBrowserTab.buckEndAnimation.isGone = true val backgroundColor = requireActivity().getColorFromAttr(attrColor = CommonR.attr.daxColorBackground) From 650a4bb02a2484b0040c77d08af84b63f52c0275 Mon Sep 17 00:00:00 2001 From: Mike Scamell Date: Thu, 14 Aug 2025 19:26:21 +0100 Subject: [PATCH 3/4] Only allow click actions when animation has ended for onboarding option dialog --- .../java/com/duckduckgo/app/cta/ui/Cta.kt | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/duckduckgo/app/cta/ui/Cta.kt b/app/src/main/java/com/duckduckgo/app/cta/ui/Cta.kt index b3858bc693e3..37315c2712bf 100644 --- a/app/src/main/java/com/duckduckgo/app/cta/ui/Cta.kt +++ b/app/src/main/java/com/duckduckgo/app/cta/ui/Cta.kt @@ -912,11 +912,14 @@ sealed class OnboardingDaxDialogCta( optionsViews.forEachIndexed { index, buttonView -> options[index].setOptionView(buttonView) - buttonView.animate().alpha(MAX_ALPHA).duration = DAX_DIALOG_APPEARANCE_ANIMATION - buttonView.setOnClickListener { - onSuggestedOptionClicked?.invoke(options[index], index) - wingAnimation.gone() - } + buttonView.animate().alpha(MAX_ALPHA) + .setDuration(DAX_DIALOG_APPEARANCE_ANIMATION) + .withEndAction { + buttonView.setOnClickListener { + onSuggestedOptionClicked?.invoke(options[index], index) + wingAnimation.gone() + } + } } showAndPlayWingAnimation() @@ -1004,10 +1007,13 @@ sealed class OnboardingDaxDialogCta( optionsViews.forEachIndexed { index, buttonView -> options[index].setOptionView(buttonView) - buttonView.animate().alpha(MAX_ALPHA).duration = DAX_DIALOG_APPEARANCE_ANIMATION - buttonView.setOnClickListener { - onSuggestedOptionClicked?.invoke(options[index], index) - } + buttonView.animate().alpha(MAX_ALPHA) + .setDuration(DAX_DIALOG_APPEARANCE_ANIMATION) + .withEndAction { + buttonView.setOnClickListener { + onSuggestedOptionClicked?.invoke(options[index], index) + } + } } } From a0e7453ae1551869e284124b015777838e7d1029 Mon Sep 17 00:00:00 2001 From: Mike Scamell Date: Fri, 15 Aug 2025 09:42:35 +0100 Subject: [PATCH 4/4] fix shield jumping up on BB initial screen --- .../java/com/duckduckgo/app/onboarding/ui/page/BbWelcomePage.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/BbWelcomePage.kt b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/BbWelcomePage.kt index f2f760cf6152..4946ff1094dd 100644 --- a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/BbWelcomePage.kt +++ b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/BbWelcomePage.kt @@ -273,6 +273,7 @@ class BbWelcomePage : OnboardingPageFragment(R.layout.content_onboarding_welcome } val titleText = getString(R.string.highlightsPreOnboardingDaxDialog1TitleBb) + binding.daxDialogCta.initial.dialogTitleInvisible.text = titleText afterTypingAnimation = { binding.daxDialogCta.initial.dialogTitle.finishAnimation()