[Config-driven linear onboarding dialogs] Port existing screens (forward flows) - #9403
Open
LukasPaczos wants to merge 19 commits into
Open
Conversation
LukasPaczos
force-pushed
the
refactor/lpaczos/config-driven-linear-onboarding-dialogs/welcome-input-screens
branch
from
August 5, 2026 15:02
4faa9d3 to
a359793
Compare
Contributor
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ 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 0b0f84a. Configure here.
Base automatically changed from
refactor/lpaczos/config-driven-linear-onboarding-dialogs/intro-animation
to
develop
August 6, 2026 11:14
(cherry picked from commit 34ac2da)
(cherry picked from commit e80e687)
…rFade (cherry picked from commit 3e54b8d)
(cherry picked from commit b67a2bf)
(cherry picked from commit ab48745)
(cherry picked from commit 6e4f299)
The welcome, sync restore and input screens render their own cards now, so the unrendered-dialog fallback must not keep skipping them. Only add to dock, the widget prompt and quick setup still need advancing past.
The binder's mode-toggle preselect duplicated what applyMode already does. The pixels test now also pins that quick setup fires nothing.
A dialog whose card entry follows the background waits EXIT_DURATION before starting its one-time reveal, so it no longer fades in over a background that is still crossing over. A snapped background has nothing to wait for, so the delay is gated on the background actually animating. (cherry picked from commit f2d7a72)
The initial, reinstall, and sync-restore dialogs are the ones that can arrive while the intro visuals are still on screen, and they share one config builder. (cherry picked from commit 8590f0d)
The input screen preview reveals its suggestion buttons from gone, and swaps the field between one and three lines on a mode switch. Both resize the card, which had no way to animate: a binder only reaches its own include, so each change landed in a single layout pass. The engine now hands binders a card-bounds transition through BindScope, gated by the render's animation policy so a snapped entrance and tap-to-skip still snap. (cherry picked from commit df138bb)
The render's animate flag is off for every re-draw of a step that has already been presented, so gating on it alone left a rotated or re-entered screen unable to animate its own resizes for the rest of its life. The policy now only covers the entrance itself: an interaction the screen drives once it is on stage animates either way. (cherry picked from commit 86d14fe)
The render flag and the settled flag encoded one three-state fact, and the render flag stayed stale-true after settling. A single nullable policy carries the entrance's animate flag and expires to null once the screen is on stage, which is the shape the previous commit described. Also swaps the input preview's hand-rolled mode dedup for distinctUntilChanged, so same-mode re-emissions no longer re-apply the mode, and makes BindScope's card-bounds hook a required parameter so a missed wiring cannot no-op silently. (cherry picked from commit 20603a9)
The flag guarded copy that does not exist: no welcome variant carries raw line breaks, so decoding the plain copy is a no-op and the markup-capable variants (sync restore, custom AI) decode like the title view already does. Mirrors the title machinery's approach and keeps markup handling out of the config. (cherry picked from commit fd10ab4)
No welcome body copy has ever carried markup, in any language: the legacy decode of the sync-restore and custom-AI variants was decoding plain sentences since the strings were introduced. All three variants now take the same plain preventWidows path as the other body texts. (cherry picked from commit c59c95c)
LukasPaczos
force-pushed
the
refactor/lpaczos/config-driven-linear-onboarding-dialogs/welcome-input-screens
branch
from
August 6, 2026 11:14
72f6a25 to
3f97516
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Task/Issue URL: https://app.asana.com/1/137249556945/project/1208671518894266/task/1217183142109149?focus=true
Tech Design URL (if applicable): https://app.asana.com/1/137249556945/project/481882893211075/task/1216854264994244
API Proposals URL(s) (if applicable):
Description
Step 3 of the tech design: ports the remaining screens to the config-driven onboarding renderer. This PR covers below binders:
Divergences from the legacy implementation (
BrandDesignUpdateWelcomePage.kt):Divergences from the tech design:
BindScopegainedanimateCardBounds, which the TD didn't have. A binder only reaches its own layout, so it had no way to animate a card resize, if one was needed. The binder requests the tween but the engine owns it, so the request is safely ignored during snapped transitions.DialogConfiggained aCardEntryparam (Immediate/AfterBackgroundTransition). The welcome dialogs arrive while the intro background is still crossing over, and without it the card faded in over the moving background. The timing precisely matches legacy.Steps to test this PR
base flow
sync restore flow
Custom AI flow
Note
Medium Risk
Touches first-run onboarding UI, orchestrator events, and analytics pixels; behavior is flag-gated but mistakes would affect every new install when the config-driven toggle is on.
Overview
Ports welcome, input selection, and input preview onto the config-driven onboarding renderer, alongside the comparison/address-bar work already in that pipeline.
Welcome and flow entry:
DialogConfigResolvernow builds configs for initial, reinstall, and sync-restore steps (restore/skip CTAs, custom-AI copy). Welcome usesCardEntry.AfterBackgroundTransitionso the card fade waits for the intro background crossover.OnboardingDialogShownPixelsfires unique “shown” pixels when those dialogs render; sync restore is shown in the UI instead of auto-skipping.Input screens: New
ContentConfigtypes and binders wire AI/search picker (submit →InputModeConfirmed) and the preview demo (tabs, suggestions, keyboard). Preview queries go throughContentInteraction.SubmitInputPreview→InputDemoQuerySubmitted.BindScope.animateCardBoundsandCardStage.beginBoundsTransitionsmooth card growth when preview mode or suggestions change; tweens are suppressed while a snapped/skipped entrance is still landing.Engine / VM:
DialogRenderEnginepassesanimateCardBoundsinto bind scope and honorscardEntryreveal delay.ConfigDrivenOnboardingPageViewModelno longer auto-advances past the ported dialogs on activity start.Reviewed by Cursor Bugbot for commit 3f97516. Bugbot is set up for automated code reviews on this repo. Configure here.