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;