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

Commit 9c5f0aa9 authored by Yongjin Kwon's avatar Yongjin Kwon Committed by Vishnu Nair
Browse files

[wm]: Changed an order to set a target window in TaskPositioner.

The system crash happens in TaskPositioner.unregister()
with the line mClientCallback.unlinkToDeath(this, 0 /* flags */).
Because mClientCallback has not been initialized before starting window drag.

Send the target window at the register function not at the start function.

Test: manual - Drag freefrom windowing task repeatedly
Test: atest WmTests:TaskPositionerTests
Bug: 142746031
Change-Id: Ied605f35d8b50540ad01056fa87bb2637135f1ab
(cherry picked from commit ac5ad99b44ea26aae1571de36c039eed81e886cf)
parent 98e9bbdb
Loading
Loading
Loading
Loading
+22 −14
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import static com.android.server.wm.WindowState.MINIMUM_VISIBLE_HEIGHT_IN_DP;
import static com.android.server.wm.WindowState.MINIMUM_VISIBLE_WIDTH_IN_DP;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.app.IActivityTaskManager;
import android.graphics.Point;
import android.graphics.Rect;
@@ -104,6 +105,7 @@ class TaskPositioner implements IBinder.DeathRecipient {

    @VisibleForTesting
    Task mTask;
    WindowState mWindow;
    private boolean mResizing;
    private boolean mPreserveOrientation;
    private boolean mStartOrientationWasLandscape;
@@ -238,8 +240,9 @@ class TaskPositioner implements IBinder.DeathRecipient {

    /**
     * @param displayContent The Display that the window being dragged is on.
     * @param win The window which will be dragged.
     */
    void register(DisplayContent displayContent) {
    void register(DisplayContent displayContent, @NonNull WindowState win) {
        final Display display = displayContent.getDisplay();

        if (DEBUG_TASK_POSITIONING) {
@@ -309,6 +312,17 @@ class TaskPositioner implements IBinder.DeathRecipient {
        display.getRealSize(mMaxVisibleSize);

        mDragEnded = false;

        try {
            mClientCallback = win.mClient.asBinder();
            mClientCallback.linkToDeath(this, 0 /* flags */);
        } catch (RemoteException e) {
            // The caller has died, so clean up TaskPositioningController.
            mService.mTaskPositioningController.finishTaskPositioning();
            return;
        }
        mWindow = win;
        mTask = win.getTask();
    }

    void unregister() {
@@ -341,25 +355,19 @@ class TaskPositioner implements IBinder.DeathRecipient {
        ProtoLog.d(WM_DEBUG_ORIENTATION, "Resuming rotation after re-position");
        mDisplayContent.getDisplayRotation().resume();
        mDisplayContent = null;
        if (mClientCallback != null) {
            mClientCallback.unlinkToDeath(this, 0 /* flags */);
        }
        mWindow = null;
    }

    void startDrag(WindowState win, boolean resize, boolean preserveOrientation, float startX,
    void startDrag(boolean resize, boolean preserveOrientation, float startX,
            float startY) {
        if (DEBUG_TASK_POSITIONING) {
            Slog.d(TAG, "startDrag: win=" + win + ", resize=" + resize
            Slog.d(TAG, "startDrag: win=" + mWindow + ", resize=" + resize
                    + ", preserveOrientation=" + preserveOrientation + ", {" + startX + ", "
                    + startY + "}");
        }
        try {
            mClientCallback = win.mClient.asBinder();
            mClientCallback.linkToDeath(this, 0 /* flags */);
        } catch (RemoteException e) {
            // The caller has died, so clean up TaskPositioningController.
            mService.mTaskPositioningController.finishTaskPositioning();
            return;
        }
        mTask = win.getTask();
        // Use the bounds of the task which accounts for
        // multiple app windows. Don't use any bounds from win itself as it
        // may not be the same size as the task.
+2 −2
Original line number Diff line number Diff line
@@ -169,7 +169,7 @@ class TaskPositioningController {
        mPositioningDisplay = displayContent;

        mTaskPositioner = TaskPositioner.create(mService);
        mTaskPositioner.register(displayContent);
        mTaskPositioner.register(displayContent, win);

        // We need to grab the touch focus so that the touch events during the
        // resizing/scrolling are not sent to the app. 'win' is the main window
@@ -187,7 +187,7 @@ class TaskPositioningController {
            return false;
        }

        mTaskPositioner.startDrag(win, resize, preserveOrientation, startX, startY);
        mTaskPositioner.startDrag(resize, preserveOrientation, startX, startY);
        return true;
    }

+36 −39
Original line number Diff line number Diff line
@@ -66,7 +66,6 @@ public class TaskPositionerTests extends WindowTestsBase {
    private int mMinVisibleWidth;
    private int mMinVisibleHeight;
    private TaskPositioner mPositioner;
    private WindowState mWindow;

    @Before
    public void setUp() {
@@ -81,17 +80,16 @@ public class TaskPositionerTests extends WindowTestsBase {
        mMinVisibleHeight = dipToPixel(MINIMUM_VISIBLE_HEIGHT_IN_DP, dm);
        removeGlobalMinSizeRestriction();

        WindowState win = createWindow(null, TYPE_BASE_APPLICATION, "window");
        mPositioner = new TaskPositioner(mWm, mWm.mAtmService);
        mPositioner.register(mDisplayContent);

        mWindow = createWindow(null, TYPE_BASE_APPLICATION, "window");
        mPositioner.mTask = mWindow.getTask();
        mWindow.getStack().setWindowingMode(WINDOWING_MODE_FREEFORM);
        mPositioner.register(mDisplayContent, win);

        win.getStack().setWindowingMode(WINDOWING_MODE_FREEFORM);
    }

    @After
    public void tearDown() {
        mWindow = null;
        mPositioner = null;
    }

@@ -122,8 +120,8 @@ public class TaskPositionerTests extends WindowTestsBase {
        mPositioner.mTask.setBounds(r, true);

        // Start a drag resize starting upper left.
        mPositioner.startDrag(mWindow, true /* resizing */,
                false /* preserveOrientation */, r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
        mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */,
                r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
        assertBoundsEquals(r, mPositioner.getWindowDragBounds());

        // Drag to a good landscape size.
@@ -149,8 +147,8 @@ public class TaskPositionerTests extends WindowTestsBase {
                mPositioner.getWindowDragBounds());

        // Start a drag resize left and see that only the left coord changes..
        mPositioner.startDrag(mWindow, true /* resizing */,
                false /* preserveOrientation */, r.left - MOUSE_DELTA_X, midY);
        mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */,
                r.left - MOUSE_DELTA_X, midY);

        // Drag to the left.
        mPositioner.resizeDrag(0.0f, midY);
@@ -184,8 +182,8 @@ public class TaskPositionerTests extends WindowTestsBase {
        mPositioner.mTask.setBounds(r, true);

        // Drag upper left.
        mPositioner.startDrag(mWindow, true /* resizing */,
                false /* preserveOrientation */, r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
        mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */,
                r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
        mPositioner.resizeDrag(0.0f, 0.0f);
        assertNotEquals(r.left, mPositioner.getWindowDragBounds().left);
        assertEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -193,8 +191,8 @@ public class TaskPositionerTests extends WindowTestsBase {
        assertEquals(r.bottom, mPositioner.getWindowDragBounds().bottom);

        // Drag upper.
        mPositioner.startDrag(mWindow, true /* resizing */,
                false /* preserveOrientation */, midX, r.top - MOUSE_DELTA_Y);
        mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */, midX,
                r.top - MOUSE_DELTA_Y);
        mPositioner.resizeDrag(0.0f, 0.0f);
        assertEquals(r.left, mPositioner.getWindowDragBounds().left);
        assertEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -202,8 +200,8 @@ public class TaskPositionerTests extends WindowTestsBase {
        assertEquals(r.bottom, mPositioner.getWindowDragBounds().bottom);

        // Drag upper right.
        mPositioner.startDrag(mWindow, true /* resizing */,
                false /* preserveOrientation */, r.right + MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
        mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */,
                r.right + MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
        mPositioner.resizeDrag(r.right + 100, 0.0f);
        assertEquals(r.left, mPositioner.getWindowDragBounds().left);
        assertNotEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -211,8 +209,8 @@ public class TaskPositionerTests extends WindowTestsBase {
        assertEquals(r.bottom, mPositioner.getWindowDragBounds().bottom);

        // Drag right.
        mPositioner.startDrag(mWindow, true /* resizing */,
                false /* preserveOrientation */, r.right + MOUSE_DELTA_X, midY);
        mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */,
                r.right + MOUSE_DELTA_X, midY);
        mPositioner.resizeDrag(r.right + 100, 0.0f);
        assertEquals(r.left, mPositioner.getWindowDragBounds().left);
        assertNotEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -220,8 +218,7 @@ public class TaskPositionerTests extends WindowTestsBase {
        assertEquals(r.bottom, mPositioner.getWindowDragBounds().bottom);

        // Drag bottom right.
        mPositioner.startDrag(mWindow, true /* resizing */,
                false /* preserveOrientation */,
        mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */,
                r.right + MOUSE_DELTA_X, r.bottom + MOUSE_DELTA_Y);
        mPositioner.resizeDrag(r.right + 100, r.bottom + 100);
        assertEquals(r.left, mPositioner.getWindowDragBounds().left);
@@ -230,8 +227,8 @@ public class TaskPositionerTests extends WindowTestsBase {
        assertNotEquals(r.bottom, mPositioner.getWindowDragBounds().bottom);

        // Drag bottom.
        mPositioner.startDrag(mWindow, true /* resizing */,
                false /* preserveOrientation */, midX, r.bottom + MOUSE_DELTA_Y);
        mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */, midX,
                r.bottom + MOUSE_DELTA_Y);
        mPositioner.resizeDrag(r.right + 100, r.bottom + 100);
        assertEquals(r.left, mPositioner.getWindowDragBounds().left);
        assertEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -239,8 +236,8 @@ public class TaskPositionerTests extends WindowTestsBase {
        assertNotEquals(r.bottom, mPositioner.getWindowDragBounds().bottom);

        // Drag bottom left.
        mPositioner.startDrag(mWindow, true /* resizing */,
                false /* preserveOrientation */, r.left - MOUSE_DELTA_X, r.bottom + MOUSE_DELTA_Y);
        mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */,
                r.left - MOUSE_DELTA_X, r.bottom + MOUSE_DELTA_Y);
        mPositioner.resizeDrag(0.0f, r.bottom + 100);
        assertNotEquals(r.left, mPositioner.getWindowDragBounds().left);
        assertEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -248,8 +245,8 @@ public class TaskPositionerTests extends WindowTestsBase {
        assertNotEquals(r.bottom, mPositioner.getWindowDragBounds().bottom);

        // Drag left.
        mPositioner.startDrag(mWindow, true /* resizing */,
                false /* preserveOrientation */, r.left - MOUSE_DELTA_X, midY);
        mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */,
                r.left - MOUSE_DELTA_X, midY);
        mPositioner.resizeDrag(0.0f, r.bottom + 100);
        assertNotEquals(r.left, mPositioner.getWindowDragBounds().left);
        assertEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -266,8 +263,8 @@ public class TaskPositionerTests extends WindowTestsBase {
        final Rect r = new Rect(100, 220, 700, 520);
        mPositioner.mTask.setBounds(r, true);

        mPositioner.startDrag(mWindow, true /* resizing */,
                true /* preserveOrientation */, r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
        mPositioner.startDrag(true /* resizing */, true /* preserveOrientation */,
                r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
        assertBoundsEquals(r, mPositioner.getWindowDragBounds());

        // Drag to a good landscape size.
@@ -305,8 +302,8 @@ public class TaskPositionerTests extends WindowTestsBase {
        final int midY = (r.top + r.bottom) / 2;
        mPositioner.mTask.setBounds(r, true);

        mPositioner.startDrag(mWindow, true /* resizing */,
                true /* preserveOrientation */, r.left - MOUSE_DELTA_X, midY);
        mPositioner.startDrag(true /* resizing */, true /* preserveOrientation */,
                r.left - MOUSE_DELTA_X, midY);

        // Drag to the left.
        mPositioner.resizeDrag(0.0f, midY);
@@ -346,8 +343,8 @@ public class TaskPositionerTests extends WindowTestsBase {
        final int midX = (r.left + r.right) / 2;
        mPositioner.mTask.setBounds(r, true);

        mPositioner.startDrag(mWindow, true /*resizing*/,
                true /*preserveOrientation*/, midX, r.top - MOUSE_DELTA_Y);
        mPositioner.startDrag(true /*resizing*/, true /*preserveOrientation*/, midX,
                r.top - MOUSE_DELTA_Y);

        // Drag to the left (no change).
        mPositioner.resizeDrag(0.0f, r.top);
@@ -382,8 +379,8 @@ public class TaskPositionerTests extends WindowTestsBase {
        final Rect r = new Rect(330, 100, 630, 600);
        mPositioner.mTask.setBounds(r, true);

        mPositioner.startDrag(mWindow, true /*resizing*/,
                true /*preserveOrientation*/, r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
        mPositioner.startDrag(true /*resizing*/, true /*preserveOrientation*/,
                r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
        assertBoundsEquals(r, mPositioner.getWindowDragBounds());

        // Drag to a good landscape size.
@@ -416,8 +413,8 @@ public class TaskPositionerTests extends WindowTestsBase {
        final int midY = (r.top + r.bottom) / 2;
        mPositioner.mTask.setBounds(r, true);

        mPositioner.startDrag(mWindow, true /* resizing */,
                true /* preserveOrientation */, r.left - MOUSE_DELTA_X, midY);
        mPositioner.startDrag(true /* resizing */, true /* preserveOrientation */,
                r.left - MOUSE_DELTA_X, midY);

        // Drag to the left.
        mPositioner.resizeDrag(0.0f, midY);
@@ -459,8 +456,8 @@ public class TaskPositionerTests extends WindowTestsBase {
        final int midX = (r.left + r.right) / 2;
        mPositioner.mTask.setBounds(r, true);

        mPositioner.startDrag(mWindow, true /* resizing */,
                true /* preserveOrientation */, midX, r.top - MOUSE_DELTA_Y);
        mPositioner.startDrag(true /* resizing */, true /* preserveOrientation */, midX,
                r.top - MOUSE_DELTA_Y);

        // Drag to the left (no change).
        mPositioner.resizeDrag(0.0f, r.top);
@@ -502,7 +499,7 @@ public class TaskPositionerTests extends WindowTestsBase {
    public void testFinishingMovingWhenBinderDied() {
        spyOn(mWm.mTaskPositioningController);

        mPositioner.startDrag(mWindow, false, false, 0 /* startX */, 0 /* startY */);
        mPositioner.startDrag(false, false, 0 /* startX */, 0 /* startY */);
        verify(mWm.mTaskPositioningController, never()).finishTaskPositioning();
        mPositioner.binderDied();
        verify(mWm.mTaskPositioningController).finishTaskPositioning();