Add the password import step UI to the onboarding - #9623
Conversation
Adds the onboarding cards for the password import experiment: the prompt card, and the outcome card with its parsing, finished and failed states. The step indicator gains a CONTINUES_PREVIOUS mode so the prompt and outcome cards read as one product step. The import flow itself is not wired up yet: the launch step is a no-op with a TODO, and the outcome card stays on its parsing state until the follow-up lands. Task: https://app.asana.com/1/137249556945/project/72649045549333/task/1216462243759588 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> # Conflicts: # app/src/main/java/com/duckduckgo/app/onboarding/orchestrator/NewUserOnboardingEvent.kt # app/src/main/java/com/duckduckgo/app/onboarding/orchestrator/NewUserOnboardingPlanProvider.kt # app/src/main/java/com/duckduckgo/app/onboarding/ui/page/BrandDesignUpdatePageViewModel.kt # app/src/main/java/com/duckduckgo/app/onboarding/ui/page/configdriven/ContentConfig.kt # app/src/main/java/com/duckduckgo/app/onboarding/ui/page/configdriven/DialogConfigResolver.kt # app/src/main/java/com/duckduckgo/app/onboarding/ui/page/configdriven/OnboardingDialogShownPixels.kt # app/src/main/res/layout/pre_onboarding_dax_dialog_cta_brand_design_update.xml # app/src/test/java/com/duckduckgo/app/onboarding/orchestrator/NewUserOnboardingPlanProviderTest.kt
This stack of pull requests is managed by Graphite. Learn more about stacking. |
| // TODO: launch the Google password import flow and report its outcome back as | ||
| // PasswordImportWebFlowFinished / PasswordImportParsed. Until that lands, this step has no | ||
| // side effect and the outcome card stays on its parsing state. | ||
| } |
There was a problem hiding this comment.
Import CTA leaves onboarding stuck
High Severity
Tapping Import advances to ImportPasswordsLaunch, but handleCommandOnlyDialog does nothing for that step. The prior Import card stays on screen while its CTAs now target the launch step, which ignores PasswordImportRequested / PasswordImportSkipped, so the user cannot proceed or skip. The same trap applies for ERROR → Stay once a real web flow exists.
Please tell me if this was useful or not with a 👍 or 👎.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit b51ba9c. Configure here.
There was a problem hiding this comment.
Will be added later in a future PR, not a real issue
…rt-step # Conflicts: # app/src/main/java/com/duckduckgo/app/onboarding/orchestrator/NewUserOnboardingEvent.kt # app/src/main/java/com/duckduckgo/app/onboarding/orchestrator/NewUserOnboardingPlanProvider.kt # app/src/main/java/com/duckduckgo/app/onboarding/ui/page/configdriven/ContentConfig.kt # app/src/main/java/com/duckduckgo/app/onboarding/ui/page/configdriven/DialogConfigResolver.kt # app/src/main/java/com/duckduckgo/app/onboarding/ui/page/configdriven/OnboardingDialogShownPixels.kt # app/src/main/java/com/duckduckgo/app/onboarding/ui/page/configdriven/engine/ContentController.kt # app/src/main/res/layout/pre_onboarding_dax_dialog_cta_brand_design_update.xml # app/src/test/java/com/duckduckgo/app/onboarding/orchestrator/NewUserOnboardingPlanProviderTest.kt # app/src/test/java/com/duckduckgo/app/onboarding/ui/page/configdriven/DialogConfigResolverTest.kt
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
There are 2 total unresolved issues (including 1 from previous review).
❌ 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 20b0935. Configure here.
LukasPaczos
left a comment
There was a problem hiding this comment.
The wing is offset slightly too much towards bottom-end side of the screen on my Pixel 9 Pro. I think we should try getting it closer to the Figma design.
| Figma | Actual |
|---|---|
![]() |
![]() |
- Just a note: when we integrate the web flow, we should make sure there are the right precautions and timeouts, so that users don't get stuck on the loading state. I was
|
@LukasPaczos I updated this PR after your code review. Regarding the wing position I have followed the same approach that we have on the address bar positon step for consistency: Regarding the timeout I will add that as part of the next PR. However in that case the operation that we are waiting for it a local one, to finish saving the passwords and that should remain stuck, but will add the timeout for safety. |
|
Privacy Review task: https://app.asana.com/0/69071770703008/1218005294664889 |
…dingBackgroundAnimator.kt Co-authored-by: Łukasz Paczos <lpaczos@duckduckgo.com>






Task/Issue URL: https://app.asana.com/1/137249556945/task/1217265967787212
Tech Design URL (if applicable): https://app.asana.com/1/137249556945/project/481882893211075/task/1217143698674642
API Proposals URL(s) (if applicable): None
Description
Adds the onboarding cards for the password import experiment (UI only).
Two cards land here:
Parsing(a shimmer skeleton of the result row),Finished(the imported/skipped counts), andFailed.Supporting changes:
StepIndicatorModereplaces the previousshowsStepIndicatorboolean, addingCONTINUES_PREVIOUS. The prompt and outcome cards are two engineering steps but one product step, so they show the same "N of M" and the outcome card adds nothing to the total.StatefulDialogBinder: the import keeps counting after the web flow returns, so the card is entered immediately and shows the wait rather than parking the user on a card-less step. Its state transition is held until the entrance animations finish, so the loading state is actually seen.ContentValueStoregains a step-id-only overload so a step's content state can be seeded before that step is current.onboarding_password-import(shown/clicked/confirmed), following the onboarding instrumentation standard. Bounded enums only, no counts and no identifiers.Steps to test this PR
Apply the following patch:
Diff: fake password import onboarding flow
Prompt card
ConfigDrivenOnboardingPageViewModelchange the value ofFAKE_IMPORT_PARSE_OUTCOMEto ERROR to check the error cahseUI changes
import_passwords_phone.mp4
import_passwords_tablet.mp4
Note
Medium Risk
Touches core new-user onboarding plan ordering and step-indicator math; password data handling is UI-only here but the feature path is security-sensitive once the web import is wired.
Overview
Adds config-driven onboarding cards for importing passwords from Google when the password-import experiment is in treatment: a prompt step (Import / Skip) and a follow-on outcome card with parsing, finished (imported/skipped counts), and failed states. The linear plan wires three orchestrator steps (prompt → launch → complete); launching the real Google import web flow is still a TODO in
ConfigDrivenOnboardingPageViewModel, so the outcome card can remain on parsing until that lands.Progress indicator logic moves from
showsStepIndicatortoStepIndicatorMode(COUNTEDvsCONTINUES_PREVIOUS) so the outcome screen shares the prompt’s “N of M” without increasing the total. Plan context tracks skip/success to gate launch and complete steps; cancel from the web step usesGoBack.Design-system support for these screens: mirrored DAX bubble tail (
mirrorFractionon edge treatment and card arrow animation), right-wing embellishment, island horizon background, success icon theming, shimmer skeleton on the outcome card, and pixelonboarding_password-import(shown/clicked/confirmed).Reviewed by Cursor Bugbot for commit 0185599. Bugbot is set up for automated code reviews on this repo. Configure here.