summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2017-06-22 17:25:10 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2017-06-22 17:25:17 +0000
commitd0550a9b6c1b4db30b53ca4d59b79264097a2d83 (patch)
tree3721782becad97eb0543985f2761f65aab32754e
parent6791bee744a32bffc4d1b0b1707cf710fbd50209 (diff)
parent83519da8b6653cb8614d9ee5fe2ea274bed52b1c (diff)
downloadbase-d0550a9b6c1b4db30b53ca4d59b79264097a2d83.tar.gz
Merge "Ensure icon contrast on the shelf" into oc-dev
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java41
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java17
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