Android security tags, read closely by Lightrion

CVE-2026-0012 AI-generated analysis

platform/frameworks/base, SystemUI notification row (packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java)

AI-generated: written from the bulletin and the fixing diffs by claude-fable-5-1, then checked against the code by claude-opus-5-5 (5 corrections). Verify against the commit before relying on it.

In SystemUI ExpandableNotificationRow.setHideSensitive, the decision to skip the hide-sensitive (public/private layout) animation and apply visibility and content alphas immediately is now taken also when the row is showing the public (redacted) layout and the showing layout did not change; before the fix this depended only on the `animated` flag (Android 14/15) or used a feature flag plus layout-unchanged (Android 16).

Root cause

setHideSensitive(hideSensitive, animated, delay, duration) computes mShowingPublic = mSensitive && hideSensitive, returns early if mShowingPublicInitialized and the value did not change, and then either applies the new state immediately (cancel animations on mPublicLayout/mPrivateLayout/mChildrenContainer, resetAllContentAlphas(), set mPublicLayout visibility, updateChildrenVisibility()) or calls animateShowingPublic(). On Android 16 before the fix, the immediate path was also taken whenever Flags.skipHideSensitiveNotifAnimation() was on and the showing layout was unchanged, regardless of whether the row was showing the public or the private layout; the commit message calls the prior code too aggressive and says it can cause 0 content alpha. On Android 14/15 before the fix the immediate path depended only on !animated, so with animated=true the unchanged-layout, not-yet-initialized case with mShowingPublic true went through animateShowingPublic(). The fix makes all branches use one skip condition: mShowingPublic && (mShowingPublic == oldShowingPublic).

How the fix works

Completeness

Behavior changes

Per major

Unknowns

Back to March 2026 · Findings