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. */