Merge "Notify InputEventAssigner about every frame" into sc-dev

This commit is contained in:
Siarhei Vishniakou
2021-03-22 17:58:12 +00:00
committed by Android (Google) Code Review
3 changed files with 20 additions and 33 deletions

View File

@@ -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();
}
}

View File

@@ -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;
}

View File

@@ -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)