diff options
| -rw-r--r-- | core/java/android/view/InputEventAssigner.java | 43 | ||||
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 6 | ||||
| -rw-r--r-- | tests/Input/src/com/android/test/input/InputEventAssignerTest.kt | 4 |
3 files changed, 20 insertions, 33 deletions
diff --git a/core/java/android/view/InputEventAssigner.java b/core/java/android/view/InputEventAssigner.java index c159a127f4eb..7fac6c5e4af6 100644 --- a/core/java/android/view/InputEventAssigner.java +++ b/core/java/android/view/InputEventAssigner.java @@ -45,13 +45,13 @@ import static android.view.InputDevice.SOURCE_TOUCHSCREEN; public class InputEventAssigner { private static final String TAG = "InputEventAssigner"; private boolean mHasUnprocessedDown = false; - private int mEventId = INVALID_INPUT_EVENT_ID; + private int mDownEventId = INVALID_INPUT_EVENT_ID; /** - * Notify InputEventAssigner that the Choreographer callback has been processed. This will reset - * the 'down' state to assign the latest input event to the current frame. + * Notify InputEventAssigner that a frame has been processed. We no longer need to keep track of + * the DOWN event because a frame has already been produced for it. */ - public void onChoreographerCallback() { + public void notifyFrameProcessed() { // Mark completion of this frame. Use newest input event from now on. mHasUnprocessedDown = false; } @@ -62,31 +62,22 @@ public class InputEventAssigner { * @return the id of the input event to use for the current frame */ public int processEvent(InputEvent event) { - if (event instanceof KeyEvent) { - // We will not do any special handling for key events - return event.getId(); - } - if (event instanceof MotionEvent) { MotionEvent motionEvent = (MotionEvent) event; - final int action = motionEvent.getActionMasked(); - - if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) { - mHasUnprocessedDown = false; + if (motionEvent.isFromSource(SOURCE_TOUCHSCREEN)) { + final int action = motionEvent.getActionMasked(); + if (action == MotionEvent.ACTION_DOWN) { + mHasUnprocessedDown = true; + mDownEventId = event.getId(); + } + if (mHasUnprocessedDown && action == MotionEvent.ACTION_MOVE) { + return mDownEventId; + } + if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) { + mHasUnprocessedDown = false; + } } - if (motionEvent.isFromSource(SOURCE_TOUCHSCREEN) && action == MotionEvent.ACTION_DOWN) { - mHasUnprocessedDown = true; - mEventId = event.getId(); - // This will remain 'true' even if we receive a MOVE event, as long as choreographer - // hasn't invoked the 'CALLBACK_INPUT' callback. - } - // Don't update the event id if we haven't processed DOWN yet. - if (!mHasUnprocessedDown) { - mEventId = event.getId(); - } - return mEventId; } - - throw new IllegalArgumentException("Received unexpected " + event); + return event.getId(); } } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index e4fb61107c4a..09a42cae52f1 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -474,6 +474,7 @@ public final class ViewRootImpl implements ViewParent, FrameInfo frameInfo = mChoreographer.mFrameInfo; mViewFrameInfo.populateFrameInfo(frameInfo); mViewFrameInfo.reset(); + mInputEventAssigner.notifyFrameProcessed(); return frameInfo; } @@ -8502,11 +8503,6 @@ public final class ViewRootImpl implements ViewParent, consumedBatches = false; } doProcessInputEvents(); - if (consumedBatches) { - // Must be done after we processed the input events, to mark the completion of the frame - // from the input point of view - mInputEventAssigner.onChoreographerCallback(); - } return consumedBatches; } diff --git a/tests/Input/src/com/android/test/input/InputEventAssignerTest.kt b/tests/Input/src/com/android/test/input/InputEventAssignerTest.kt index b9b347b02958..c1a86b3a2dac 100644 --- a/tests/Input/src/com/android/test/input/InputEventAssignerTest.kt +++ b/tests/Input/src/com/android/test/input/InputEventAssignerTest.kt @@ -87,7 +87,7 @@ class InputEventAssignerTest { assertEquals(down.id, eventId) // Now send CALLBACK_INPUT to the assigner. It should provide the latest motion event - assigner.onChoreographerCallback() + assigner.notifyFrameProcessed() eventId = assigner.processEvent(move3) assertEquals(move3.id, eventId) eventId = assigner.processEvent(move4) @@ -122,7 +122,7 @@ class InputEventAssignerTest { eventId = assigner.processEvent(up) // DOWN is only sticky for Motions, not for keys assertEquals(up.id, eventId) - assigner.onChoreographerCallback() + assigner.notifyFrameProcessed() val down2 = createKeyEvent(KeyEvent.ACTION_DOWN, 22) eventId = assigner.processEvent(down2) assertEquals(down2.id, eventId) |