More conservative dark text calculation

Refactored WallpaperColors to use constrast ratio instead of luminance
for detecting dark pixels. Also using a contrast more conservative than
what GAR requires while decreasing the dark area threshold.

Change-Id: I67b799be4b7ccd50bb3e63c6179d513b9b76446b
Fixes: 76435920
Test: manually set various wallpapers
Test: use new debug flag to verify which pixel is actually dark
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index d647e21..60dea3a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -63,7 +63,7 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
 import com.android.internal.widget.CachingIconView;
 import com.android.systemui.Dependency;
 import com.android.systemui.Interpolators;
@@ -496,7 +496,7 @@
         StatusBarIconView expandedIcon = mEntry.expandedIcon;
         boolean isPreL = Boolean.TRUE.equals(expandedIcon.getTag(R.id.icon_is_pre_L));
         boolean colorize = !isPreL || NotificationUtils.isGrayscale(expandedIcon,
-                NotificationColorUtil.getInstance(mContext));
+                ContrastColorUtil.getInstance(mContext));
         int color = StatusBarIconView.NO_COLOR;
         if (colorize) {
             NotificationHeaderView header = getVisibleNotificationHeader();
@@ -1120,10 +1120,10 @@
     }
 
     private void updateNotificationColor() {
-        mNotificationColor = NotificationColorUtil.resolveContrastColor(mContext,
+        mNotificationColor = ContrastColorUtil.resolveContrastColor(mContext,
                 getStatusBarNotification().getNotification().color,
                 getBackgroundColorWithoutTint());
-        mNotificationColorAmbient = NotificationColorUtil.resolveAmbientColor(mContext,
+        mNotificationColorAmbient = ContrastColorUtil.resolveAmbientColor(mContext,
                 getStatusBarNotification().getNotification().color);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
index 70dad19..a90ddf0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
@@ -36,7 +36,7 @@
 import android.widget.LinearLayout;
 
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
 import com.android.systemui.Dependency;
 import com.android.systemui.R;
 import com.android.systemui.statusbar.notification.HybridGroupManager;
@@ -1323,7 +1323,7 @@
                 if (color == Notification.COLOR_DEFAULT) {
                     color = mContext.getColor(R.color.default_remote_input_background);
                 }
-                existing.setBackgroundColor(NotificationColorUtil.ensureTextBackgroundColor(color,
+                existing.setBackgroundColor(ContrastColorUtil.ensureTextBackgroundColor(color,
                         mContext.getColor(R.color.remote_input_text_enabled),
                         mContext.getColor(R.color.remote_input_hint)));
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
index e24d65a..349ca277 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
@@ -54,7 +54,7 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.statusbar.StatusBarIcon;
 import com.android.internal.util.ArrayUtils;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
 import com.android.systemui.Dependency;
 import com.android.systemui.ForegroundServiceController;
 import com.android.systemui.statusbar.notification.InflationException;
@@ -254,7 +254,7 @@
             if (mCachedContrastColorIsFor == rawColor && mCachedContrastColor != COLOR_INVALID) {
                 return mCachedContrastColor;
             }
-            final int contrasted = NotificationColorUtil.resolveContrastColor(context, rawColor,
+            final int contrasted = ContrastColorUtil.resolveContrastColor(context, rawColor,
                     backgroundColor);
             mCachedContrastColorIsFor = rawColor;
             mCachedContrastColor = contrasted;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index ebeea58..e657399 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -50,7 +50,7 @@
 import android.view.animation.Interpolator;
 
 import com.android.internal.statusbar.StatusBarIcon;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
 import com.android.systemui.Interpolators;
 import com.android.systemui.R;
 import com.android.systemui.statusbar.notification.NotificationIconDozeHelper;
@@ -652,7 +652,7 @@
         }
         // We'll modify the color if it doesn't pass GAR
         int contrastedColor = mDrawableColor;
-        if (!NotificationColorUtil.satisfiesTextContrast(mCachedContrastBackgroundColor,
+        if (!ContrastColorUtil.satisfiesTextContrast(mCachedContrastBackgroundColor,
                 contrastedColor)) {
             float[] hsl = new float[3];
             ColorUtils.colorToHSL(mDrawableColor, hsl);
@@ -661,7 +661,7 @@
             if (hsl[1] < 0.2f) {
                 contrastedColor = Notification.COLOR_DEFAULT;
             }
-            contrastedColor = NotificationColorUtil.resolveContrastColor(mContext,
+            contrastedColor = ContrastColorUtil.resolveContrastColor(mContext,
                     contrastedColor, mCachedContrastBackgroundColor);
         }
         mContrastedDrawableColor = contrastedColor;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java
index 2b7949b..bd3f203 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java
@@ -27,7 +27,7 @@
 import android.support.v7.graphics.Palette;
 import android.util.LayoutDirection;
 
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
 import com.android.systemui.R;
 
 import java.util.List;
@@ -155,7 +155,7 @@
     }
 
     private int selectForegroundColor(int backgroundColor, Palette palette) {
-        if (NotificationColorUtil.isColorLight(backgroundColor)) {
+        if (ContrastColorUtil.isColorLight(backgroundColor)) {
             return selectForegroundColorForSwatches(palette.getDarkVibrantSwatch(),
                     palette.getVibrantSwatch(),
                     palette.getDarkMutedSwatch(),
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java
index 91a4dda..d4b0be8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java
@@ -31,7 +31,7 @@
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
 import com.android.internal.widget.NotificationActionListLayout;
 import com.android.systemui.Dependency;
 import com.android.systemui.R;
@@ -210,7 +210,7 @@
 
     private int blendColorWithBackground(int color, float alpha) {
         // alpha doesn't go well for color filters, so let's blend it manually
-        return NotificationColorUtil.compositeColors(Color.argb((int) (alpha * 255),
+        return ContrastColorUtil.compositeColors(Color.argb((int) (alpha * 255),
                 Color.red(color), Color.green(color), Color.blue(color)), resolveBackgroundColor());
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java
index 7e2336c..66ba9e9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java
@@ -18,14 +18,11 @@
 
 import android.content.Context;
 import android.graphics.Color;
-import android.os.UserHandle;
-import android.provider.Settings;
 import android.view.View;
 import android.widget.ImageView;
 
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
 import com.android.systemui.R;
-import com.android.systemui.statusbar.stack.NotificationChildrenContainer;
 
 /**
  * A util class for various reusable functions
@@ -33,7 +30,7 @@
 public class NotificationUtils {
     private static final int[] sLocationBase = new int[2];
     private static final int[] sLocationOffset = new int[2];
-    public static boolean isGrayscale(ImageView v, NotificationColorUtil colorUtil) {
+    public static boolean isGrayscale(ImageView v, ContrastColorUtil colorUtil) {
         Object isGrayscale = v.getTag(R.id.icon_is_grayscale);
         if (isGrayscale != null) {
             return Boolean.TRUE.equals(isGrayscale);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
index 44d666e..0cb4e33 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
@@ -11,7 +11,7 @@
 import android.widget.FrameLayout;
 
 import com.android.internal.statusbar.StatusBarIcon;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
 import com.android.systemui.Dependency;
 import com.android.systemui.R;
 import com.android.systemui.statusbar.ExpandableNotificationRow;
@@ -32,7 +32,7 @@
  * normally reserved for notifications.
  */
 public class NotificationIconAreaController implements DarkReceiver {
-    private final NotificationColorUtil mNotificationColorUtil;
+    private final ContrastColorUtil mContrastColorUtil;
     private final NotificationEntryManager mEntryManager;
     private final Runnable mUpdateStatusBarIcons = this::updateStatusBarIcons;
 
@@ -50,7 +50,7 @@
 
     public NotificationIconAreaController(Context context, StatusBar statusBar) {
         mStatusBar = statusBar;
-        mNotificationColorUtil = NotificationColorUtil.getInstance(context);
+        mContrastColorUtil = ContrastColorUtil.getInstance(context);
         mContext = context;
         mEntryManager = Dependency.get(NotificationEntryManager.class);
 
@@ -312,7 +312,7 @@
     private void updateTintForIcon(StatusBarIconView v) {
         boolean isPreL = Boolean.TRUE.equals(v.getTag(R.id.icon_is_pre_L));
         int color = StatusBarIconView.NO_COLOR;
-        boolean colorize = !isPreL || NotificationUtils.isGrayscale(v, mNotificationColorUtil);
+        boolean colorize = !isPreL || NotificationUtils.isGrayscale(v, mContrastColorUtil);
         if (colorize) {
             color = DarkIconDispatcher.getTint(mTintArea, v, mIconTint);
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
index 924aa01..cda9d04 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
@@ -27,7 +27,7 @@
 import android.widget.Button;
 
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
 import com.android.keyguard.KeyguardHostView.OnDismissAction;
 import com.android.systemui.Dependency;
 import com.android.systemui.R;
@@ -114,7 +114,7 @@
         mRippleColor = mContext.getColor(R.color.notification_ripple_untinted_color);
         mRippleColorDarkBg = Color.argb(Color.alpha(mRippleColor),
                 255 /* red */, 255 /* green */, 255 /* blue */);
-        mMinStrokeContrast = NotificationColorUtil.calculateContrast(mDefaultStrokeColor,
+        mMinStrokeContrast = ContrastColorUtil.calculateContrast(mDefaultStrokeColor,
                 mDefaultBackgroundColor);
 
         int spacing = 0;
@@ -574,12 +574,12 @@
         }
         mCurrentBackgroundColor = backgroundColor;
 
-        final boolean dark = !NotificationColorUtil.isColorLight(backgroundColor);
+        final boolean dark = !ContrastColorUtil.isColorLight(backgroundColor);
 
-        int textColor = NotificationColorUtil.ensureTextContrast(
+        int textColor = ContrastColorUtil.ensureTextContrast(
                 dark ? mDefaultTextColorDarkBg : mDefaultTextColor,
                 backgroundColor | 0xff000000, dark);
-        int strokeColor = NotificationColorUtil.ensureContrast(
+        int strokeColor = ContrastColorUtil.ensureContrast(
                 mDefaultStrokeColor, backgroundColor | 0xff000000, dark, mMinStrokeContrast);
         int rippleColor = dark ? mRippleColorDarkBg : mRippleColor;
 
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 7b2071c..8fee107 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java
@@ -42,7 +42,7 @@
 import android.support.test.runner.AndroidJUnit4;
 
 import com.android.internal.statusbar.StatusBarIcon;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
 import com.android.systemui.R;
 import com.android.systemui.SysuiTestCase;
 
@@ -115,7 +115,7 @@
         mIconView.setStaticDrawableColor(Color.WHITE);
         color = mIconView.getContrastedStaticDrawableColor(Color.WHITE);
         assertTrue("Similar colors should be shifted to satisfy contrast",
-                NotificationColorUtil.satisfiesTextContrast(Color.WHITE, color));
+                ContrastColorUtil.satisfiesTextContrast(Color.WHITE, color));
 
         mIconView.setStaticDrawableColor(Color.GREEN);
         color = mIconView.getContrastedStaticDrawableColor(0xcc000000);