Use MultiValueAlpha in ClearAllButton

Bug: 389209338
Flag: EXEMPT refactor
Test: m
Change-Id: Ia6f3f9059444161829c76373b80b354a155fd69d
diff --git a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt
index 04e1905..b230fa6 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt
+++ b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt
@@ -38,7 +38,6 @@
 import com.android.launcher3.states.StateAnimationConfig.SKIP_OVERVIEW
 import com.android.launcher3.util.MultiPropertyFactory.MULTI_PROPERTY_VALUE
 import com.android.quickstep.util.AnimUtils
-import com.android.quickstep.views.ClearAllButton
 import com.android.quickstep.views.RecentsView
 import com.android.quickstep.views.RecentsView.ADJACENT_PAGE_HORIZONTAL_OFFSET
 import com.android.quickstep.views.RecentsView.CONTENT_ALPHA
@@ -288,8 +287,8 @@
         val clearAllButtonAlpha =
             if (state.areElementsVisible(launcher, LauncherState.CLEAR_ALL_BUTTON)) 1f else 0f
         propertySetter.setFloat(
-            recentsView.clearAllButton,
-            ClearAllButton.VISIBILITY_ALPHA,
+            recentsView.clearAllButton.visibilityAlphaProperty,
+            MULTI_PROPERTY_VALUE,
             clearAllButtonAlpha,
             LINEAR,
         )
diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java
index 537092f..51f2a33 100644
--- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java
+++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java
@@ -52,7 +52,6 @@
 import com.android.launcher3.anim.PropertySetter;
 import com.android.launcher3.statemanager.StateManager.StateHandler;
 import com.android.launcher3.states.StateAnimationConfig;
-import com.android.quickstep.views.ClearAllButton;
 import com.android.quickstep.views.RecentsView;
 import com.android.quickstep.views.RecentsViewContainer;
 
