Merge "Removed hidden mutable APIs from PorterDuffColorFilter"
diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt
index a1e71f4..9739684 100644
--- a/config/hiddenapi-light-greylist.txt
+++ b/config/hiddenapi-light-greylist.txt
@@ -793,8 +793,6 @@
 Landroid/graphics/NinePatch;->mBitmap:Landroid/graphics/Bitmap;
 Landroid/graphics/Picture;->mNativePicture:J
 Landroid/graphics/PixelXorXfermode;-><init>(I)V
-Landroid/graphics/PorterDuffColorFilter;->setColor(I)V
-Landroid/graphics/PorterDuffColorFilter;->setMode(Landroid/graphics/PorterDuff$Mode;)V
 Landroid/graphics/Rect;->scale(F)V
 Landroid/graphics/Region;-><init>(JI)V
 Landroid/graphics/Region;->mNativeRegion:J
diff --git a/graphics/java/android/graphics/PorterDuffColorFilter.java b/graphics/java/android/graphics/PorterDuffColorFilter.java
index 01d5825..88a6322 100644
--- a/graphics/java/android/graphics/PorterDuffColorFilter.java
+++ b/graphics/java/android/graphics/PorterDuffColorFilter.java
@@ -35,8 +35,6 @@
      * @param mode The porter-duff mode that is applied
      *
      * @see Color
-     * @see #setColor(int)
-     * @see #setMode(android.graphics.PorterDuff.Mode)
      */
     public PorterDuffColorFilter(@ColorInt int color, @NonNull PorterDuff.Mode mode) {
         mColor = color;
@@ -48,7 +46,6 @@
      * is applied.
      *
      * @see Color
-     * @see #setColor(int)
      *
      * @hide
      */
@@ -58,30 +55,10 @@
     }
 
     /**
-     * Specifies the color to tint the source pixels with when this color
-     * filter is applied.
-     *
-     * @param color An ARGB {@link Color color}
-     *
-     * @see Color
-     * @see #getColor()
-     * @see #getMode()
-     *
-     * @hide
-     */
-    public void setColor(@ColorInt int color) {
-        if (mColor != color) {
-            mColor = color;
-            discardNativeInstance();
-        }
-    }
-
-    /**
      * Returns the Porter-Duff mode used to composite this color filter's
      * color with the source pixel when this filter is applied.
      *
      * @see PorterDuff
-     * @see #setMode(android.graphics.PorterDuff.Mode)
      *
      * @hide
      */
@@ -89,24 +66,6 @@
         return mMode;
     }
 
-    /**
-     * Specifies the Porter-Duff mode to use when compositing this color
-     * filter's color with the source pixel at draw time.
-     *
-     * @see PorterDuff
-     * @see #getMode()
-     * @see #getColor()
-     *
-     * @hide
-     */
-    public void setMode(@NonNull PorterDuff.Mode mode) {
-        if (mode == null) {
-            throw new IllegalArgumentException("mode must be non-null");
-        }
-        mMode = mode;
-        discardNativeInstance();
-    }
-
     @Override
     long createNativeInstance() {
         return native_CreatePorterDuffFilter(mColor, mMode.nativeInt);
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index 8af2fd8..b77d74a 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -16,11 +16,6 @@
 
 package android.graphics.drawable;
 
-import com.android.internal.R;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
 import android.annotation.AttrRes;
 import android.annotation.ColorInt;
 import android.annotation.IntRange;
@@ -57,6 +52,11 @@
 import android.util.Xml;
 import android.view.View;
 
+import com.android.internal.R;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -1516,12 +1516,11 @@
         }
 
         final int color = tint.getColorForState(getState(), Color.TRANSPARENT);
-        if (tintFilter == null) {
+        if (tintFilter == null || tintFilter.getColor() != color
+                || tintFilter.getMode() != tintMode) {
             return new PorterDuffColorFilter(color, tintMode);
         }
 
-        tintFilter.setColor(color);
-        tintFilter.setMode(tintMode);
         return tintFilter;
     }
 
diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java
index 0da61c2..266a6ac 100644
--- a/graphics/java/android/graphics/drawable/RippleDrawable.java
+++ b/graphics/java/android/graphics/drawable/RippleDrawable.java
@@ -888,7 +888,10 @@
             // The ripple timing depends on the paint's alpha value, so we need
             // to push just the alpha channel into the paint and let the filter
             // handle the full-alpha color.
-            mMaskColorFilter.setColor(color | 0xFF000000);
+            int maskColor = color | 0xFF000000;
+            if (mMaskColorFilter.getColor() != maskColor) {
+                mMaskColorFilter = new PorterDuffColorFilter(maskColor, mMaskColorFilter.getMode());
+            }
             p.setColor(color & 0xFF000000);
             p.setColorFilter(mMaskColorFilter);
             p.setShader(mMaskShader);
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java b/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java
index 54d1aba..148b7a7 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java
@@ -16,6 +16,7 @@
 
 package com.android.settingslib.drawable;
 
+import android.annotation.ColorInt;
 import android.annotation.DrawableRes;
 import android.annotation.NonNull;
 import android.app.admin.DevicePolicyManager;
@@ -251,11 +252,8 @@
                 mPaint.setColorFilter(null);
             } else {
                 int color = mTintColor.getColorForState(getState(), mTintColor.getDefaultColor());
-                if (mPaint.getColorFilter() == null) {
+                if (shouldUpdateColorFilter(color, mTintMode)) {
                     mPaint.setColorFilter(new PorterDuffColorFilter(color, mTintMode));
-                } else {
-                    ((PorterDuffColorFilter) mPaint.getColorFilter()).setMode(mTintMode);
-                    ((PorterDuffColorFilter) mPaint.getColorFilter()).setColor(color);
                 }
             }
 
@@ -263,6 +261,18 @@
         }
     }
 
