diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt index c03c91641f..37d9090f24 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt @@ -20,6 +20,7 @@ import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Path +import android.graphics.RectF import com.android.launcher3.R import com.android.launcher3.Utilities.mapRange import com.android.launcher3.Utilities.mapToRange @@ -30,7 +31,8 @@ import com.android.launcher3.util.DisplayController /** Helps draw the taskbar background, made up of a rectangle plus two inverted rounded corners. */ class TaskbarBackgroundRenderer(context: TaskbarActivityContext) { - val paint: Paint = Paint() + val paint = Paint() + val lastDrawnTransientRect = RectF() var backgroundHeight = context.deviceProfile.taskbarSize.toFloat() var translationYForSwipe = 0f @@ -131,7 +133,11 @@ class TaskbarBackgroundRenderer(context: TaskbarActivityContext) { val radius = newBackgroundHeight / 2f val bottomMarginProgress = bottomMargin * ((1f - progress) / 2f) - canvas.translate(0f, canvas.height - bottomMargin + bottomMarginProgress) + // Aligns the bottom with the bottom of the stashed handle. + val bottom = + canvas.height - bottomMargin + + bottomMarginProgress + + (-mapRange(1f - progress, 0f, stashedHandleHeight / 2f) + translationYForSwipe) // Draw shadow. val shadowAlpha = @@ -143,19 +149,14 @@ class TaskbarBackgroundRenderer(context: TaskbarActivityContext) { setColorAlphaBound(Color.BLACK, Math.round(shadowAlpha)) ) - // Aligns the bottom with the bottom of the stashed handle. - val bottom = - (-mapRange(1f - progress, 0f, stashedHandleHeight / 2f) + translationYForSwipe) - - canvas.drawRoundRect( + lastDrawnTransientRect.set( transientBackgroundBounds.left + halfWidthDelta, bottom - newBackgroundHeight, transientBackgroundBounds.right - halfWidthDelta, - bottom, - radius, - radius, - paint + bottom ) + + canvas.drawRoundRect(lastDrawnTransientRect, radius, radius, paint) } canvas.restore() } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java index d1fea7b069..45df9d6de9 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java @@ -33,6 +33,7 @@ import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Point; import android.graphics.Rect; +import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.os.UserHandle; import android.util.Pair; @@ -69,11 +70,13 @@ import com.android.launcher3.shortcuts.DeepShortcutView; import com.android.launcher3.shortcuts.ShortcutDragPreviewProvider; import com.android.launcher3.testing.TestLogging; import com.android.launcher3.testing.shared.TestProtocol; +import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.IntSet; import com.android.launcher3.util.ItemInfoMatcher; import com.android.quickstep.util.LogUtils; import com.android.quickstep.util.MultiValueUpdateListener; import com.android.systemui.shared.recents.model.Task; +import com.android.wm.shell.draganddrop.DragAndDropConstants; import java.io.PrintWriter; import java.util.Arrays; @@ -310,9 +313,6 @@ public class TaskbarDragController extends DragController im if (mDisallowGlobalDrag) { AbstractFloatingView.closeAllOpenViewsExcept(mActivity, TYPE_TASKBAR_ALL_APPS); } else { - // stash the transient taskbar - mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(true); - AbstractFloatingView.closeAllOpenViews(mActivity); } @@ -395,6 +395,15 @@ public class TaskbarDragController extends DragController im com.android.launcher3.logging.InstanceId launcherInstanceId = instanceIds.second; intent.putExtra(ClipDescription.EXTRA_LOGGING_INSTANCE_ID, internalInstanceId); + if (DisplayController.isTransientTaskbar(mActivity)) { + // Tell WM Shell to ignore drag events in the provided transient taskbar region. + TaskbarDragLayer dragLayer = mControllers.taskbarActivityContext.getDragLayer(); + int[] locationOnScreen = dragLayer.getLocationOnScreen(); + RectF disallowExternalDropRegion = new RectF(dragLayer.getLastDrawnTransientRect()); + disallowExternalDropRegion.offset(locationOnScreen[0], locationOnScreen[1]); + intent.putExtra(DragAndDropConstants.EXTRA_DISALLOW_HIT_REGION, + disallowExternalDropRegion); + } ClipData clipData = new ClipData(clipDescription, new ClipData.Item(intent)); if (btv.startDragAndDrop(clipData, shadowBuilder, null /* localState */, @@ -421,9 +430,6 @@ public class TaskbarDragController extends DragController im if (dragEvent.getResult()) { maybeOnDragEnd(); } else { - // un-stash the transient taskbar in case drag and drop was canceled - mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(false); - // This will take care of calling maybeOnDragEnd() after the animation animateGlobalDragViewToOriginalPosition(btv, dragEvent); } @@ -451,6 +457,9 @@ public class TaskbarDragController extends DragController im mControllers.taskbarAutohideSuspendController.updateFlag( TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_DRAGGING, false); mActivity.onDragEnd(); + // Note, this must be done last to ensure no AutohideSuspendFlags are active, as that + // will prevent us from stashing until the timeout. + mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(true); } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java index 71148493e8..58d6244a5f 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java @@ -20,6 +20,7 @@ import static android.view.KeyEvent.KEYCODE_BACK; import android.content.Context; import android.graphics.Canvas; +import android.graphics.RectF; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.MotionEvent; @@ -183,6 +184,11 @@ public class TaskbarDragLayer extends BaseDragLayer { invalidate(); } + /** Returns the bounds in DragLayer coordinates of where the transient background was drawn. */ + protected RectF getLastDrawnTransientRect() { + return mBackgroundRenderer.getLastDrawnTransientRect(); + } + @Override public boolean dispatchTouchEvent(MotionEvent ev) { TestLogging.recordMotionEvent(TestProtocol.SEQUENCE_MAIN, "Touch event", ev);