Onboarding Brand Design Update: Add address bar position screen#8216
Conversation
Apply tappableElement bottom inset as padding on the root layout for tablets so content isn't hidden behind the opaque taskbar. Phones are unaffected — their transparent navigation bar continues to draw edge-to-edge. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…gBackgroundAnimator
…screen Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…gest step text Otherwise, the view grows as we go from step 1 to step 2
…n in landscape Widen the ChangeBounds transition scope from cardView to the parent FrameLayout (daxCtaContainer) and move the content swap to after beginDelayedTransition. The narrow scope meant the FrameLayout resized instantly while only the card's internals animated, causing a visible "square" flash in landscape where the height change is dramatic. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Update ConstraintLayout params when transitioning to the address bar screen. On tablet, constrain the dialog above the bobbing dax with centered bias, matching the comparison chart pattern. On phone, anchor to parent bottom with top bias. Previously the constraints were stale from the comparison chart step, causing the dialog to shift down when the wing animation went GONE asynchronously. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…tions after rotation Extract scaleType detection and backgroundPrimary override into a single configureBackgroundView() method used by both transitionTo() and snapTo(). Previously snapTo() checked inView.scaleType directly, which returned centerCrop when ping-ponging back to backgroundPrimary (a LottieAnimationView). This skipped the fitCenter override and dimensionRatio on tablet and phone landscape, causing the background to render oversized on every other snapTo() call. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Set translationZ on the dialog FrameLayout so it draws above the exiting wing animation. In phone landscape the dialog's ChangeBounds animation makes it visually taller than its layout bounds, causing the wing (positioned by layout below the dialog) to overlap. Raising the dialog's z-order hides this overlap without affecting constraints or the wing's dismiss animation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…screen Replace static DaxTextView title with TypeAnimationTextView that types in character-by-character after the ChangeBounds transition, then fades in the options container and CTA. Matches the pattern used in COMPARISON_CHART and INPUT_SCREEN. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This stack of pull requests is managed by Graphite. Learn more about stacking. |
|
bugbot run |
Track ADDRESS_BAR_POSITION ChangeBounds transition for cleanup in onDestroyView and use safer view == null guard. Align top unselected light drawable colors (#242323/0.4) with bottom and split variants. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
bugbot run |
Defer primaryCta click listener to onAnimationEnd so the button isn't tappable while invisible during the address bar transition. Remove duplicate logo/title alpha assignments in showDialogWithoutAnimation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
bugbot run |
There was a problem hiding this comment.
✅ Bugbot reviewed your changes and found no new issues!
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit 0bfe881. Configure here.
LukasPaczos
left a comment
There was a problem hiding this comment.
Works well 👍 Some comments below - I think the most important is to address the radio button touch area, rest we can address here or in follow ups, or not at all.
- The actual radio button is not clickable, only the pictogram is.
Screen_recording_20260409_082104.mp4
- The background doesn't go all the way to the bottom edge on Samsung Tab S9+. Not an issue on Pixel 9 Pro.
configureDaxCtafunction is already over 300 LOC, and it's not even all of it yet. Similar pattern of huge switch-cases repeats across the classes. I understand you're following a previously established pattern, but this project would be a great opportunity to improve that code organization. It's not something to address in this PR but maybe worth considering before shipping all of the steps?
|
|
||
| topOmnibarToggleImage.setOnClickListener { | ||
| viewModel.onAddressBarPositionOptionSelected(OmnibarType.SINGLE_TOP) | ||
| setAddressBarPositionOptions(OmnibarType.SINGLE_TOP, showSplitOption) |
There was a problem hiding this comment.
nit: might be cleaner to rely on the state in the view model instead of changing the option directly on button click, just in case the state is ever modified outside of the button interactions
…e calls Address review feedback: replace all `resources.configuration.smallestScreenWidthDp >= 600` checks with `deviceInfo.isTablet()` extension, and remove unnecessary `?` on non-null `bobbingDaxAnimation` binding. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…spacing Move click listeners from ImageView to parent container so the entire option (image, label, radio button) is tappable. Move ripple foreground to container for visual feedback across the full touch area. Replace fixed 56dp margins with Space views (0dp width, max 56dp) in a packed chain so spacing compresses on phones but caps at 56dp on tablets. Switch android:src to tools:src since drawables are immediately overwritten by code. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove direct setAddressBarPositionOptions calls from click handlers, relying on viewState flow to update the UI via showDialogWithoutAnimation. Single source of truth for the selected address bar position. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add missing translationZ restoration in showDialogWithoutAnimation for ADDRESS_BAR_POSITION, matching the animated path. Qualify isAnimating with this. inside apply block to clarify it refers to the LottieAnimationView property, not the fragment field. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
LukasPaczos
left a comment
There was a problem hiding this comment.
The full container ripple doesn't look great:
Screen_recording_20260409_134327.mp4
I think we should do the same we do in the appearance and AI settings screens, so that only the pictogram ripples:
Screen_recording_20260409_134524.mp4
…ve ripple to images Thread selectedAddressBarPosition from viewState through configureDaxCta and showDialogWithoutAnimation so the initial selection reflects the persisted state rather than hardcoding SINGLE_TOP. Remove default parameter values to enforce explicit passing. Move ripple foreground from container back to ImageView so only the image shows the ripple effect. Container remains clickable for a larger touch target but without its own ripple. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…o button ViewModel already defaults selectedAddressBarPosition to SINGLE_TOP and setAddressBarPositionOptions() always runs before the container is visible. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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 31c3d6d. Configure here.
…ut changes Ensures requestLayout() is called after modifying ConstraintLayout params in showDialogWithoutAnimation, matching the COMPARISON_CHART case pattern. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>




Task/Issue URL: https://app.asana.com/1/137249556945/project/1207908166761516/task/1212699261164257
Description
Implements the address bar position selection screen for the onboarding brand design update. This is the second dialog step in the redesigned onboarding flow, allowing users to choose between top, bottom, or split address bar positions.
Key changes:
Steps to test this PR
Designs
Apply patch
Comparison chart screen
Address bar position screen
UI changes
See here for demoes
Note
Medium Risk
Moderate risk: adds a new onboarding dialog step with multiple coordinated animations, state restoration, and tablet-specific inset/layout handling that could regress the onboarding flow on different form factors.
Overview
Adds an address bar position selection step to the brand-design-update onboarding flow, including new UI for top/bottom/split options with themed radio-button tinting, new toolbar preview drawables (light/dark, selected/unselected), and a bobbing Dax animation.
Extends onboarding transitions to support a new
OnboardingBackgroundStep.AddressBarbackground, updatesBrandDesignUpdateWelcomePageto drive the new dialog’s animations and option selection wiring (including split-option gating and rotation-safe “show without animation” state), and refines tablet handling via a sharedDeviceInfo.isTablet()helper and tablet-specific insets.Improves
OnboardingStepIndicatorViewby pinning the text label width to prevent layout jitter as steps change.Reviewed by Cursor Bugbot for commit 93470c3. Bugbot is set up for automated code reviews on this repo. Configure here.