Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 76e6f41a authored by mattsziklay's avatar mattsziklay
Browse files

Perform bounds snap when not changing windowing mode.

ag/26334075 caused caption to not snap on screen when dragged into
status bar region but not in the TO_FULLSCREEN drag zone. A subsequent
corner resize would then show the task snapping back to its pre-drag
bounds. This would happen because no WCT would occur to finalize the
bounds as our assumption was a status bar drag wouldn't need one.

This CL fixes this by using snapTaskBoundsIfNecessary from the utility
class and setting bounds to the result in any drag that does not result
in a windowing mode change.

A handful of tests were removed from
Veiled/FluidResizeTaskPositionerTest as the functionality is no longer
present in those classes. DragPositioningCallbackUtilityTest covers
testing snap to valid drag area.

Bug: 328423886
Bug: 329013327
Test: Manual
Change-Id: I1cf7ca59ffb5f3600cd82213c62f02ae7f5b1878
parent d7e8d00a
Loading
Loading
Loading
Loading
+17 −3
Original line number Diff line number Diff line
@@ -78,6 +78,7 @@ import com.android.wm.shell.sysui.ShellSharedConstants
import com.android.wm.shell.transition.OneShotRemoteHandler
import com.android.wm.shell.transition.Transitions
import com.android.wm.shell.util.KtProtoLog
import com.android.wm.shell.windowdecor.DragPositioningCallbackUtility
import com.android.wm.shell.windowdecor.MoveToDesktopAnimator
import com.android.wm.shell.windowdecor.OnTaskResizeAnimationListener
import java.io.PrintWriter
@@ -959,7 +960,8 @@ class DesktopTasksController(
    }

    /**
     * Perform checks required on drag end. Move to fullscreen if drag ends in status bar area.
     * Perform checks required on drag end. If indicator indicates a windowing mode change, perform
     * that change. Otherwise, ensure bounds are up to date.
     *
     * @param taskInfo the task being dragged.
     * @param position position of surface when drag ends.
@@ -970,7 +972,8 @@ class DesktopTasksController(
        taskInfo: RunningTaskInfo,
        position: Point,
        inputCoordinate: PointF,
        taskBounds: Rect
        taskBounds: Rect,
        validDragArea: Rect
    ) {
        if (taskInfo.configuration.windowConfiguration.windowingMode != WINDOWING_MODE_FREEFORM) {
            return
@@ -993,10 +996,21 @@ class DesktopTasksController(
                releaseVisualIndicator()
                snapToHalfScreen(taskInfo, SnapPosition.RIGHT)
            }
            DesktopModeVisualIndicator.IndicatorType.TO_DESKTOP_INDICATOR,
            DesktopModeVisualIndicator.IndicatorType.NO_INDICATOR -> {
                // If task bounds are outside valid drag area, snap them inward and perform a
                // transaction to set bounds.
                if (DragPositioningCallbackUtility.snapTaskBoundsIfNecessary(
                        taskBounds, validDragArea)) {
                    val wct = WindowContainerTransaction()
                    wct.setBounds(taskInfo.token, taskBounds)
                    transitions.startTransition(TRANSIT_CHANGE, wct, null)
                }
                releaseVisualIndicator()
            }
            DesktopModeVisualIndicator.IndicatorType.TO_DESKTOP_INDICATOR -> {
                throw IllegalArgumentException("Should not be receiving TO_DESKTOP_INDICATOR for " +
                        "a freeform task.")
            }
        }
        // A freeform drag-move ended, remove the indicator immediately.
        releaseVisualIndicator()
+11 −2
Original line number Diff line number Diff line
@@ -19,9 +19,11 @@ package com.android.wm.shell.windowdecor;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.view.WindowManager.TRANSIT_CHANGE;

import android.app.ActivityManager.RunningTaskInfo;
import android.content.Context;
import android.graphics.Rect;
import android.os.Handler;
import android.util.SparseArray;
import android.view.Choreographer;
@@ -186,7 +188,7 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel {

        final FluidResizeTaskPositioner taskPositioner =
                new FluidResizeTaskPositioner(mTaskOrganizer, mTransitions, windowDecoration,
                        mDisplayController, 0 /* disallowedAreaForEndBoundsHeight */);
                        mDisplayController);
        final CaptionTouchEventListener touchEventListener =
                new CaptionTouchEventListener(taskInfo, taskPositioner);
        windowDecoration.setCaptionListeners(touchEventListener, touchEventListener);
