Requests from the owner on 12 November 2026, after using 0.3.1 on the Pixel 9a, with a
photo of Niagara Launcher's alphabet as the reference.
Drawer list
- Rows are 50dp with 34dp icons and 15sp names (were 64dp, 46dp, 17sp); letter headers are
34dp. A row grows with a large system font so a notification preview still fits.
Alphabet
- Letters sit 20dp apart at most (was 30dp). The strip keeps a stretch of edge as tall as
26 letters, low on the edge with its end 40dp above the navigation bar, and centres the
letters that exist in it. It used to spread over the whole edge, which put "A" out of a
thumb's reach.
- The wave follows Niagara's: letters keep their size, the wave is wide (104dp) so about
five letters on each side of the finger curve around the thumb, and the selected letter
is shown large in a light bubble just beyond the wave's peak. This replaces the enlarged
letter on a dark spot from 0.3.1, which collided with its neighbours at this spacing.
- The list dims a little during any scrub, more where the wave lies over it.
Backdrop
- The drawer's scrim is black at 78% in every theme (AllAppsState). Lawnchair's grey at 40%
left a light grey behind white names over a light wallpaper. LawnchairScrimView judges the
status bar icons by the scrim's own colour again, since that colour is now always dark.
Scrub from the home screen (PRD AD-10)
- On by default, the owner's decision; this closes the PRD's open question.
- It opens the drawer in 120 ms instead of the state manager's 600 ms, like swipe up and hold.
- A touch that lifts within 200 ms was a flick and opens the plain list.
Fix: undoing a scrub that was not meant
- 0.3.1 put the list back to "where it was", read from the list's rows. A closed drawer has
been told to return to the top but lays its rows out only when it opens, so the rows
still reported the place the drawer was last left at, and a quick swipe reopened it
there. The list now goes where a plainly opened drawer stands.
About
- A QR code for the release page, generated on the phone with ZXing core (new dependency),
black on white in every theme, with the address under it.
Checked on the Android 17 emulator with timed touches, a thumb-sized shape over the
screenshots, a 1.6 font scale, and by decoding the QR code from a screenshot.
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Two reports from first use on the Pixel 9a (PRD AD-5, AD-6, AD-17).
Swipe up and hold was slow to hand over to the alphabet:
- After the hold was noticed, the drawer was sent to its open state through the state
manager, which takes 600 ms, and the alphabet took the finger only after that, and then
only on the next touch movement. A finger held perfectly still never started it.
- Now the alphabet takes the finger's position in the same call that notices the hold, and
the drawer finishes opening under it by playing the swipe's own animation to its end in
120 ms.
- A still finger counts as holding after 150 ms instead of 300 (MotionPauseDetector gains
setForcePauseTimeout, reset by clear()), and the swipe has to travel 32dp instead of 72dp
before a hold counts.
- Because the list now jumps at once, a finger that lifts within 200 ms of the hold being
noticed is treated as an ordinary swipe that slowed down at its end: the scrub is undone
and the list stays where it was.
The selected letter sat under the thumb:
- The wave's peak was 52dp beyond the finger, about 8 mm, and a thumb hides about 11 mm to
each side of where it touches. It is now 104dp, and at least 96dp out from the edge.
- The peak may travel to within 36dp of the far edge (was 70% of the width), so the gap
holds when the finger is in the middle of the screen.
- A taller wave is wider (a third of its reach), so the neighbouring letters bend around
the thumb instead of vanishing under it.
- A soft dark spot behind the selected letter keeps it readable where it lands on an app
name or a light wallpaper.
Checked on the Android 17 emulator with touches injected at millisecond timing (a monkey
script) and a thumb-sized shape drawn over the screenshots.
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Scrub from home (PRD AD-10)
- New setting, off by default: a vertical slide along the alphabet's edge of the home
screen opens the drawer and scrubs it in the same touch (FlexeraEdgeScrubController).
It claims a touch only once it has clearly moved up or down, and never during an item
drag. Nothing is drawn on the home screen.
Work profile (PRD AD-14)
- The Personal and Work tabs and the work info card were one icon wide, because their
width came from grid maths that assumes several columns. In the one-column list they
now line up with the search bar.
- The info card's own scroller section no longer shows up as a letter in the alphabet.
Navigation modes (PRD SI-2, AD-17)
- With three-button navigation, the controller that carries swipe up and hold stood aside
completely, so a hold did nothing there. It now takes the ordinary swipe up from the
home screen in that mode too.
Wave alphabet
- The list darkens under the wave where the letters cross icons and names: always from
the left edge, and from the right edge in proportion to how far the wave reaches in.
Release script
- -BuildOnly builds and checks the APK without publishing, so a version can be tried
first and then published with -SkipBuild.
Checked on the Android 17 emulator (debug build): work tabs at full width, scrub from the
home screen's edge, the search field keeping its background while typing. The
three-button change and the right-edge darkening were written after that build and are
not yet checked.
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
PRD M3 (AD-4 to AD-6, AD-17), plus three look changes the owner asked for.
Wave alphabet
- WaveAlphabetView (flexera/src): a strip of letters on the drawer's end edge showing only
letters that have apps. Touching it jumps the list to that letter with a haptic tick; the
letters near the finger bulge away from the edge and reach further the further in the
finger moves; the selected letter is enlarged.
- The strip reserves the edge from the system back gesture and tells the drawer not to
drag closed under a scrub.
- Launcher3's scroll bar is hidden by default and no longer takes touches while hidden.
Swipe up and hold
- NoButtonNavbarToOverviewTouchController reuses its motion-pause detector on an ordinary
swipe up from the home screen: a pause finishes opening the drawer and hands the same
touch to the alphabet. Swipes that start on the navigation bar keep their stock meaning.
Look
- The drawer fades in over the home screen instead of sliding up from the bottom.
- No background panel or drag handle (drawer opacity default 0); the wallpaper keeps
Lawnchair's blur and scrim.
- App names, letter headers and alphabet letters are white with a soft shadow.
Tested on the Android 17 emulator: quick swipe opens the drawer, edge scrub jumps the
list, swipe up and hold opens the drawer and scrubs from mid-screen, Back closes it.
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Set foreground color to ScrimView in overview. Added new state property
for foreground.
Fix: 412928191
Test: Go to overview
Flag: com.android.launcher3.enable_overview_background_wallpaper_blur
Change-Id: Id4180eaa5501dc11bf7331073edb28dca5c4a13a
Revert submission 33672643-DataDeviceProfile1
Reason for revert: Droidmonitor created revert due to b/419867875. Will be verifying through ABTD before submission.
Fix: 419867875
Reverted changes: /q/submissionid:33672643-DataDeviceProfile1
Change-Id: Icb66aefbbcee24e05806b2139923e1f2ea1c65e3
This reverts commit ce9ad064d6.
Reason for revert: <Potential culprit for b/395855288 - verifying through ABTD before revert submission. This is part of the standard investigation process, and does not mean your CL will be reverted>
Change-Id: I12d1eb66ae03e2638a503c103d0b1fa8a863b6b5
> Using callback patter for various change events instead of routing it
via TIS
Bug: 386288280
Test: Presubmit
Flag: EXEMPT refactor
Change-Id: I95577d6a1c17103cb947ef1200c1c22b68fd1d9c
- RAPID_DECELERATION_FACTOR determines whether swipe up from app takes the user to overview vs. home
Bug: 355457714
Test: adb shell setprop trackpad_in_app_swipe_up_deceleration_factor 0.6f
Flag: EXEMPT bugfix
Change-Id: I205e72c82dc08b9e542420ca1adc8f7c0eb0953d
We already reached the limit of 32 flags for an int. To be able to have
more, changing from int to long.
This is needed, as new flags have to be added.
Flag: NONE
Test: Manually running SysUI and Launcher
Test: Unit tests in CL
Bug: 335625543
Change-Id: Iec1d40218264c7c64c50fd09764aa07c0caa7787
Previously, the following would cause the All Apps panel to appear
in NORMAL state:
1. Start dragging to all apps
2. During the drag, something sets Launcher to NORMAL
3. Release finger -> animation to all apps completes, but state
is still NORMAL
Side effects of this:
- On large screens, All Apps draws its background on Launcher's
ScrimView only if the current state is All Apps. So in this
case, the apps just floated above the workspace.
- On handheld, touches are handled by workspace even though you
can see the All Apps list. So e.g. if you swipe down, the
notification shade appears rather than all apps panel hiding
(although it seems this touch issue was addressed separately).
I'm not sure if this is the main/only case of this state mismatch
happening, but verified with local async state changes that this
could in theory happen. We haven't been able to organically repro
the bug reliably. That being said, it feels plausible that a well
timed screen lock during the all apps transition could also hit
this case.
Demo videos with hard-coded state change to NORMAL 2 seconds after
you start swiping up to all apps (note I release my finger at the
end of each video):
https://drive.google.com/drive/folders/1ul8ep9N2M5oc6ZSbf_ZHQwp9IwTpz7GB?resourcekey=0-4LAufl0rkvtjvgZC0L-eMQ&usp=drive_link
Bug: 239394946
Bug: 331600490
Test: Manual with local async launcher state changes
Flag: NA
Change-Id: I6364dbde8aea67f5d1c525edf57ed7eb26096cf9
* We weren't specifying an animation duration for the
dismiss placeholder animation, and it wasn't inheriting
from the animatorSet since that didn't have any duration
set on it.
* Now we explicitly set a duration (usually matching that of
the current launcher state config) to the timings line up
well
Test: Repro steps don't show bug. Also tested on large screen dismissing
contextual split from overview and home, seems fine
Fixes: 314860754
Change-Id: I701e4f88c1ddd92561da4fb76715a859f587c91e
Bug: 321756829
Flag: none
Test: switchToOverview, e.g. TaplTestsQuickstep
Test: Manually check traces for:
- Home to quick switch to Overview
- Home to quick switch to app
- Home to Overview
- Home to Overview to Home (one gesture)
Change-Id: I7e09957202b844d5db49f6c8545f864e7ace3522
Previously, users used to be able to swipe down near the
bottom of the screen to leave overview. This was causing the taskbar to
animate to home while still in overview (and causing jank). Since this isn't expected behavior for
how to leave overview, this change removes that method.
Flag: N/A
Fix: 284416178
Test: Completed multiple transitions (ex. Overview to home) with 3
button nav and gesture nav. Ensured swiping down from below the recents
task does not go to the home screen while not affecting other
transitions.
Change-Id: I8cdfde71117dd947174d9c3c3a7f834fbeaddcca
- Remove the Utilities.atLeast check since it's no longer relevant as there is no new haptics being played
in the original haptic..
When FeatureFlag is off, the haptic for all apps and qsb is played in one place. So when
FeatureFlag is on, we need to isolate where the haptic call gets played so we disable calling it from two places
and play the haptics at the respective areas.
flag: ENABLE_PREMIUM_HAPTICS_ALL_APPS=false
bug: 270634265
test: Manual
Change-Id: I7b92c427e880b196130270ed9709cf1ea0e19e0a
Notes:
* the reason why 0.6 -> 1 never happened was because of AllAppsSwipeController where
it had a clampToProgress. By changing lowerbound to 0 the progress actually shows fully 0->1
- composed the haptics in the constructor
- added new listener class in AATransitionController
Added featureflag
bug: 233751149
test: Manually - presubmit, ran “make -j7 Launcher3” from master branch photo: https://screenshot.googleplex.com/8r5FZh6buzkQMjk
Change-Id: I5e1a24170fdbfdd35b8d8f24af0ec5e8586641a2
Instead using a poll method similar to other touch controllers
Bug: 259447608
Test: Verified on device
Change-Id: I5c29c7c1b87acb668ea93e9f44fb685379de54fb
Context: there was a bug where you could get stuck in HintState if you
did the following (timing is critical):
1. Short swipe from nav region towards HintState, but not far enough or
fast enough to commit before letting go; this cancels the state
animation, returning towards Normal (but, crucially, StateManager
still has state set as Hint)
2. While previous animation is animating back to Normal, swipe up again,
but this time faster/farther to actually reach Hint; this time, the
animation does go towards Hint, but gets stuck there. The reason it
gets stuck is because StateManager thinks we're already in Hint from
step 1, so doesn't call onStateTransitionEnd(Hint) in step 2. Thus,
we never get QuickstepLauncher#onStateSetEnd(Hint), which is what we
rely on to return to Normal.
The simple fix is to prevent the second swipe in the first place.
Test: short swipe followed immediately by fast fling from nav region on home successfully stays in Normal state intead of getting stuck in HintState
Test:
NexusLauncherOutOfProcTests: com.google.android.apps.nexuslauncher.TaplTestsNexus
Fixes: 228276181
Change-Id: I54c371c8518a9a220e75c98003331b552d8bf8af
- Avoid overriding interpolator in AllAppsTransitionController.setStateWithAnimation as it's no longer needed and it'll wrongly override interpolator for ANIM_ALL_APPS_FADE
- Override ANIM_ALL_APPS_FADE to FINAL_FRAME in QuickstepAtomicAnimationFactory for tap deadzone to dismiss animation, also added EMPHASIZED_ACCELERATE for the dismiss animation
- Tuned dismiss animation across form factors to 300ms
Fix: 220336617
Test: manual
Change-Id: I4b3e827b503dcb1dd39f0bd99d4c1dd5ffdba0f3
Fixes: 208802276
Test: drag from all apps to normal, and the task bar doesn't stash until the user releases their finger
Change-Id: I53133cc80749bdc62e77d858b5714ae32facbd1d
Haptics introduced at the key moments:
- Task scroll in overview or quick switch, trigger when a new task comes
to the center of the screen;
- Task scroll in overview when overscroll animation is triggered;
- Task dismissed in overview;
There is also a configured min gap between two scroll haptics set to
20ms to prevent fast scrolls from creating a chain of cancelled effects.
Fix: 182382085
Test: manual
Change-Id: I43c0f8c879a06f317e8a660240dafb7f7abe79f7
There is a case when one handed mode triggered(Activated), all apps
drawer is very easy to trigger while user swipe up around NavBar
region to exit one handed mode. Since System Gesture monitor regsion
is small on screen bottom, swipe-up gesture usually cross over NavBar
monitor region and invoke launcher touch controller intercept touch
event and introduce unexpectedly trigger all apps drawer.
Adding onOneHandedModeStateChanged(boolean activated) for controller
be able to adjust the touch slop by multiplier, we can set a larger
multiplier when the visible window size translate become smaller
and make swipe gesture not too sensitive.
Test: manual swipe up to swich "home <-> all apps" and monitor
minDisplacement of SingleAxisSwipeDetector
Test: Trigger one handed mode and swipe up to exit one handed mode
check the minDisplacement of SingleAxisSwipeDetector
Bug: 186235522
Change-Id: I9729cd408d85b2b22582bf800e28d1471fc06980
We no longer need to have a different behavior for no button mode,
so make PortraitStatesTouchController the source of truth
Also remove unused ANIM_ALL_APPS_HEADER_FADE & RECENTS_FADE_THRESHOLD
Test: manually in 0 button and 3 button modes
Bug: 183001675
Bug: 175137718
Change-Id: If0bc2a6d6d3bf1649fad45226a4e6055f30e4880
Make it possible to set the color of workspace scrim to a different color
per state. Motivated by making Overview Scrim and All Apps scrims different
colors.
Bug: 186253733
Test: Local build and flash
Change-Id: Id7c38ce3c9173308eedfcb7592ececa7bd6bf220
Pre-S: Continue to use config-changed broadcast for configuration changes
and display-changed event for rotation changes
S+: Use WindowContext#componentCallbacks for config and rotation changes, and
continue to use display listener for frame-rate changes
Bug: 179308296
Test: Manual and presubmit
Change-Id: I533e69068b5fa6c052a02759ef309dd075ee6a4b
> Merging overview and all-apps scrims into a single View
> Decoupling TaskMenuView from taskView
Bug: 184676497
Test: Manual
Change-Id: I49f7249eaa2a800054385ab8e73a441d6a1b5e16
Explicitly use DeviceProfile#heightPx instead of getShiftRange(),
which might be less depending on AllAppsTransitionController
Test: swipe up from bottom on home, ensure workspace scales down
as the gesture goes all the way to the top of the screen
Change-Id: I9c2988d361c22d437c7eb9bea8ed715d06054c59