diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2017-06-22 17:25:10 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2017-06-22 17:25:17 +0000 |
commit | d0550a9b6c1b4db30b53ca4d59b79264097a2d83 (patch) | |
tree | 3721782becad97eb0543985f2761f65aab32754e | |
parent | 6791bee744a32bffc4d1b0b1707cf710fbd50209 (diff) | |
parent | 83519da8b6653cb8614d9ee5fe2ea274bed52b1c (diff) | |
download | base-d0550a9b6c1b4db30b53ca4d59b79264097a2d83.tar.gz |
Merge "Ensure icon contrast on the shelf" into oc-dev
3 files changed, 60 insertions, 1 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index bbcbfd6f8850..1a99636ae517 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -454,7 +454,8 @@ public class NotificationShelf extends ActivatableNotificationView implements || row.getTranslationZ() > mAmbientState.getBaseZHeight()))) { iconState.hidden = true; } - int shelfColor = icon.getStaticDrawableColor(); + int backgroundColor = getBackgroundColorWithoutTint(); + int shelfColor = icon.getContrastedStaticDrawableColor(backgroundColor); if (!noIcon && shelfColor != StatusBarIconView.NO_COLOR) { int iconColor = row.getVisibleNotificationHeader().getOriginalIconColor(); shelfColor = NotificationUtils.interpolateColors(iconColor, shelfColor, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index 3c7ddb502145..1a47e4428e49 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -35,6 +35,7 @@ import android.graphics.drawable.Icon; import android.os.Parcelable; import android.os.UserHandle; import android.service.notification.StatusBarNotification; +import android.support.v4.graphics.ColorUtils; import android.text.TextUtils; import android.util.AttributeSet; import android.util.FloatProperty; @@ -46,6 +47,7 @@ import android.view.accessibility.AccessibilityEvent; import android.view.animation.Interpolator; import com.android.internal.statusbar.StatusBarIcon; +import com.android.internal.util.NotificationColorUtil; import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.statusbar.notification.NotificationIconDozeHelper; @@ -127,6 +129,8 @@ public class StatusBarIconView extends AnimatedImageView { setColorInternal(newColor); }; private final NotificationIconDozeHelper mDozer; + private int mContrastedDrawableColor; + private int mCachedContrastBackgroundColor = NO_COLOR; public StatusBarIconView(Context context, String slot, StatusBarNotification sbn) { this(context, slot, sbn, false); @@ -528,6 +532,7 @@ public class StatusBarIconView extends AnimatedImageView { public void setStaticDrawableColor(int color) { mDrawableColor = color; setColorInternal(color); + updateContrastedStaticColor(); mIconColor = color; mDozer.setColor(color); } @@ -580,6 +585,42 @@ public class StatusBarIconView extends AnimatedImageView { return mDrawableColor; } + /** + * A drawable color that passes GAR on a specific background. + * This value is cached. + * + * @param backgroundColor Background to test against. + * @return GAR safe version of {@link StatusBarIconView#getStaticDrawableColor()}. + */ + int getContrastedStaticDrawableColor(int backgroundColor) { + if (mCachedContrastBackgroundColor != backgroundColor) { + mCachedContrastBackgroundColor = backgroundColor; + updateContrastedStaticColor(); + } + return mContrastedDrawableColor; + } + + private void updateContrastedStaticColor() { + if (mCachedContrastBackgroundColor == NO_COLOR) { + return; + } + // We'll modify the color if it doesn't pass GAR + int contrastedColor = mDrawableColor; + if (!NotificationColorUtil.satisfiesTextContrast(mCachedContrastBackgroundColor, + contrastedColor)) { + float[] hsl = new float[3]; + ColorUtils.colorToHSL(mDrawableColor, hsl); + // This is basically a light grey, pushing the color will only distort it. + // Best thing to do in here is to fallback to the default color. + if (hsl[1] < 0.2f) { + contrastedColor = Notification.COLOR_DEFAULT; + } + contrastedColor = NotificationColorUtil.resolveContrastColor(mContext, + contrastedColor, mCachedContrastBackgroundColor); + } + mContrastedDrawableColor = contrastedColor; + } + public void setVisibleState(int state) { setVisibleState(state, true /* animate */, null /* endRunnable */); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java index 68f9cb05ecaf..8e7ffdfd4b47 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java @@ -16,8 +16,10 @@ package com.android.systemui.statusbar; +import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNull; +import static junit.framework.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; @@ -33,12 +35,14 @@ import android.content.ContextWrapper; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.Resources; +import android.graphics.Color; import android.graphics.drawable.Icon; import android.os.UserHandle; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import com.android.internal.statusbar.StatusBarIcon; +import com.android.internal.util.NotificationColorUtil; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; @@ -100,4 +104,17 @@ public class StatusBarIconViewTest extends SysuiTestCase { assertFalse(mIconView.set(mStatusBarIcon)); } + + @Test + public void testGetContrastedStaticDrawableColor() { + mIconView.setStaticDrawableColor(Color.DKGRAY); + int color = mIconView.getContrastedStaticDrawableColor(Color.WHITE); + assertEquals("Color should not change when we have enough contrast", + Color.DKGRAY, color); + + mIconView.setStaticDrawableColor(Color.WHITE); + color = mIconView.getContrastedStaticDrawableColor(Color.WHITE); + assertTrue("Similar colors should be shifted to satisfy contrast", + NotificationColorUtil.satisfiesTextContrast(Color.WHITE, color)); + } }
\ No newline at end of file |