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

Commit b4fa081c authored by chaviw's avatar chaviw
Browse files

Use Transaction reparent to null instead of destroy for SC in DragState

When creating a drag surface for drag and drop, the system server is
responsible for destroying the surface when no longer needed. However,
the SurfaceControl was created on the client side, so when the server
calls destroy, it's not allowed since only the process that created the
surface can do it.

Instead use the Transaction reparent to null to destroy the SurfaceControl.

Change-Id: Ie1f0c230046e9928cd4b12ff7a908aad70166d64
Fixes: 122798367
Test: Drag and drop no longer keeps shadow surface on screen
parent 793f1a79
Loading
Loading
Loading
Loading
+10 −13
Original line number Diff line number Diff line
@@ -120,6 +120,8 @@ class DragState {
    // A surface used to catch input events for the drag-and-drop operation.
    SurfaceControl mInputSurface;

    private final SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction();

    private final Rect mTmpClipRect = new Rect();

    /**
@@ -240,7 +242,7 @@ class DragState {

        // Clear the internal variables.
        if (mSurfaceControl != null) {
            mSurfaceControl.destroy();
            mTransaction.reparent(mSurfaceControl, null).apply();
            mSurfaceControl = null;
        }
        if (mAnimator != null && !mAnimationCompleted) {
@@ -500,18 +502,13 @@ class DragState {
        mCurrentY = y;

        // Move the surface to the given touch
        if (SHOW_LIGHT_TRANSACTIONS) Slog.i(
                TAG_WM, ">>> OPEN TRANSACTION notifyMoveLocked");
        mService.openSurfaceTransaction();
        try {
            mSurfaceControl.setPosition(x - mThumbOffsetX, y - mThumbOffsetY);
            if (SHOW_TRANSACTIONS) Slog.i(TAG_WM, "  DRAG "
                    + mSurfaceControl + ": pos=(" +
                    (int)(x - mThumbOffsetX) + "," + (int)(y - mThumbOffsetY) + ")");
        } finally {
            mService.closeSurfaceTransaction("notifyMoveLw");
            if (SHOW_LIGHT_TRANSACTIONS) Slog.i(
                    TAG_WM, "<<< CLOSE TRANSACTION notifyMoveLocked");
        if (SHOW_LIGHT_TRANSACTIONS) {
            Slog.i(TAG_WM, ">>> OPEN TRANSACTION notifyMoveLocked");
        }
        mTransaction.setPosition(mSurfaceControl, x - mThumbOffsetX, y - mThumbOffsetY).apply();
        if (SHOW_TRANSACTIONS) {
            Slog.i(TAG_WM, "  DRAG " + mSurfaceControl + ": pos=(" + (int) (x - mThumbOffsetX) + ","
                    + (int) (y - mThumbOffsetY) + ")");
        }
        notifyLocationLocked(x, y);
    }