@@ -98,8 +97,8 @@
     private void setProperties(RecentsState state, StateAnimationConfig config,
             PropertySetter setter) {
         float clearAllButtonAlpha = state.hasClearAllButton() ? 1 : 0;
-        setter.setFloat(mRecentsView.getClearAllButton(), ClearAllButton.VISIBILITY_ALPHA,
-                clearAllButtonAlpha, LINEAR);
+        setter.setFloat(mRecentsView.getClearAllButton().visibilityAlphaProperty,
+                MULTI_PROPERTY_VALUE, clearAllButtonAlpha, LINEAR);
         if (mRecentsView.getAddDeskButton() != null) {
             float addDeskButtonAlpha = state.hasAddDeskButton() ? 1 : 0;
             setter.setFloat(mRecentsView.getAddDeskButton().getVisibilityAlphaProperty(),
diff --git a/quickstep/src/com/android/quickstep/views/ClearAllButton.kt b/quickstep/src/com/android/quickstep/views/ClearAllButton.kt
index ef62597..6420ece 100644
--- a/quickstep/src/com/android/quickstep/views/ClearAllButton.kt
+++ b/quickstep/src/com/android/quickstep/views/ClearAllButton.kt
@@ -19,10 +19,12 @@
 import android.graphics.Canvas
 import android.graphics.Rect
 import android.util.AttributeSet
-import android.util.FloatProperty
+import android.view.View
 import android.widget.Button
 import com.android.launcher3.Flags.enableFocusOutline
 import com.android.launcher3.R
+import com.android.launcher3.util.MultiPropertyFactory
+import com.android.launcher3.util.MultiValueAlpha
 import com.android.quickstep.util.BorderAnimator
 import com.android.quickstep.util.BorderAnimator.Companion.createSimpleBorderAnimator
 import kotlin.math.abs
@@ -31,29 +33,46 @@
 class ClearAllButton @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
     Button(context, attrs) {
 
-    var scrollAlpha = 1f
-        set(value) {
-            field = value
-            updateAlpha()
+    private enum class Alpha {
+        SCROLL,
+        CONTENT,
+        VISIBILITY,
+        DISMISS,
+    }
+
+    private val clearAllButtonAlpha =
+        object : MultiValueAlpha(this, Alpha.entries.size) {
+            override fun apply(value: Float) {
+                super.apply(value)
+                isClickable = value >= 1f
+            }
         }
 
-    var contentAlpha = 1f
+    var scrollAlpha
         set(value) {
-            field = value
-            updateAlpha()
+            clearAllButtonAlpha.get(Alpha.SCROLL.ordinal).value = value
         }
+        get() = clearAllButtonAlpha.get(Alpha.SCROLL.ordinal).value
 
-    var visibilityAlpha = 1f
+    var contentAlpha
         set(value) {
-            field = value
-            updateAlpha()
+            clearAllButtonAlpha.get(Alpha.CONTENT.ordinal).value = value
         }
+        get() = clearAllButtonAlpha.get(Alpha.CONTENT.ordinal).value
 
-    var dismissAlpha = 1f
+    @JvmField
+    val visibilityAlphaProperty: MultiPropertyFactory<View>.MultiProperty =
+        clearAllButtonAlpha.get(Alpha.VISIBILITY.ordinal)
+
+    var dismissAlpha
         set(value) {
-            field = value
-            updateAlpha()
+            dismissAlphaProperty.value = value
         }
+        get() = dismissAlphaProperty.value
+
+    @JvmField
+    val dismissAlphaProperty: MultiPropertyFactory<View>.MultiProperty =
+        clearAllButtonAlpha.get(Alpha.DISMISS.ordinal)
 
     var fullscreenProgress = 1f
         set(value) {
@@ -198,12 +217,6 @@
             )
     }
 
-    private fun updateAlpha() {
-        val alpha = scrollAlpha * contentAlpha * visibilityAlpha * dismissAlpha
-        this.alpha = alpha
-        isClickable = alpha >= 1f
-    }
-
     fun getScrollAdjustment(fullscreenEnabled: Boolean, gridEnabled: Boolean): Float {
         var scrollAdjustment = 0f
         if (fullscreenEnabled) {
@@ -244,26 +257,4 @@
         if (fullscreenProgress > 0) endTranslation else 0f
 
     private fun getGridTrans(endTranslation: Float) = if (gridProgress > 0) endTranslation else 0f
-
-    companion object {
-        @JvmField
-        val VISIBILITY_ALPHA: FloatProperty<ClearAllButton> =
-            object : FloatProperty<ClearAllButton>("visibilityAlpha") {
-                override fun setValue(clearAllButton: ClearAllButton, value: Float) {
-                    clearAllButton.visibilityAlpha = value
-                }
-
-                override fun get(clearAllButton: ClearAllButton) = clearAllButton.visibilityAlpha
-            }
-
-        @JvmField
-        val DISMISS_ALPHA: FloatProperty<ClearAllButton> =
-            object : FloatProperty<ClearAllButton>("dismissAlpha") {
-                override fun setValue(clearAllButton: ClearAllButton, value: Float) {
-                    clearAllButton.dismissAlpha = value
-                }
-
-                override fun get(clearAllButton: ClearAllButton) = clearAllButton.dismissAlpha
-            }
-    }
 }
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 6b91df1..983c393 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -66,7 +66,6 @@
 import static com.android.quickstep.BaseContainerInterface.getTaskDimension;
 import static com.android.quickstep.TaskUtils.checkCurrentOrManagedUserId;
 import static com.android.quickstep.util.LogUtils.splitFailureMessage;
-import static com.android.quickstep.views.ClearAllButton.DISMISS_ALPHA;
 import static com.android.quickstep.views.OverviewActionsView.HIDDEN_ACTIONS_IN_MENU;
 import static com.android.quickstep.views.OverviewActionsView.HIDDEN_DESKTOP;
 import static com.android.quickstep.views.OverviewActionsView.HIDDEN_NON_ZERO_ROTATION;
@@ -3962,7 +3961,8 @@
 
                 // Change alpha of clear all if translating grid to hide it
                 if (isClearAllHidden) {
-                    anim.setFloat(mClearAllButton, DISMISS_ALPHA, 0, LINEAR);
+                    anim.setFloat(mClearAllButton.dismissAlphaProperty, MULTI_PROPERTY_VALUE, 0,
+                            LINEAR);
                     anim.addListener(new AnimatorListenerAdapter() {
                         @Override
                         public void onAnimationEnd(Animator animation) {