From 1bc23b76621219ce289c9a5606616dbae35b2578 Mon Sep 17 00:00:00 2001 From: Brian Isganitis Date: Thu, 24 Feb 2022 18:57:59 -0800 Subject: [PATCH] Ignore touches in taskbar and all apps windows during system drag. Touches are ignored as soon as we want to start system drag so that system drag can start sooner (i.e. before any AbstractFloatingView animations finish). This approach utilizes ViewTreeObserverWrapper's compute insets listener by temporarily setting the touch region to empty. The taskbar window remains fullscreen until the drag finishes so the touch region is reset at the right point. Similarly, the all apps window is kept open during its drag operations until the drag finishes. System drag state is now exposed through the drag controller to skip predrag. Test: Manual by dragging to split screen and triggering dismissal animation from both windows. Verified predrag works. Fix: 221104066 Fix: 220070070 Change-Id: I424106269c841f58cbe5338d30b6c33fbd889019 --- .../launcher3/taskbar/BaseTaskbarContext.java | 3 ++ .../taskbar/TaskbarActivityContext.java | 17 ++++++++++ .../taskbar/TaskbarDragController.java | 6 ++++ .../taskbar/TaskbarDragLayerController.java | 7 +++-- .../allapps/TaskbarAllAppsContext.java | 31 ++++++++++++++++++- .../allapps/TaskbarAllAppsController.java | 11 +++++-- .../allapps/TaskbarAllAppsViewController.java | 2 +- 7 files changed, 70 insertions(+), 7 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java b/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java index 17635df355..27e89baa90 100644 --- a/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java @@ -64,6 +64,9 @@ public abstract class BaseTaskbarContext extends ContextThemeWrapper implements /** Callback invoked when a drag is initiated within this context. */ public abstract void onDragStart(); + /** Callback invoked when a drag is finished within this context. */ + public abstract void onDragEnd(); + /** Callback invoked when a popup is shown or closed within this context. */ public abstract void onPopupVisibilityChanged(boolean isVisible); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index 2c2cc434ac..fa0a60684f 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -21,6 +21,7 @@ import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL; +import static com.android.launcher3.AbstractFloatingView.TYPE_ALL; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_FOLDER_OPEN; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_QUICK_SETTINGS_EXPANDED; @@ -385,6 +386,11 @@ public class TaskbarActivityContext extends BaseTaskbarContext { setTaskbarWindowFullscreen(true); } + @Override + public void onDragEnd() { + maybeSetTaskbarWindowNotFullscreen(); + } + @Override public void onPopupVisibilityChanged(boolean isVisible) { setTaskbarWindowFocusable(isVisible); @@ -488,6 +494,17 @@ public class TaskbarActivityContext extends BaseTaskbarContext { setTaskbarWindowHeight(fullscreen ? MATCH_PARENT : mLastRequestedNonFullscreenHeight); } + /** + * Reverts Taskbar window to its original size, if all floating views are closed and there is + * no system drag operation in progress. + */ + void maybeSetTaskbarWindowNotFullscreen() { + if (AbstractFloatingView.getAnyView(this, TYPE_ALL) == null + && !mControllers.taskbarDragController.isSystemDragInProgress()) { + setTaskbarWindowFullscreen(false); + } + } + public boolean isTaskbarWindowFullscreen() { return mIsFullscreen; } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java index 12b11959e8..24c5d0e75b 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java @@ -391,11 +391,17 @@ public class TaskbarDragController extends DragController im return super.isDragging() || mIsSystemDragInProgress; } + /** {@code true} if the system is currently handling the drag. */ + public boolean isSystemDragInProgress() { + return mIsSystemDragInProgress; + } + private void maybeOnDragEnd() { if (!isDragging()) { ((BubbleTextView) mDragObject.originalView).getIcon().setIsDisabled(false); mControllers.taskbarAutohideSuspendController.updateFlag( TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_DRAGGING, false); + mActivity.onDragEnd(); } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java index 1bd76b99bb..cdac497c4c 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java @@ -181,6 +181,9 @@ public class TaskbarDragLayerController implements TaskbarControllers.LoggableTa } else if (!mControllers.uiController.isTaskbarTouchable()) { // Let touches pass through us. insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_REGION); + } else if (mControllers.taskbarDragController.isSystemDragInProgress()) { + // Let touches pass through us. + insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_REGION); } else if (mControllers.taskbarViewController.areIconsVisible() || AbstractFloatingView.getOpenView(mActivity, TYPE_ALL) != null || mActivity.isNavBarKidsModeActive()) { @@ -208,9 +211,7 @@ public class TaskbarDragLayerController implements TaskbarControllers.LoggableTa * Called when a child is removed from TaskbarDragLayer. */ public void onDragLayerViewRemoved() { - if (AbstractFloatingView.getAnyView(mActivity, TYPE_ALL) == null) { - mActivity.setTaskbarWindowFullscreen(false); - } + mActivity.maybeSetTaskbarWindowNotFullscreen(); } /** diff --git a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContext.java b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContext.java index 4245119e7f..7f3add3761 100644 --- a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContext.java @@ -19,6 +19,8 @@ import static android.view.KeyEvent.ACTION_UP; import static android.view.KeyEvent.KEYCODE_BACK; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; +import static com.android.systemui.shared.system.ViewTreeObserverWrapper.InsetsInfo.TOUCHABLE_INSETS_REGION; + import android.content.Context; import android.view.KeyEvent; import android.view.View; @@ -37,6 +39,9 @@ import com.android.launcher3.taskbar.TaskbarStashController; import com.android.launcher3.util.OnboardingPrefs; import com.android.launcher3.util.TouchController; import com.android.launcher3.views.BaseDragLayer; +import com.android.systemui.shared.system.ViewTreeObserverWrapper; +import com.android.systemui.shared.system.ViewTreeObserverWrapper.InsetsInfo; +import com.android.systemui.shared.system.ViewTreeObserverWrapper.OnComputeInsetsListener; /** * Window context for the taskbar all apps overlay. @@ -48,6 +53,7 @@ class TaskbarAllAppsContext extends BaseTaskbarContext { private final TaskbarActivityContext mTaskbarContext; private final OnboardingPrefs mOnboardingPrefs; + private final TaskbarAllAppsController mWindowController; private final TaskbarAllAppsViewController mAllAppsViewController; private final TaskbarDragController mDragController; private final TaskbarAllAppsDragLayer mDragLayer; @@ -66,6 +72,7 @@ class TaskbarAllAppsContext extends BaseTaskbarContext { mDragLayer = new TaskbarAllAppsDragLayer(this); TaskbarAllAppsSlideInView slideInView = (TaskbarAllAppsSlideInView) mLayoutInflater.inflate( R.layout.taskbar_all_apps, mDragLayer, false); + mWindowController = windowController; mAllAppsViewController = new TaskbarAllAppsViewController( this, slideInView, @@ -127,11 +134,17 @@ class TaskbarAllAppsContext extends BaseTaskbarContext { @Override public void onDragStart() {} + @Override + public void onDragEnd() { + mWindowController.maybeCloseWindow(); + } + @Override public void onPopupVisibilityChanged(boolean isVisible) {} /** Root drag layer for this context. */ - private static class TaskbarAllAppsDragLayer extends BaseDragLayer { + private static class TaskbarAllAppsDragLayer extends + BaseDragLayer implements OnComputeInsetsListener { private TaskbarAllAppsDragLayer(Context context) { super(context, null, 1); @@ -142,9 +155,17 @@ class TaskbarAllAppsContext extends BaseTaskbarContext { @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); + ViewTreeObserverWrapper.addOnComputeInsetsListener( + getViewTreeObserver(), this); mActivity.mAllAppsViewController.show(); } + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + ViewTreeObserverWrapper.removeOnComputeInsetsListener(this); + } + @Override public void recreateControllers() { mControllers = new TouchController[]{mActivity.mDragController}; @@ -160,5 +181,13 @@ class TaskbarAllAppsContext extends BaseTaskbarContext { } return super.dispatchKeyEvent(event); } + + @Override + public void onComputeInsets(InsetsInfo inoutInfo) { + if (mActivity.mDragController.isSystemDragInProgress()) { + inoutInfo.touchableRegion.setEmpty(); + inoutInfo.setTouchableInsets(TOUCHABLE_INSETS_REGION); + } + } } } diff --git a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java index 93024521d4..87133fcb5a 100644 --- a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java +++ b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java @@ -17,6 +17,8 @@ package com.android.launcher3.taskbar.allapps; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; +import static com.android.launcher3.AbstractFloatingView.TYPE_ALL; + import android.content.Context; import android.graphics.PixelFormat; import android.view.Gravity; @@ -129,11 +131,16 @@ public final class TaskbarAllAppsController implements OnDeviceProfileChangeList } /** - * Removes the all apps window from the hierarchy. + * Removes the all apps window from the hierarchy, if all floating views are closed and there is + * no system drag operation in progress. *

* This method should be called after an exit animation finishes, if applicable. */ - void closeWindow() { + void maybeCloseWindow() { + if (AbstractFloatingView.getOpenView(mAllAppsContext, TYPE_ALL) != null + || mAllAppsContext.getDragController().isSystemDragInProgress()) { + return; + } mProxyView.close(false); mTaskbarContext.removeOnDeviceProfileChangeListener(this); Optional.ofNullable(mAllAppsContext) diff --git a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsViewController.java b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsViewController.java index c1abaaca06..648c486eb4 100644 --- a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsViewController.java @@ -49,7 +49,7 @@ final class TaskbarAllAppsViewController { setUpIconLongClick(); setUpAppDivider(); setUpTaskbarStashing(); - mSlideInView.addOnCloseListener(windowController::closeWindow); + mSlideInView.addOnCloseListener(windowController::maybeCloseWindow); } /** Starts the {@link TaskbarAllAppsSlideInView} enter transition. */