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

Commit 64559297 authored by Toshiki Kikuchi's avatar Toshiki Kikuchi
Browse files

Don’t consider move without actual bounds change as drag

This CL prevents DMWindowDecor from flipping `mIsDragging` for
ACTION_MOVE without actual bounds change.
Otherwise, no one resets the flag when...
 1) ACTION_DOWN on caption button
 2) ACTION_MOVE without actual bounds change on caption button
    Note that ACTION_MOVE can be fired even when there is no position
    change from the previous ACTION_DOWN
 3) ACTION_UP on caption button
 4) onClick on caption button
so the caption button click is ignored.

Bug: 364990718
Test: DesktopModeWindowDecorViewModelTests
Flag: EXEMPT bugfix
Change-Id: Icc15380b26f85c93a724966a7e09472b56f0d259
parent 21685785
Loading
Loading
Loading
Loading
+42 −21
Original line number Diff line number Diff line
@@ -197,6 +197,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
                    });
                }
            };
    private final TaskPositionerFactory mTaskPositionerFactory;

    public DesktopModeWindowDecorViewModel(
            Context context,
@@ -246,7 +247,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
                new SparseArray<>(),
                interactionJankMonitor,
                desktopTasksLimiter,
                activityOrientationChangeHandler);
                activityOrientationChangeHandler,
                new TaskPositionerFactory());
    }

    @VisibleForTesting
@@ -275,7 +277,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
            SparseArray<DesktopModeWindowDecoration> windowDecorByTaskId,
            InteractionJankMonitor interactionJankMonitor,
            Optional<DesktopTasksLimiter> desktopTasksLimiter,
            Optional<DesktopActivityOrientationChangeHandler> activityOrientationChangeHandler) {
            Optional<DesktopActivityOrientationChangeHandler> activityOrientationChangeHandler,
            TaskPositionerFactory taskPositionerFactory) {
        mContext = context;
        mMainExecutor = shellExecutor;
        mMainHandler = mainHandler;
@@ -329,6 +332,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
                }
            }
        };
        mTaskPositionerFactory = taskPositionerFactory;

        shellInit.addInitCallback(this::onInit, this);
    }
@@ -822,7 +826,10 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
                            decoration.mTaskSurface,
                            e.getRawX(dragPointerIdx),
                            newTaskBounds);
                    //  Flip mIsDragging only if the bounds actually changed.
                    if (mIsDragging || !newTaskBounds.equals(mOnDragStartInitialBounds)) {
                        updateDragStatus(e.getActionMasked());
                    }
                    return true;
                }
                case MotionEvent.ACTION_UP:
@@ -1273,23 +1280,18 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
                        mMultiInstanceHelper);
        mWindowDecorByTaskId.put(taskInfo.taskId, windowDecoration);

        final DragPositioningCallback dragPositioningCallback;
        if (!DesktopModeStatus.isVeiledResizeEnabled()) {
            dragPositioningCallback = new FluidResizeTaskPositioner(
                    mTaskOrganizer, mTransitions, windowDecoration, mDisplayController,
                    mDragStartListener, mTransactionFactory);
            windowDecoration.setTaskDragResizer(
                    (FluidResizeTaskPositioner) dragPositioningCallback);
        } else {
            dragPositioningCallback = new VeiledResizeTaskPositioner(
                    mTaskOrganizer, windowDecoration, mDisplayController,
                    mDragStartListener, mTransitions, mInteractionJankMonitor);
            windowDecoration.setTaskDragResizer(
                    (VeiledResizeTaskPositioner) dragPositioningCallback);
        }
        final TaskPositioner taskPositioner = mTaskPositionerFactory.create(
                mTaskOrganizer,
                windowDecoration,
                mDisplayController,
                mDragStartListener,
                mTransitions,
                mInteractionJankMonitor,
                mTransactionFactory);
        windowDecoration.setTaskDragResizer(taskPositioner);

        final DesktopModeTouchEventListener touchEventListener =
                new DesktopModeTouchEventListener(taskInfo, dragPositioningCallback);
                new DesktopModeTouchEventListener(taskInfo, taskPositioner);
        windowDecoration.setOnMaximizeOrRestoreClickListener(() -> {
            onMaximizeOrRestore(taskInfo.taskId, "maximize_menu");
            return Unit.INSTANCE;
@@ -1323,7 +1325,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
        windowDecoration.setCaptionListeners(
                touchEventListener, touchEventListener, touchEventListener, touchEventListener);
        windowDecoration.setExclusionRegionListener(mExclusionRegionListener);
        windowDecoration.setDragPositioningCallback(dragPositioningCallback);
        windowDecoration.setDragPositioningCallback(taskPositioner);
        windowDecoration.setDragDetector(touchEventListener.mDragDetector);
        windowDecoration.relayout(taskInfo, startT, finishT,
                false /* applyStartTransactionOnDraw */, false /* shouldSetTaskPositionAndCrop */);
@@ -1472,6 +1474,25 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
            }
        }
    }
}


    @VisibleForTesting
    static class TaskPositionerFactory {
        TaskPositioner create(
                ShellTaskOrganizer taskOrganizer,
                DesktopModeWindowDecoration windowDecoration,
                DisplayController displayController,
                DragPositioningCallbackUtility.DragStartListener dragStartListener,
                Transitions transitions,
                InteractionJankMonitor interactionJankMonitor,
                Supplier<SurfaceControl.Transaction> transactionFactory) {
            if (!DesktopModeStatus.isVeiledResizeEnabled()) {
                return new FluidResizeTaskPositioner(
                        taskOrganizer, transitions, windowDecoration, displayController,
                        dragStartListener, transactionFactory);
            }
            return new VeiledResizeTaskPositioner(
                    taskOrganizer, windowDecoration, displayController,
                    dragStartListener, transitions, interactionJankMonitor);
        }
    }
}
+1 −2
Original line number Diff line number Diff line
@@ -49,8 +49,7 @@ import java.util.function.Supplier;
 * that we send the final shell transition since we still utilize the {@link #onTransitionConsumed}
 * callback.
 */
class FluidResizeTaskPositioner implements DragPositioningCallback,
        TaskDragResizer, Transitions.TransitionHandler {
class FluidResizeTaskPositioner implements TaskPositioner, Transitions.TransitionHandler {
    private final ShellTaskOrganizer mTaskOrganizer;
    private final Transitions mTransitions;
    private final WindowDecoration mWindowDecoration;
+1 −1
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ package com.android.wm.shell.windowdecor;
/**
 * Holds the state of a drag resize.
 */
interface TaskDragResizer {
public interface TaskDragResizer {

    /**
     * Returns true if task is currently being resized or animating the final transition after
+22 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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.wm.shell.windowdecor

/**
 * Interface for TaskPositioner.
 */
interface TaskPositioner : DragPositioningCallback, TaskDragResizer
+1 −2
Original line number Diff line number Diff line
@@ -47,8 +47,7 @@ import java.util.function.Supplier;
 * If the drag is resizing the task, we resize the veil instead.
 * If the drag is repositioning, we update in the typical manner.
 */
public class VeiledResizeTaskPositioner implements DragPositioningCallback,
        TaskDragResizer, Transitions.TransitionHandler {
public class VeiledResizeTaskPositioner implements TaskPositioner, Transitions.TransitionHandler {

    private DesktopModeWindowDecoration mDesktopWindowDecoration;
    private ShellTaskOrganizer mTaskOrganizer;
Loading