* commit 'cd250cc8b781c64df8b8d63853d9082f29a6fc2f': Check view and focus invariants after calling into app
This commit is contained in:
@@ -3393,16 +3393,7 @@ public final class ViewRootImpl implements ViewParent,
|
||||
public final void deliver(QueuedInputEvent q) {
|
||||
if ((q.mFlags & QueuedInputEvent.FLAG_FINISHED) != 0) {
|
||||
forward(q);
|
||||
} else if (mView == null || !mAdded) {
|
||||
Slog.w(TAG, "Dropping event due to root view being removed: " + q.mEvent);
|
||||
finish(q, false);
|
||||
} else if (!mAttachInfo.mHasWindowFocus &&
|
||||
!q.mEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER) &&
|
||||
!isTerminalInputEvent(q.mEvent)) {
|
||||
// If this is a focused event and the window doesn't currently have input focus,
|
||||
// then drop this event. This could be an event that came back from the previous
|
||||
// stage but the window has lost focus in the meantime.
|
||||
Slog.w(TAG, "Dropping event due to no window focus: " + q.mEvent);
|
||||
} else if (shouldDropInputEvent(q)) {
|
||||
finish(q, false);
|
||||
} else {
|
||||
apply(q, onProcess(q));
|
||||
@@ -3461,6 +3452,22 @@ public final class ViewRootImpl implements ViewParent,
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean shouldDropInputEvent(QueuedInputEvent q) {
|
||||
if (mView == null || !mAdded) {
|
||||
Slog.w(TAG, "Dropping event due to root view being removed: " + q.mEvent);
|
||||
return true;
|
||||
} else if (!mAttachInfo.mHasWindowFocus &&
|
||||
!q.mEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER) &&
|
||||
!isTerminalInputEvent(q.mEvent)) {
|
||||
// If this is a focused event and the window doesn't currently have input focus,
|
||||
// then drop this event. This could be an event that came back from the previous
|
||||
// stage but the window has lost focus in the meantime.
|
||||
Slog.w(TAG, "Dropping event due to no window focus: " + q.mEvent);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void dump(String prefix, PrintWriter writer) {
|
||||
if (mNext != null) {
|
||||
mNext.dump(prefix, writer);
|
||||
@@ -3846,6 +3853,10 @@ public final class ViewRootImpl implements ViewParent,
|
||||
return FINISH_HANDLED;
|
||||
}
|
||||
|
||||
if (shouldDropInputEvent(q)) {
|
||||
return FINISH_NOT_HANDLED;
|
||||
}
|
||||
|
||||
// If the Control modifier is held, try to interpret the key as a shortcut.
|
||||
if (event.getAction() == KeyEvent.ACTION_DOWN
|
||||
&& event.isCtrlPressed()
|
||||
@@ -3854,12 +3865,18 @@ public final class ViewRootImpl implements ViewParent,
|
||||
if (mView.dispatchKeyShortcutEvent(event)) {
|
||||
return FINISH_HANDLED;
|
||||
}
|
||||
if (shouldDropInputEvent(q)) {
|
||||
return FINISH_NOT_HANDLED;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the fallback event policy.
|
||||
if (mFallbackEventHandler.dispatchKeyEvent(event)) {
|
||||
return FINISH_HANDLED;
|
||||
}
|
||||
if (shouldDropInputEvent(q)) {
|
||||
return FINISH_NOT_HANDLED;
|
||||
}
|
||||
|
||||
// Handle automatic focus changes.
|
||||
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
||||
|
||||
Reference in New Issue
Block a user