Add header protection for Taskbar All Apps search bar.

Works similar to ActivityAllAppsContainerView<->ScrimView
implementation, except utilizes AbstractSlideInView's builtin scrim.

Test: Manual
Flag: ENABLE_ALL_APPS_SEARCH_IN_TASKBAR=false
Bug: 216683257
Change-Id: Ide41ac47ecffc232fffac34c6bfdda67c1da549d
diff --git a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContainerView.java b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContainerView.java
index 623e234..b4b83f6 100644
--- a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContainerView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContainerView.java
@@ -19,15 +19,21 @@
 import android.util.AttributeSet;
 import android.view.View;
 
+import androidx.annotation.Nullable;
+
 import com.android.launcher3.R;
 import com.android.launcher3.allapps.ActivityAllAppsContainerView;
 import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.taskbar.overlay.TaskbarOverlayContext;
 
+import java.util.Optional;
+
 /** All apps container accessible from taskbar. */
 public class TaskbarAllAppsContainerView extends
         ActivityAllAppsContainerView<TaskbarOverlayContext> {
 
+    private @Nullable OnInvalidateHeaderListener mOnInvalidateHeaderListener;
+
     public TaskbarAllAppsContainerView(Context context, AttributeSet attrs) {
         this(context, attrs, 0);
     }
@@ -36,6 +42,10 @@
         super(context, attrs, defStyleAttr);
     }
 
+    void setOnInvalidateHeaderListener(OnInvalidateHeaderListener onInvalidateHeaderListener) {
+        mOnInvalidateHeaderListener = onInvalidateHeaderListener;
+    }
+
     @Override
     protected View inflateSearchBox() {
         if (isSearchSupported()) {
@@ -54,6 +64,13 @@
     }
 
     @Override
+    public void invalidateHeader() {
+        super.invalidateHeader();
+        Optional.ofNullable(mOnInvalidateHeaderListener).ifPresent(
+                OnInvalidateHeaderListener::onInvalidateHeader);
+    }
+
+    @Override
     protected boolean isSearchSupported() {
         return FeatureFlags.ENABLE_ALL_APPS_SEARCH_IN_TASKBAR.get();
     }
@@ -63,4 +80,8 @@
         // All apps is always open
         return true;
     }
+
+    interface OnInvalidateHeaderListener {
+        void onInvalidateHeader();
+    }
 }
diff --git a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsSlideInView.java b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsSlideInView.java
index d69769a..966e5b1 100644
--- a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsSlideInView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsSlideInView.java
@@ -19,6 +19,7 @@
 
 import android.animation.PropertyValuesHolder;
 import android.content.Context;
+import android.graphics.Canvas;
 import android.graphics.Rect;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
@@ -109,12 +110,13 @@
         mAppsView = findViewById(R.id.apps_view);
         mContent = mAppsView;
 
+        // Setup header protection for search bar, if enabled.
+        if (FeatureFlags.ENABLE_ALL_APPS_SEARCH_IN_TASKBAR.get()) {
+            mAppsView.setOnInvalidateHeaderListener(this::invalidate);
+        }
+
         DeviceProfile dp = mActivityContext.getDeviceProfile();
         setShiftRange(dp.allAppsShiftRange);
-
-        setContentBackgroundWithParent(
-                getContext().getDrawable(R.drawable.bg_rounded_corner_bottom_sheet),
-                mAppsView.getBottomSheetBackground());
     }
 
     @Override
@@ -130,6 +132,12 @@
     }
 
     @Override
+    protected void dispatchDraw(Canvas canvas) {
+        mAppsView.drawOnScrimWithScale(canvas, mSlideInViewScale.value);
+        super.dispatchDraw(canvas);
+    }
+
+    @Override
     protected void onScaleProgressChanged() {
         super.onScaleProgressChanged();
         mAppsView.setClipChildren(!mIsBackProgressing);
diff --git a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
index b485780..689ee90 100644
--- a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
@@ -842,8 +842,8 @@
     protected void updateBackground(DeviceProfile deviceProfile) {
         mBottomSheetBackground.setVisibility(deviceProfile.isTablet ? View.VISIBLE : View.GONE);
         // Note: For tablets, the opaque background and header protection are added in drawOnScrim.
-        // For the taskbar entrypoint, the scrim is drawn differently, so a static background is
-        // added in TaskbarAllAppsContainerView and header protection is not yet supported.
+        // For the taskbar entrypoint, the scrim is drawn by its abstract slide in view container,
+        // so its header protection is derived from this scrim instead.
     }
 
     private void onAppsUpdated() {
diff --git a/src/com/android/launcher3/views/AbstractSlideInView.java b/src/com/android/launcher3/views/AbstractSlideInView.java
index 5730582..5f0683e 100644
--- a/src/com/android/launcher3/views/AbstractSlideInView.java
+++ b/src/com/android/launcher3/views/AbstractSlideInView.java
@@ -99,7 +99,7 @@
     protected @Nullable OnCloseListener mOnCloseBeginListener;
     protected List<OnCloseListener> mOnCloseListeners = new ArrayList<>();
 
-    private final AnimatedFloat mSlideInViewScale =
+    protected final AnimatedFloat mSlideInViewScale =
             new AnimatedFloat(this::onScaleProgressChanged, VIEW_NO_SCALE);
     protected boolean mIsBackProgressing;
     @Nullable private Drawable mContentBackground;