From 89ef745d1cc1fa5e9ea8de02fde49559783a987e Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Wed, 27 Oct 2021 14:48:47 -0700 Subject: [PATCH] Update taskbar drag and drop treatment - Disable the FastBitmapDrawable icon instead of setting it to invisible - Suspend auto hide during drag and drop (moved to new TaskbarAutoHideSuspendController) Test: Drag and drop from taskbar and ensure the original icon stays in place but desaturated Test: Open immersive app, drag and drop from taskbar and ensure taskbar doesn't hide before drop Fixes: 200816442 Change-Id: I4b895efd043be75e7e7034bd75e751ffdd2cfdd7 --- .../taskbar/TaskbarActivityContext.java | 7 ++- .../TaskbarAutohideSuspendController.java | 63 +++++++++++++++++++ .../launcher3/taskbar/TaskbarControllers.java | 7 ++- .../taskbar/TaskbarDragController.java | 36 ++++++----- 4 files changed, 93 insertions(+), 20 deletions(-) create mode 100644 quickstep/src/com/android/launcher3/taskbar/TaskbarAutohideSuspendController.java diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index 370496aec3..5e60b4a96b 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -69,7 +69,6 @@ import com.android.launcher3.util.ViewCache; import com.android.launcher3.views.ActivityContext; import com.android.quickstep.SysUINavigationMode; import com.android.quickstep.SysUINavigationMode.Mode; -import com.android.quickstep.SystemUiProxy; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.WindowManagerWrapper; @@ -157,7 +156,8 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ new TaskbarKeyguardController(this), new StashedHandleViewController(this, stashedHandleView), new TaskbarStashController(this), - new TaskbarEduController(this)); + new TaskbarEduController(this), + new TaskbarAutohideSuspendController(this)); } public void init(TaskbarSharedState sharedState) { @@ -360,7 +360,8 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ * Updates the TaskbarContainer to MATCH_PARENT vs original Taskbar size. */ public void setTaskbarWindowFullscreen(boolean fullscreen) { - SystemUiProxy.INSTANCE.getNoCreate().notifyTaskbarAutohideSuspend(fullscreen); + mControllers.taskbarAutohideSuspendController.updateFlag( + TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_FULLSCREEN, fullscreen); mIsFullscreen = fullscreen; setTaskbarWindowHeight(fullscreen ? MATCH_PARENT : mLastRequestedNonFullscreenHeight); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarAutohideSuspendController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarAutohideSuspendController.java new file mode 100644 index 0000000000..e42f83de6a --- /dev/null +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarAutohideSuspendController.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.launcher3.taskbar; + +import androidx.annotation.IntDef; + +import com.android.quickstep.SystemUiProxy; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Normally Taskbar will auto-hide when entering immersive (fullscreen) apps. This controller allows + * us to suspend that behavior in certain cases (e.g. opening a Folder or dragging an icon). + */ +public class TaskbarAutohideSuspendController { + + public static final int FLAG_AUTOHIDE_SUSPEND_FULLSCREEN = 1 << 0; + public static final int FLAG_AUTOHIDE_SUSPEND_DRAGGING = 1 << 1; + @IntDef(flag = true, value = { + FLAG_AUTOHIDE_SUSPEND_FULLSCREEN, + FLAG_AUTOHIDE_SUSPEND_DRAGGING, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AutohideSuspendFlag {} + + private final SystemUiProxy mSystemUiProxy; + + private @AutohideSuspendFlag int mAutohideSuspendFlags = 0; + + public TaskbarAutohideSuspendController(TaskbarActivityContext activity) { + mSystemUiProxy = SystemUiProxy.INSTANCE.get(activity); + } + + public void onDestroy() { + mSystemUiProxy.notifyTaskbarAutohideSuspend(false); + } + + /** + * Adds or removes the given flag, then notifies system UI proxy whether to suspend auto-hide. + */ + public void updateFlag(@AutohideSuspendFlag int flag, boolean enabled) { + if (enabled) { + mAutohideSuspendFlags |= flag; + } else { + mAutohideSuspendFlags &= ~flag; + } + mSystemUiProxy.notifyTaskbarAutohideSuspend(mAutohideSuspendFlags != 0); + } +} diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java index 8684c2925c..7b0053e0a9 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java @@ -37,6 +37,7 @@ public class TaskbarControllers { public final StashedHandleViewController stashedHandleViewController; public final TaskbarStashController taskbarStashController; public final TaskbarEduController taskbarEduController; + public final TaskbarAutohideSuspendController taskbarAutohideSuspendController; /** Do not store this controller, as it may change at runtime. */ @NonNull public TaskbarUIController uiController = TaskbarUIController.DEFAULT; @@ -53,7 +54,8 @@ public class TaskbarControllers { TaskbarKeyguardController taskbarKeyguardController, StashedHandleViewController stashedHandleViewController, TaskbarStashController taskbarStashController, - TaskbarEduController taskbarEduController) { + TaskbarEduController taskbarEduController, + TaskbarAutohideSuspendController taskbarAutoHideSuspendController) { this.taskbarActivityContext = taskbarActivityContext; this.taskbarDragController = taskbarDragController; this.navButtonController = navButtonController; @@ -67,6 +69,7 @@ public class TaskbarControllers { this.stashedHandleViewController = stashedHandleViewController; this.taskbarStashController = taskbarStashController; this.taskbarEduController = taskbarEduController; + this.taskbarAutohideSuspendController = taskbarAutoHideSuspendController; } /** @@ -75,6 +78,7 @@ public class TaskbarControllers { * in constructors for now, as some controllers may still be waiting for init(). */ public void init(TaskbarSharedState sharedState) { + taskbarDragController.init(this); navbarButtonsViewController.init(this, sharedState); if (taskbarActivityContext.isThreeButtonNav()) { rotationButtonController.init(); @@ -101,5 +105,6 @@ public class TaskbarControllers { taskbarUnfoldAnimationController.onDestroy(); taskbarViewController.onDestroy(); stashedHandleViewController.onDestroy(); + taskbarAutohideSuspendController.onDestroy(); } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java index 1afbd177e7..3bcacb6c8a 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java @@ -15,9 +15,6 @@ */ package com.android.launcher3.taskbar; -import static android.view.View.INVISIBLE; -import static android.view.View.VISIBLE; - import android.content.ClipData; import android.content.ClipDescription; import android.content.Intent; @@ -49,7 +46,6 @@ import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.dragndrop.DragView; import com.android.launcher3.dragndrop.DraggableView; import com.android.launcher3.graphics.DragPreviewProvider; -import com.android.launcher3.icons.FastBitmapDrawable; import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; @@ -65,6 +61,9 @@ public class TaskbarDragController extends DragController { + btv.post(() -> { startInternalDrag(btv); - btv.setVisibility(INVISIBLE); + btv.getIcon().setIsDisabled(true); + mControllers.taskbarAutohideSuspendController.updateFlag( + TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_DRAGGING, true); }); return true; } private void startInternalDrag(BubbleTextView btv) { - float iconScale = 1f; - Drawable icon = btv.getIcon(); - if (icon instanceof FastBitmapDrawable) { - iconScale = ((FastBitmapDrawable) icon).getAnimatedScale(); - } + float iconScale = btv.getIcon().getAnimatedScale(); // Clear the pressed state if necessary btv.clearFocus(); @@ -239,16 +240,17 @@ public class TaskbarDragController extends DragController