+    private boolean shouldUpdateColorFilter(@ColorInt int color, PorterDuff.Mode mode) {
+        ColorFilter colorFilter = mPaint.getColorFilter();
+        if (colorFilter instanceof PorterDuffColorFilter) {
+            PorterDuffColorFilter porterDuffColorFilter = (PorterDuffColorFilter) colorFilter;
+            int currentColor = porterDuffColorFilter.getColor();
+            PorterDuff.Mode currentMode = porterDuffColorFilter.getMode();
+            return currentColor != color || currentMode != mode;
+        } else {
+            return false;
+        }
+    }
+
     @Override
     public void setAlpha(int alpha) {
         mPaint.setAlpha(alpha);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java
index 1807465..c99bdef 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java
@@ -26,6 +26,7 @@
 import android.graphics.Color;
 import android.graphics.Point;
 import android.graphics.PorterDuff;
+import android.graphics.PorterDuff.Mode;
 import android.graphics.PorterDuffColorFilter;
 import android.graphics.PorterDuffXfermode;
 import android.graphics.Rect;
@@ -272,12 +273,18 @@
                     tintAmount);
             drawable.setColors(mainTinted, secondaryTinted, animated);
         } else {
-            if (mColorFilter == null) {
-                mColorFilter = new PorterDuffColorFilter(mTintColor, PorterDuff.Mode.SRC_OVER);
+            boolean hasAlpha = Color.alpha(mTintColor) != 0;
+            if (hasAlpha) {
+                PorterDuff.Mode targetMode = mColorFilter == null ? Mode.SRC_OVER :
+                    mColorFilter.getMode();
+                if (mColorFilter == null || mColorFilter.getColor() != mTintColor) {
+                    mColorFilter = new PorterDuffColorFilter(mTintColor, targetMode);
+                }
             } else {
-                mColorFilter.setColor(mTintColor);
+                mColorFilter = null;
             }
-            mDrawable.setColorFilter(Color.alpha(mTintColor) == 0 ? null : mColorFilter);
+
+            mDrawable.setColorFilter(mColorFilter);
             mDrawable.invalidateSelf();
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationIconDozeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationIconDozeHelper.java
index 9f79ef2..43e45b1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationIconDozeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationIconDozeHelper.java
@@ -16,9 +16,10 @@
 
 package com.android.systemui.statusbar.notification;
 
+import android.annotation.Nullable;
 import android.content.Context;
 import android.graphics.Color;
-import android.graphics.PorterDuff;
+import android.graphics.PorterDuff.Mode;
 import android.graphics.PorterDuffColorFilter;
 import android.graphics.drawable.Drawable;
 import android.widget.ImageView;
@@ -29,8 +30,9 @@
 
     private final int mImageDarkAlpha;
     private final int mImageDarkColor = 0xffffffff;
-    private final PorterDuffColorFilter mImageColorFilter = new PorterDuffColorFilter(
-            0, PorterDuff.Mode.SRC_ATOP);
+
+    @Nullable
+    private PorterDuffColorFilter mImageColorFilter = null;
 
     private int mColor = Color.BLACK;
 
@@ -80,7 +82,9 @@
 
     private void updateImageColorFilter(ImageView target, float intensity) {
         int color = NotificationUtils.interpolateColors(mColor, mImageDarkColor, intensity);
-        mImageColorFilter.setColor(color);
+        if (mImageColorFilter == null || mImageColorFilter.getColor() != color) {
+            mImageColorFilter = new PorterDuffColorFilter(color, Mode.SRC_ATOP);
+        }
         Drawable imageDrawable = target.getDrawable();
 
         // Also, the notification might have been modified during the animation, so background
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
index 4bca797..5ec822d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
@@ -183,20 +183,19 @@
 
         @Override
         public void setTint(int color) {
-            if (mTintFilter == null) {
-                mTintFilter = new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN);
-            } else {
-                mTintFilter.setColor(color);
+            PorterDuff.Mode targetMode = mTintFilter == null ? Mode.SRC_IN :
+                mTintFilter.getMode();
+            if (mTintFilter == null || mTintFilter.getColor() != color) {
+                mTintFilter = new PorterDuffColorFilter(color, targetMode);
             }
             invalidateSelf();
         }
 
         @Override
         public void setTintMode(Mode tintMode) {
-            if (mTintFilter == null) {
-                mTintFilter = new PorterDuffColorFilter(0, tintMode);
-            } else {
-                mTintFilter.setMode(tintMode);
+            int targetColor = mTintFilter == null ? 0 : mTintFilter.getColor();
+            if (mTintFilter == null || mTintFilter.getMode() != tintMode) {
+                mTintFilter = new PorterDuffColorFilter(targetColor, tintMode);
             }
             invalidateSelf();
         }
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java
index a7bdabd..0787d82 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java
@@ -106,7 +106,7 @@
             mPorterDuffColor = porterDuffColor;
             final PorterDuffColorFilter filter =
                     (PorterDuffColorFilter) mBlendPaint.getColorFilter();
-            filter.setColor(mPorterDuffColor);
+            mBlendPaint.setColorFilter(new PorterDuffColorFilter(porterDuffColor, filter.getMode()));
             invalidate();
         }