Keep disabled FastBitmapDrawables disabled while fast scrolling.

Previously, they were animating to be colored because they were
set to have a FAST_SCROLL_UNLHIGHLIGHTED state. Now they retain
their disabled color when changing fast scroll states.

Specfically, we remove the DISABLED state and instead make it a
property of the FastBitmapDrawable.

Bug: 32642959
Change-Id: I6cb2da134a550c267eebfc756eff8c91a33f028c
diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java
index bb4b2ce..dbb797d 100644
--- a/src/com/android/launcher3/BubbleTextView.java
+++ b/src/com/android/launcher3/BubbleTextView.java
@@ -191,9 +191,7 @@
 
     private void applyIconAndLabel(Bitmap icon, ItemInfo info) {
         FastBitmapDrawable iconDrawable = mLauncher.createIconDrawable(icon);
-        if (info.isDisabled()) {
-            iconDrawable.setState(FastBitmapDrawable.State.DISABLED);
-        }
+        iconDrawable.setIsDisabled(info.isDisabled());
         setIcon(iconDrawable);
         setText(info.title);
         if (info.contentDescription != null) {
@@ -262,10 +260,7 @@
     private void updateIconState() {
         if (mIcon instanceof FastBitmapDrawable) {
             FastBitmapDrawable d = (FastBitmapDrawable) mIcon;
-            if (getTag() instanceof ItemInfo
-                    && ((ItemInfo) getTag()).isDisabled()) {
-                d.animateState(FastBitmapDrawable.State.DISABLED);
-            } else if (isPressed() || mStayPressed) {
+            if (isPressed() || mStayPressed) {
                 d.animateState(FastBitmapDrawable.State.PRESSED);
             } else {
                 d.animateState(FastBitmapDrawable.State.NORMAL);
diff --git a/src/com/android/launcher3/FastBitmapDrawable.java b/src/com/android/launcher3/FastBitmapDrawable.java
index 3870080..7eaae5a 100644
--- a/src/com/android/launcher3/FastBitmapDrawable.java
+++ b/src/com/android/launcher3/FastBitmapDrawable.java
@@ -34,6 +34,8 @@
 import android.view.animation.DecelerateInterpolator;
 
 public class FastBitmapDrawable extends Drawable {
+    private static final float DISABLED_DESATURATION = 1f;
+    private static final float DISABLED_BRIGHTNESS = 0.5f;
 
     /**
      * The possible states that a FastBitmapDrawable can be in.
@@ -43,8 +45,7 @@
         NORMAL                      (0f, 0f, 1f, new DecelerateInterpolator()),
         PRESSED                     (0f, 100f / 255f, 1f, CLICK_FEEDBACK_INTERPOLATOR),
         FAST_SCROLL_HIGHLIGHTED     (0f, 0f, 1.15f, new DecelerateInterpolator()),
-        FAST_SCROLL_UNHIGHLIGHTED   (0f, 0f, 1f, new DecelerateInterpolator()),
-        DISABLED                    (1f, 0.5f, 1f, new DecelerateInterpolator());
+        FAST_SCROLL_UNHIGHLIGHTED   (0f, 0f, 1f, new DecelerateInterpolator());
 
         public final float desaturation;
         public final float brightness;
@@ -96,6 +97,7 @@
     private final Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.ANTI_ALIAS_FLAG);
     private final Bitmap mBitmap;
     private State mState = State.NORMAL;
+    private boolean mIsDisabled;
 
     // The saturation and brightness are values that are mapped to REDUCED_FILTER_VALUE_SPACE and
     // as a result, can be used to compose the key for the cached ColorMatrixColorFilters
@@ -177,13 +179,14 @@
         if (mState != newState) {
             mState = newState;
 
+            float desaturation = mIsDisabled ? DISABLED_DESATURATION : newState.desaturation;
+            float brightness = mIsDisabled ? DISABLED_BRIGHTNESS: newState.brightness;
+
             mPropertyAnimator = cancelAnimator(mPropertyAnimator);
             mPropertyAnimator = new AnimatorSet();
             mPropertyAnimator.playTogether(
-                    ObjectAnimator
-                            .ofFloat(this, "desaturation", newState.desaturation),
-                    ObjectAnimator
-                            .ofFloat(this, "brightness", newState.brightness));
+                    ObjectAnimator.ofFloat(this, "desaturation", desaturation),
+                    ObjectAnimator.ofFloat(this, "brightness", brightness));
             mPropertyAnimator.setInterpolator(newState.interpolator);
             mPropertyAnimator.setDuration(getDurationForStateChange(prevState, newState));
             mPropertyAnimator.setStartDelay(getStartDelayForStateChange(prevState, newState));
@@ -204,13 +207,17 @@
 
             mPropertyAnimator = cancelAnimator(mPropertyAnimator);
 
-            setDesaturation(newState.desaturation);
-            setBrightness(newState.brightness);
+            invalidateDesaturationAndBrightness();
             return true;
         }
         return false;
     }
 
+    private void invalidateDesaturationAndBrightness() {
+        setDesaturation(mIsDisabled ? DISABLED_DESATURATION : mState.desaturation);
+        setBrightness(mIsDisabled ? DISABLED_BRIGHTNESS: mState.brightness);
+    }
+
     /**
      * Returns the current state.
      */
@@ -218,6 +225,13 @@
         return mState;
     }
 
+    public void setIsDisabled(boolean isDisabled) {
+        if (mIsDisabled != isDisabled) {
+            mIsDisabled = isDisabled;
+            invalidateDesaturationAndBrightness();
+        }
+    }
+
     /**
      * Returns the duration for the state change animation.
      */
diff --git a/src/com/android/launcher3/PendingAppWidgetHostView.java b/src/com/android/launcher3/PendingAppWidgetHostView.java
index f01c7f2..bf39774 100644
--- a/src/com/android/launcher3/PendingAppWidgetHostView.java
+++ b/src/com/android/launcher3/PendingAppWidgetHostView.java
@@ -134,7 +134,7 @@
             //   3) Setup icon in the center and app icon in the top right corner.
             if (mDisabledForSafeMode) {
                 FastBitmapDrawable disabledIcon = mLauncher.createIconDrawable(mIcon);
-                disabledIcon.setState(FastBitmapDrawable.State.DISABLED);
+                disabledIcon.setIsDisabled(true);
                 mCenterDrawable = disabledIcon;
                 mSettingIconDrawable = null;
             } else if (isReadyForClickSetup()) {
diff --git a/src/com/android/launcher3/PreloadIconDrawable.java b/src/com/android/launcher3/PreloadIconDrawable.java
index 8295b45..efc0eac 100644
--- a/src/com/android/launcher3/PreloadIconDrawable.java
+++ b/src/com/android/launcher3/PreloadIconDrawable.java
@@ -177,10 +177,8 @@
             // Set the paint color only when the level changes, so that the dominant color
             // is only calculated when needed.
             mPaint.setColor(getIndicatorColor());
-        }
-        if (mIcon instanceof FastBitmapDrawable) {
-            ((FastBitmapDrawable) mIcon).setState(level <= 0 ?
-                    FastBitmapDrawable.State.DISABLED : FastBitmapDrawable.State.NORMAL);
+        } else if (mIcon instanceof FastBitmapDrawable) {
+            ((FastBitmapDrawable) mIcon).setIsDisabled(true);
         }
 
         invalidateSelf();