diff options
| author | Jeff DeCew <jeffdq@google.com> | 2021-07-29 21:29:44 +0000 |
|---|---|---|
| committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-07-29 21:29:44 +0000 |
| commit | 86d4294f37f26297291249cea2fad20fd69ffe67 (patch) | |
| tree | f7a7e616bee0eac1f88fc7952bceb4cb0da402e4 /core/java/android | |
| parent | 8373aec11c094d2d26d0546120a60de0daf175f2 (diff) | |
| parent | e38e044460c38539058075cc6dec4b8f00a9a1e6 (diff) | |
Merge "Fix bug removing semantic colors of CallStyle notification actions." into sc-dev am: 4203db854f am: e38e044460
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15405173
Change-Id: I6834b60e83a3ddb086febd02416f4a4c8f0f97a5
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/app/Notification.java | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index ab88e6c8424f..908af965baa0 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -6120,28 +6120,29 @@ public class Notification implements Parcelable // change the background bgColor CharSequence title = action.title; ColorStateList[] outResultColor = new ColorStateList[1]; - int background = getColors(p).getSecondaryAccentColor(); + int buttonFillColor = getColors(p).getSecondaryAccentColor(); if (isLegacy()) { title = ContrastColorUtil.clearColorSpans(title); } else { - title = ensureColorSpanContrast(title, background, outResultColor); + int notifBackgroundColor = getColors(p).getBackgroundColor(); + title = ensureColorSpanContrast(title, notifBackgroundColor, outResultColor); } button.setTextViewText(R.id.action0, processTextSpans(title)); boolean hasColorOverride = outResultColor[0] != null; if (hasColorOverride) { // There's a span spanning the full text, let's take it and use it as the // background color - background = outResultColor[0].getDefaultColor(); + buttonFillColor = outResultColor[0].getDefaultColor(); } final int textColor = ContrastColorUtil.resolvePrimaryColor(mContext, - background, mInNightMode); + buttonFillColor, mInNightMode); button.setTextColor(R.id.action0, textColor); // We only want about 20% alpha for the ripple final int rippleColor = (textColor & 0x00ffffff) | 0x33000000; button.setColorStateList(R.id.action0, "setRippleColor", ColorStateList.valueOf(rippleColor)); button.setColorStateList(R.id.action0, "setButtonBackground", - ColorStateList.valueOf(background)); + ColorStateList.valueOf(buttonFillColor)); if (p.mCallStyleActions) { button.setImageViewIcon(R.id.action0, action.getIcon()); boolean priority = action.getExtras().getBoolean(CallStyle.KEY_ACTION_PRIORITY); @@ -6174,8 +6175,8 @@ public class Notification implements Parcelable * there exists a full length color span. * @return the contrasted charSequence */ - private CharSequence ensureColorSpanContrast(CharSequence charSequence, int background, - ColorStateList[] outResultColor) { + private static CharSequence ensureColorSpanContrast(CharSequence charSequence, + int background, ColorStateList[] outResultColor) { if (charSequence instanceof Spanned) { Spanned ss = (Spanned) charSequence; Object[] spans = ss.getSpans(0, ss.length(), Object.class); @@ -6195,8 +6196,9 @@ public class Notification implements Parcelable int[] colors = textColor.getColors(); int[] newColors = new int[colors.length]; for (int i = 0; i < newColors.length; i++) { + boolean isBgDark = isColorDark(background); newColors[i] = ContrastColorUtil.ensureLargeTextContrast( - colors[i], background, mInNightMode); + colors[i], background, isBgDark); } textColor = new ColorStateList(textColor.getStates().clone(), newColors); @@ -6215,8 +6217,9 @@ public class Notification implements Parcelable } else if (resultSpan instanceof ForegroundColorSpan) { ForegroundColorSpan originalSpan = (ForegroundColorSpan) resultSpan; int foregroundColor = originalSpan.getForegroundColor(); + boolean isBgDark = isColorDark(background); foregroundColor = ContrastColorUtil.ensureLargeTextContrast( - foregroundColor, background, mInNightMode); + foregroundColor, background, isBgDark); if (fullLength) { outResultColor[0] = ColorStateList.valueOf(foregroundColor); resultSpan = null; @@ -6236,6 +6239,19 @@ public class Notification implements Parcelable } /** + * Determines if the color is light or dark. Specifically, this is using the same metric as + * {@link ContrastColorUtil#resolvePrimaryColor(Context, int, boolean)} and peers so that + * the direction of color shift is consistent. + * + * @param color the color to check + * @return true if the color has higher contrast with white than black + */ + private static boolean isColorDark(int color) { + // as per ContrastColorUtil.shouldUseDark, this uses the color contrast midpoint. + return ContrastColorUtil.calculateLuminance(color) <= 0.17912878474; + } + + /** * @return Whether we are currently building a notification from a legacy (an app that * doesn't create material notifications by itself) app. */ |
