Sync input transactions after ACTION_UP
Changes to windows can happen before or after a touch gesture. For example, a window can be dismissed after ACTION_UP occurs. For those scenarios, sync input transactions after the ACTION_UP event has been injected. Bug: 134414988 Test: atest MultiDisplayPolicyTests Test: atest android.app.cts.DialogTest Test: TaplTestsQuickstep Test: atest ActivityLifecycleTopResumedStateTests Merged-In: I810fad449ea405d104009075d2698109a620a91e Change-Id: I810fad449ea405d104009075d2698109a620a91e
This commit is contained in:
@@ -7626,22 +7626,30 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean injectInputAfterTransactionsApplied(InputEvent ev, int mode) {
|
public boolean injectInputAfterTransactionsApplied(InputEvent ev, int mode) {
|
||||||
boolean shouldWaitForAnimToComplete = false;
|
boolean isDown;
|
||||||
|
boolean isUp;
|
||||||
|
|
||||||
if (ev instanceof KeyEvent) {
|
if (ev instanceof KeyEvent) {
|
||||||
KeyEvent keyEvent = (KeyEvent) ev;
|
KeyEvent keyEvent = (KeyEvent) ev;
|
||||||
shouldWaitForAnimToComplete = keyEvent.getSource() == InputDevice.SOURCE_MOUSE
|
isDown = keyEvent.getAction() == KeyEvent.ACTION_DOWN;
|
||||||
|| keyEvent.getAction() == KeyEvent.ACTION_DOWN;
|
isUp = keyEvent.getAction() == KeyEvent.ACTION_UP;
|
||||||
} else if (ev instanceof MotionEvent) {
|
} else {
|
||||||
MotionEvent motionEvent = (MotionEvent) ev;
|
MotionEvent motionEvent = (MotionEvent) ev;
|
||||||
shouldWaitForAnimToComplete = motionEvent.getSource() == InputDevice.SOURCE_MOUSE
|
isDown = motionEvent.getAction() == MotionEvent.ACTION_DOWN;
|
||||||
|| motionEvent.getAction() == MotionEvent.ACTION_DOWN;
|
isUp = motionEvent.getAction() == MotionEvent.ACTION_UP;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shouldWaitForAnimToComplete) {
|
// For ACTION_DOWN, syncInputTransactions before injecting input.
|
||||||
|
// For ACTION_UP, sync after injecting.
|
||||||
|
if (isDown) {
|
||||||
syncInputTransactions();
|
syncInputTransactions();
|
||||||
}
|
}
|
||||||
|
final boolean result =
|
||||||
return LocalServices.getService(InputManagerInternal.class).injectInputEvent(ev, mode);
|
LocalServices.getService(InputManagerInternal.class).injectInputEvent(ev, mode);
|
||||||
|
if (isUp) {
|
||||||
|
syncInputTransactions();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user