Skip to content

Custom Duck.ai Onboarding - intro animation#8621

Open
LukasPaczos wants to merge 25 commits into
developfrom
feature/lpaczos/custom-ai-onboarding/welcome-anim
Open

Custom Duck.ai Onboarding - intro animation#8621
LukasPaczos wants to merge 25 commits into
developfrom
feature/lpaczos/custom-ai-onboarding/welcome-anim

Conversation

@LukasPaczos
Copy link
Copy Markdown
Contributor

@LukasPaczos LukasPaczos commented May 19, 2026

Task/Issue URL: https://app.asana.com/1/137249556945/project/1208671518894266/task/1214496516674986?focus=true

Description

Adds Duck.ai animation intro that will later be hooked into a custom onboarding flow. Currently unreachable.

Steps to test this PR

  • Apply below diff.
diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingViewModel.kt b/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingViewModel.kt
index 7af5d39826..1b8560d246 100644
--- a/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingViewModel.kt
+++ b/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingViewModel.kt
@@ -54,7 +54,8 @@ class OnboardingViewModel @Inject constructor(
     val viewState = _viewState.asStateFlow()
 
     fun initializePages() {
-        pageLayoutManager.buildPageBlueprints()
+        // pageLayoutManager.buildPageBlueprints()
+        pageLayoutManager.buildBrandDesignUpdatePageBlueprints()
     }
 
     fun pageCount(): Int {
@@ -100,6 +101,7 @@ class OnboardingViewModel @Inject constructor(
     }
 
     fun initializeOnboardingSkipper() {
+        return
         if (!appBuildConfig.canSkipOnboarding) return
 
         // delay showing skip button until privacy config downloaded
diff --git a/app/src/main/java/com/duckduckgo/app/onboardingbranddesignupdate/OnboardingBrandDesignUpdateToggles.kt b/app/src/main/java/com/duckduckgo/app/onboardingbranddesignupdate/OnboardingBrandDesignUpdateToggles.kt
index d0ad527e58..0798d3f69a 100644
--- a/app/src/main/java/com/duckduckgo/app/onboardingbranddesignupdate/OnboardingBrandDesignUpdateToggles.kt
+++ b/app/src/main/java/com/duckduckgo/app/onboardingbranddesignupdate/OnboardingBrandDesignUpdateToggles.kt
@@ -34,13 +34,13 @@ interface OnboardingBrandDesignUpdateToggles {
      * Main toggle for the onboarding brand design update feature.
      * Default value: false (disabled).
      */
-    @Toggle.DefaultValue(DefaultFeatureValue.FALSE)
+    @Toggle.DefaultValue(DefaultFeatureValue.TRUE)
     fun self(): Toggle
 
     /**
      * Toggle for the brand design update variant.
      * Default value: false (disabled).
      */
-    @Toggle.DefaultValue(DefaultFeatureValue.FALSE)
+    @Toggle.DefaultValue(DefaultFeatureValue.TRUE)
     fun brandDesignUpdate(): Toggle
 }
  • Clean install the app.
  • Verify there's no '+ Duck.ai' subtitle when the intro animation plays.
  • Apply below diff:
diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/CustomDuckAiOnboardingFeature.kt b/app/src/main/java/com/duckduckgo/app/onboarding/CustomDuckAiOnboardingFeature.kt
index 2d24ef7e18..a4ea1d4572 100644
--- a/app/src/main/java/com/duckduckgo/app/onboarding/CustomDuckAiOnboardingFeature.kt
+++ b/app/src/main/java/com/duckduckgo/app/onboarding/CustomDuckAiOnboardingFeature.kt
@@ -30,6 +30,6 @@ interface CustomDuckAiOnboardingFeature {
     @Toggle.DefaultValue(DefaultFeatureValue.FALSE)
     fun self(): Toggle
 
-    @Toggle.DefaultValue(DefaultFeatureValue.FALSE)
+    @Toggle.DefaultValue(DefaultFeatureValue.TRUE)
     fun introAnimation(): Toggle
 }
  • Clean install the app.

  • Verify that after title transition settles, a '+ Duck.ai' subtitle follows.

  • Verify that after 2 seconds a notification permission pop-up shows.

  • Force-close the app.

  • Change the theme.

  • Relaunch the app.

  • Verify '+ Duck.ai' correctly changes the color to match the theme.

  • Force-close the app.

  • Rotate device to landscape.

  • Relaunch the app.

  • Verify '+ Duck.ai' renders with an appropriate size.

  • Force-close the app.

  • Increase the device's font size.

  • Relaunch the app.

  • Verify '+ Duck.ai' scales with the font size.

  • Force-close the app.

  • If possible, try above steps on a tablet as well.

UI changes

Before After
Screenshot_20260519_155354 image
onboarding-intro-duckai-anim-no-string.mp4

Note

Medium Risk
Updates the onboarding welcome animation sequence and timing (including when notification permission is requested) behind a new remote toggle, which could impact first-run UX if misconfigured. Changes are isolated to onboarding UI/resources with no security-sensitive logic.

Overview
Adds a new remote-config feature customDuckAiOnboarding with an introAnimation toggle (default off) to control whether a Duck.ai subtitle animation is shown during onboarding.

When enabled, the Brand Design Update welcome page now plays an additional Lottie “+ Duck.ai” intro after the title settles, themes its font/color dynamically, includes it in outro/snap states, and cleans it up on view teardown. Layouts (phone/landscape/tablet) and a new raw Lottie JSON resource are updated accordingly, and the view model/test are extended to fetch and expose the toggle state.

Reviewed by Cursor Bugbot for commit 8a15d13. Bugbot is set up for automated code reviews on this repo. Configure here.

@LukasPaczos LukasPaczos force-pushed the feature/lpaczos/custom-ai-onboarding/welcome-anim branch from 214fb7a to 2b08444 Compare May 19, 2026 14:55
@LukasPaczos LukasPaczos marked this pull request as draft May 19, 2026 16:29
Drops translatable 'with' string in favor of the Generic Lottie variant,
which uses a '+' connector that needs no localization. Avoids the
overlap/clipping edge cases that plagued the centered translated text.
@LukasPaczos LukasPaczos marked this pull request as ready for review May 19, 2026 17:20
@LukasPaczos
Copy link
Copy Markdown
Contributor Author

bugbot run

Copy link
Copy Markdown
Contributor

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c57199a. Configure here.

doOnEnd from androidx.core.animation fires on both natural end and
cancel. On fragment teardown, introAnimatorSet?.cancel() was running
the post-intro block, briefly preparing and starting the Duck.ai
Lottie before cleanup tore it back down. Switch to an
AnimatorListenerAdapter that tracks cancel and skips the follow-up.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants