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
This commit is contained in:
@ -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) {
|
||||
|
Reference in New Issue
Block a user