@@ -286,8 +288,15 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel {
                        mDragPointerId = e.getPointerId(0);
                    }
                    final int dragPointerIdx = e.findPointerIndex(mDragPointerId);
                    mDragPositioningCallback.onDragPositioningEnd(
                    final Rect newTaskBounds = mDragPositioningCallback.onDragPositioningEnd(
                            e.getRawX(dragPointerIdx), e.getRawY(dragPointerIdx));
                    DragPositioningCallbackUtility.snapTaskBoundsIfNecessary(newTaskBounds,
                            mWindowDecorByTaskId.get(mTaskId).calculateValidDragArea());
                    if (newTaskBounds != taskInfo.configuration.windowConfiguration.getBounds()) {
                        final WindowContainerTransaction wct = new WindowContainerTransaction();
                        wct.setBounds(taskInfo.token, newTaskBounds);
                        mTransitions.startTransition(TRANSIT_CHANGE, wct, null);
                    }
                    final boolean wasDragging = mIsDragging;
                    mIsDragging = false;
                    return wasDragging;
+2 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.wm.shell.windowdecor;

import android.annotation.NonNull;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.WindowConfiguration;
import android.app.WindowConfiguration.WindowingMode;
@@ -87,6 +88,7 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL
    }

    @Override
    @NonNull
    Rect calculateValidDragArea() {
        final int leftButtonsWidth = loadDimensionPixelSize(mContext.getResources(),
                R.dimen.caption_left_buttons_width);
+3 −5
Original line number Diff line number Diff line
@@ -639,7 +639,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
                            e.getRawX(dragPointerIdx), e.getRawY(dragPointerIdx));
                    mDesktopTasksController.onDragPositioningEnd(taskInfo, position,
                            new PointF(e.getRawX(dragPointerIdx), e.getRawY(dragPointerIdx)),
                            newTaskBounds);
                            newTaskBounds, decoration.calculateValidDragArea());
                    if (touchingButton && !mHasLongClicked) {
                        // We need the input event to not be consumed here to end the ripple
                        // effect on the touched button. We will reset drag state in the ensuing
@@ -1086,18 +1086,16 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
        windowDecoration.createResizeVeil();

        final DragPositioningCallback dragPositioningCallback;
        final int transitionAreaHeight = mContext.getResources().getDimensionPixelSize(
                R.dimen.desktop_mode_fullscreen_from_desktop_height);
        if (!DesktopModeStatus.isVeiledResizeEnabled()) {
            dragPositioningCallback =  new FluidResizeTaskPositioner(
                    mTaskOrganizer, mTransitions, windowDecoration, mDisplayController,
                    mDragStartListener, mTransactionFactory, transitionAreaHeight);
                    mDragStartListener, mTransactionFactory);
            windowDecoration.setTaskDragResizer(
                    (FluidResizeTaskPositioner) dragPositioningCallback);
        } else {
            dragPositioningCallback =  new VeiledResizeTaskPositioner(
                    mTaskOrganizer, windowDecoration, mDisplayController,
                    mDragStartListener, mTransitions, transitionAreaHeight);
                    mDragStartListener, mTransitions);
            windowDecoration.setTaskDragResizer(
                    (VeiledResizeTaskPositioner) dragPositioningCallback);
        }
+2 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import static android.app.WindowConfiguration.windowingModeToString;

import static com.android.launcher3.icons.BaseIconFactory.MODE_DEFAULT;

import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.WindowConfiguration.WindowingMode;
import android.content.Context;
@@ -499,6 +500,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
     * Determine valid drag area for this task based on elements in the app chip.
     */
    @Override
    @NonNull
    Rect calculateValidDragArea() {
        final int appTextWidth = ((DesktopModeAppControlsWindowDecorationViewHolder)
                mWindowDecorViewHolder).getAppNameTextWidth();
Loading