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

Commit 19585ffa authored by yj81.kwon's avatar yj81.kwon Committed by Vishnu Nair
Browse files

[wm]: Fixed TaskPositioner leak

If application process handles motion events late, it requests to start
moving task after MotionEvent.ACTION_UP is already fired. In that case,
system will wait for event that is not comming and cannot end drag state.
It's expected that the system finishes moving task when system receives
ACTION_UP by transfering touch focus. In a problem case, ACTION_UP event
is already sent to the application process before transfering touch focus.

If application receives ACTION_UP event after requesting moving task,
notify the system of finishing previous request.

Test: Quickly try to resize freeform windowing app repeatedly.
Test: atest WmTests:TaskPositioningControllerTests
Bug: 129507487

Change-Id: Ifa457ddc55524cae6da455e770472781a7805282
(cherry picked from commit 9a1cd7b5063229da536a1281916ae15ec9246d1a)
parent 515e7a74
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -254,6 +254,8 @@ interface IWindowSession {
     */
    boolean startMovingTask(IWindow window, float startX, float startY);

    void finishMovingTask(IWindow window);

    void updatePointerIcon(IWindow window);

    /**
+15 −0
Original line number Diff line number Diff line
@@ -25519,6 +25519,21 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
        return false;
    }
    /**
     * Finish a window move task.
     * @hide
     */
    public void finishMovingTask() {
        if (ViewDebug.DEBUG_POSITIONING) {
            Log.d(VIEW_LOG_TAG, "finishMovingTask");
        }
        try {
            mAttachInfo.mSession.finishMovingTask(mAttachInfo.mWindow);
        } catch (RemoteException e) {
            Log.e(VIEW_LOG_TAG, "Unable to finish moving", e);
        }
    }
    /**
     * Handles drag events sent by the system following a call to
     * {@link android.view.View#startDragAndDrop(ClipData,DragShadowBuilder,Object,int)
+8 −1
Original line number Diff line number Diff line
@@ -188,7 +188,8 @@ public class DecorCaptionView extends ViewGroup implements View.OnTouchListener,
        final int y = (int) e.getY();
        final boolean fromMouse = e.getToolType(e.getActionIndex()) == MotionEvent.TOOL_TYPE_MOUSE;
        final boolean primaryButton = (e.getButtonState() & MotionEvent.BUTTON_PRIMARY) != 0;
        switch (e.getActionMasked()) {
        final int actionMasked = e.getActionMasked();
        switch (actionMasked) {
            case MotionEvent.ACTION_DOWN:
                if (!mShow) {
                    // When there is no caption we should not react to anything.
@@ -220,6 +221,12 @@ public class DecorCaptionView extends ViewGroup implements View.OnTouchListener,
                    break;
                }
                // Abort the ongoing dragging.
                if (actionMasked == MotionEvent.ACTION_UP) {
                    // If it receives ACTION_UP event, the dragging is already finished and also
                    // the system can not end drag on ACTION_UP event. So request to finish
                    // dragging.
                    finishMovingTask();
                }
                mDragging = false;
                return !mCheckForDragging;
        }
+12 −0
Original line number Diff line number Diff line
@@ -315,6 +315,18 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
        }
    }

    @Override
    public void finishMovingTask(IWindow window) {
        if (DEBUG_TASK_POSITIONING) Slog.d(TAG_WM, "finishMovingTask");

        long ident = Binder.clearCallingIdentity();
        try {
            mService.mTaskPositioningController.finishTaskPositioning(window);
        } finally {
            Binder.restoreCallingIdentity(ident);
        }
    }

    @Override
    public void reportSystemGestureExclusionChanged(IWindow window, List<Rect> exclusionRects) {
        long ident = Binder.clearCallingIdentity();
+1 −1
Original line number Diff line number Diff line
@@ -119,7 +119,7 @@ class TaskPositioner implements IBinder.DeathRecipient {
    private int mCtrlType = CTRL_NONE;
    @VisibleForTesting
    boolean mDragEnded;
    private IBinder mClientCallback;
    IBinder mClientCallback;

    InputChannel mServerChannel;
    InputChannel mClientChannel;
Loading