Merging Motorola's patch to disable apps when is safe mode.

issue: 16044192

Change-Id: I10069dcdf459ecc71361271e883eabb743d77822
diff --git a/src/com/android/launcher3/FastBitmapDrawable.java b/src/com/android/launcher3/FastBitmapDrawable.java
index 85e9020..ef8d097 100644
--- a/src/com/android/launcher3/FastBitmapDrawable.java
+++ b/src/com/android/launcher3/FastBitmapDrawable.java
@@ -19,15 +19,24 @@
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.ColorFilter;
+import android.graphics.ColorMatrix;
+import android.graphics.ColorMatrixColorFilter;
 import android.graphics.Paint;
 import android.graphics.PixelFormat;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 
 class FastBitmapDrawable extends Drawable {
+
+    private static final ColorMatrix sTempSaturationMatrix = new ColorMatrix();
+    private static final ColorMatrix sTempBrightnessMatrix = new ColorMatrix();
+
+    private final Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG);
     private Bitmap mBitmap;
     private int mAlpha;
-    private final Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG);
+
+    private float mSatutation = 1;
+    private int mBrightness = 0;
 
     FastBitmapDrawable(Bitmap b) {
         mAlpha = 255;
@@ -44,7 +53,7 @@
 
     @Override
     public void setColorFilter(ColorFilter cf) {
-        mPaint.setColorFilter(cf);
+        // No op
     }
 
     @Override
@@ -58,6 +67,7 @@
         mPaint.setAlpha(alpha);
     }
 
+    @Override
     public void setFilterBitmap(boolean filterBitmap) {
         mPaint.setFilterBitmap(filterBitmap);
         mPaint.setAntiAlias(filterBitmap);
@@ -90,4 +100,51 @@
     public Bitmap getBitmap() {
         return mBitmap;
     }
+
+    public float getSaturation() {
+        return mSatutation;
+    }
+
+    public void setSaturation(float saturation) {
+        mSatutation = saturation;
+        updateFilter();
+    }
+
+    public int getBrightness() {
+        return mBrightness;
+    }
+
+    public void addBrightness(int amount) {
+        mBrightness += amount;
+        updateFilter();
+    }
+
+    public void setBrightness(int brightness) {
+        mBrightness = brightness;
+        updateFilter();
+    }
+
+    private void updateFilter() {
+        if (mSatutation != 1 || mBrightness != 0) {
+            sTempSaturationMatrix.setSaturation(mSatutation);
+
+            if (mBrightness != 0) {
+                // Brightness: C-new = C-old*(1-amount) + amount
+                float scale = 1 - mBrightness / 255.0f;
+                sTempBrightnessMatrix.setScale(scale, scale, scale, 1);
+                float[] array = sTempBrightnessMatrix.getArray();
+
+                // Add the amount to RGB components of the matrix, as per the above formula.
+                // Fifth elements in the array correspond to the constant being added to
+                // red, blue, green, and alpha channel respectively.
+                array[4] = mBrightness;
+                array[9] = mBrightness;
+                array[14] = mBrightness;
+                sTempSaturationMatrix.preConcat(sTempBrightnessMatrix);
+            }
+            mPaint.setColorFilter(new ColorMatrixColorFilter(sTempSaturationMatrix));
+        } else {
+            mPaint.setColorFilter(null);
+        }
+    }
 }