diff options
| author | 2025-03-07 10:54:55 -0800 | |
|---|---|---|
| committer | 2025-03-10 18:49:50 -0700 | |
| commit | 23c7418d4d96448ba76d08690df7209b9743c2dd (patch) | |
| tree | 603ca5e35a11f9a1816a0c1b355f1d0be930fc64 | |
| parent | c1e5a13a49803840bfbebfcc45a23036d50e3e46 (diff) | |
Fix notification row transparency.
Bug: 400307362
Fixes: 400307362
Test: Create notifications that are colorized, non-colorized, HUNs,
custom views. Lock / unlock device. Make sure transparency looks
correct.
Flag: com.android.systemui.notification_row_transparency
Change-Id: I9c1891828689cd0bb239fb7c18f0ebd8b1721e99
3 files changed, 61 insertions, 71 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java index 689222608abe..e76867373139 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java @@ -40,6 +40,7 @@ import android.view.animation.Interpolator; import com.android.app.animation.Interpolators; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.jank.InteractionJankMonitor.Configuration; +import com.android.systemui.Flags; import com.android.systemui.Gefingerpoken; import com.android.systemui.common.shared.colors.SurfaceEffectColors; import com.android.systemui.res.R; @@ -101,7 +102,8 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView private ValueAnimator mBackgroundColorAnimator; private float mAppearAnimationFraction = -1.0f; private float mAppearAnimationTranslation; - private int mNormalColor; + protected int mNormalColor; + protected int mOpaqueColor; private boolean mIsBelowSpeedBump; private long mLastActionUpTime; @@ -130,17 +132,13 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView protected void updateColors() { if (notificationRowTransparency()) { - if (mIsBlurSupported) { - mNormalColor = SurfaceEffectColors.surfaceEffect1(getContext()); - } else { - mNormalColor = mContext.getColor( - com.android.internal.R.color.materialColorSurfaceContainer); - } + mNormalColor = SurfaceEffectColors.surfaceEffect1(getContext()); + mOpaqueColor = mContext.getColor( + com.android.internal.R.color.materialColorSurfaceContainer); } else { mNormalColor = mContext.getColor( com.android.internal.R.color.materialColorSurfaceContainerHigh); } - setBackgroundToNormalColor(); mTintedRippleColor = mContext.getColor( R.color.notification_ripple_tinted_color); mNormalRippleColor = mContext.getColor( @@ -151,12 +149,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView mOverrideAmount = 0.0f; } - private void setBackgroundToNormalColor() { - if (mBackgroundNormal != null) { - mBackgroundNormal.setNormalColor(mNormalColor); - } - } - /** * Reload background colors from resources and invalidate views. */ @@ -186,7 +178,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView mBackgroundNormal = findViewById(R.id.backgroundNormal); mFakeShadow = findViewById(R.id.fake_shadow); mShadowHidden = mFakeShadow.getVisibility() != VISIBLE; - setBackgroundToNormalColor(); initBackground(); updateBackgroundTint(); updateOutlineAlpha(); @@ -352,7 +343,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView } protected boolean usesTransparentBackground() { - return mIsBlurSupported && notificationRowTransparency(); + return false; } @Override @@ -709,7 +700,11 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView if (withTint && mBgTint != NO_COLOR) { return mBgTint; } else { - return mNormalColor; + if (Flags.notificationRowTransparency()) { + return usesTransparentBackground() ? mNormalColor : mOpaqueColor; + } else { + return mNormalColor; + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index c877beeda152..d77240d09a57 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -81,6 +81,7 @@ import androidx.dynamicanimation.animation.SpringAnimation; import com.android.app.animation.Interpolators; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.graphics.ColorUtils; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; @@ -114,7 +115,6 @@ import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.notification.SourceType; import com.android.systemui.statusbar.notification.collection.EntryAdapter; import com.android.systemui.statusbar.notification.collection.NotificationEntry; -import com.android.systemui.statusbar.notification.collection.NotificationEntryAdapter; import com.android.systemui.statusbar.notification.collection.PipelineEntry; import com.android.systemui.statusbar.notification.collection.provider.NotificationDismissibilityProvider; import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManager; @@ -979,7 +979,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } else if (isAboveShelf() != wasAboveShelf) { mAboveShelfChangedListener.onAboveShelfStateChanged(!wasAboveShelf); } - updateColors(); + updateBackgroundTint(); } /** @@ -1678,21 +1678,35 @@ public class ExpandableNotificationRow extends ActivatableNotificationView @Override protected void setBackgroundTintColor(int color) { - super.setBackgroundTintColor(color); - NotificationContentView view = getShowingLayout(); - if (view != null) { - view.setBackgroundTintColor(color); - } - if (notificationRowTransparency() && mBackgroundNormal != null) { + if (notificationRowTransparency()) { + boolean isColorized = false; if (NotificationBundleUi.isEnabled() && mEntryAdapter != null) { - mBackgroundNormal.setBgIsColorized(mEntryAdapter.isColorized()); + isColorized = mEntryAdapter.isColorized(); } else { if (mEntry != null) { - mBackgroundNormal.setBgIsColorized( - mEntry.getSbn().getNotification().isColorized()); + isColorized = mEntry.getSbn().getNotification().isColorized(); + } + } + boolean isTransparent = usesTransparentBackground(); + if (isColorized) { + // For colorized notifications, use a color that matches the tint color at 90% alpha + // when the row is transparent. + color = ColorUtils.setAlphaComponent( + color, (int) (0xFF * (isTransparent ? 0.9f : 1))); + } else { + // For non-colorized notifications, use the semi-transparent normal color token + // when the row is transparent, and the opaque color token otherwise. + if (!isTransparent && mBgTint == NO_COLOR) { + color = mOpaqueColor; } } } + + super.setBackgroundTintColor(color); + NotificationContentView view = getShowingLayout(); + if (view != null) { + view.setBackgroundTintColor(color); + } } public void closeRemoteInput() { @@ -3121,7 +3135,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mChildrenContainer.setOnKeyguard(onKeyguard); } } - updateColors(); + updateBackgroundTint(); } } @@ -4632,6 +4646,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView @Override protected boolean usesTransparentBackground() { - return super.usesTransparentBackground() && !mIsHeadsUp && !mOnKeyguard; + // Row background should be opaque when it's displayed as a heads-up notification or + // displayed on keyguard. + // TODO(b/388891313): Account for isBlurSupported when it is initialized and updated + // correctly. + return notificationRowTransparency() && !mIsHeadsUp && !mOnKeyguard; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java index 4914e1073059..e4997e4f53ad 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java @@ -36,9 +36,9 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.android.internal.graphics.ColorUtils; import com.android.internal.util.ContrastColorUtil; import com.android.systemui.Dumpable; +import com.android.systemui.common.shared.colors.SurfaceEffectColors; import com.android.systemui.res.R; import com.android.systemui.statusbar.notification.shared.NotificationAddXOnHoverToDismiss; import com.android.systemui.util.DrawableDumpKt; @@ -52,7 +52,6 @@ import java.util.Arrays; public class NotificationBackgroundView extends View implements Dumpable, ExpandableNotificationRow.DismissButtonTargetVisibilityListener { - private static final int MAX_ALPHA = 0xFF; private final boolean mDontModifyCorners; private Drawable mBackground; private int mClipTopAmount; @@ -73,8 +72,6 @@ public class NotificationBackgroundView extends View implements Dumpable, private final ColorStateList mLightColoredStatefulColors; private final ColorStateList mDarkColoredStatefulColors; private int mNormalColor; - private boolean mBgIsColorized = false; - private boolean mForceOpaque = false; private final int convexR = 9; private final int concaveR = 22; @@ -88,13 +85,15 @@ public class NotificationBackgroundView extends View implements Dumpable, R.color.notification_state_color_light); mDarkColoredStatefulColors = getResources().getColorStateList( R.color.notification_state_color_dark); + if (notificationRowTransparency()) { + mNormalColor = SurfaceEffectColors.surfaceEffect1(getContext()); + } else { + mNormalColor = mContext.getColor( + com.android.internal.R.color.materialColorSurfaceContainerHigh); + } mFocusOverlayStroke = getResources().getDimension(R.dimen.notification_focus_stroke_width); } - public void setNormalColor(int color) { - mNormalColor = color; - } - @Override public void onTargetVisibilityChanged(boolean targetVisible) { if (NotificationAddXOnHoverToDismiss.isUnexpectedlyInLegacyMode()) { @@ -140,21 +139,6 @@ public class NotificationBackgroundView extends View implements Dumpable, } } - /** - * A way to tell whether the background has been colorized. - */ - public boolean isColorized() { - return mBgIsColorized; - } - - /** - * A way to inform this class whether the background has been colorized. - * We need to know this, in order to *not* override that color. - */ - public void setBgIsColorized(boolean b) { - mBgIsColorized = b; - } - private Path calculateDismissButtonCutoutPath(Rect backgroundBounds) { // TODO(b/365585705): Adapt to RTL after the UX design is finalized. @@ -311,28 +295,21 @@ public class NotificationBackgroundView extends View implements Dumpable, return ((LayerDrawable) mBackground).getDrawable(1); } - private void updateBaseLayerColor() { - // BG base layer being a drawable, there isn't a method like setColor() to color it. - // Instead, we set a color filter that essentially replaces every pixel of the drawable. - // For non-colorized notifications, this function specifies a new color token. - // For colorized notifications, this uses a color that matches the tint color at 90% alpha. - int color = isColorized() - ? ColorUtils.setAlphaComponent(mTintColor, (int) (MAX_ALPHA * 0.9f)) - : mNormalColor; - getBaseBackgroundLayer().setColorFilter( - new PorterDuffColorFilter( - color, - PorterDuff.Mode.SRC)); // SRC operator discards the drawable's color+alpha - } - public void setTint(int tintColor) { Drawable baseLayer = getBaseBackgroundLayer(); - baseLayer.mutate().setTintMode(PorterDuff.Mode.SRC_ATOP); - baseLayer.setTint(tintColor); - mTintColor = tintColor; if (notificationRowTransparency()) { - updateBaseLayerColor(); + // BG base layer being a drawable, there isn't a method like setColor() to color it. + // Instead, we set a color filter that essentially replaces every pixel of the drawable. + baseLayer.setColorFilter( + new PorterDuffColorFilter( + tintColor, + // SRC operator discards the drawable's color+alpha + PorterDuff.Mode.SRC)); + } else { + baseLayer.mutate().setTintMode(PorterDuff.Mode.SRC_ATOP); + baseLayer.setTint(tintColor); } + mTintColor = tintColor; setStatefulColors(); invalidate(); } |