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

Commit f01af755 authored by Christopher Tate's avatar Christopher Tate
Browse files

Fail more gracefully when window state changes during drags

In particular, if a new window was created out from under the drag,
the drag-move event dispatch logic would wind up blithly assuming
that it would find a valid touch-dispatchable window under the
finger.  When this was untrue, it would NPE, but the NPE was caught
and discarded safely by higher-level guard code.

With this change, we now avoid the NPE entirely and report the
spurious condition as part of the debugging log stream.

(Also add the local-state object to DragEvent.toString()'s output.)

Change-Id: Idfa5f45d049e48415ee59c8b0ffb5b0ed4098ce3
parent 5383d077
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -274,7 +274,7 @@ public static final int ACTION_DRAG_EXITED = 6;
    public String toString() {
        return "DragEvent{" + Integer.toHexString(System.identityHashCode(this))
        + " action=" + mAction + " @ (" + mX + ", " + mY + ") desc=" + mClipDescription
        + " data=" + mClipData + " result=" + mDragResult
        + " data=" + mClipData + " local=" + mLocalState + " result=" + mDragResult
        + "}";
    }

+6 −2
Original line number Diff line number Diff line
@@ -708,16 +708,20 @@ public class WindowManagerService extends IWindowManager.Stub

            // Move the surface to the given touch
            if (SHOW_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION notifyMoveLw");
            mSurface.openTransaction();
            Surface.openTransaction();
            try {
                mSurface.setPosition((int)(x - mThumbOffsetX), (int)(y - mThumbOffsetY));
            } finally {
                mSurface.closeTransaction();
                Surface.closeTransaction();
                if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION notifyMoveLw");
            }

            // Tell the affected window
            WindowState touchedWin = getTouchedWinAtPointLw(x, y);
            if (touchedWin == null) {
                if (DEBUG_DRAG) Slog.d(TAG, "No touched win at x=" + x + " y=" + y);
                return;
            }
            if ((mFlags & View.DRAG_FLAG_GLOBAL) == 0) {
                final IBinder touchedBinder = touchedWin.mClient.asBinder();
                if (touchedBinder != mLocalWin) {