Previously, there was only a way to inject input after syncing inputs.
However, some tests require a direct call to sync inputs since we need
to ensure the info was propagated to InputManager native before
continuing with the test. This exposes a method just to
syncInputTransactions.
Bug:
130695122
Test: ActivityLifecycleTopResumedStateTests
Test: MultiDisplayPolicyTests
Change-Id: Ie3115741a20d04c743fd854ac421dc3705332488
method public android.os.ParcelFileDescriptor[] executeShellCommandRw(String);
method @Deprecated public boolean grantRuntimePermission(String, String, android.os.UserHandle);
method @Deprecated public boolean revokeRuntimePermission(String, String, android.os.UserHandle);
+ method public void syncInputTransactions();
}
public class UiModeManager {
void connect(IAccessibilityServiceClient client, int flags);
void disconnect();
boolean injectInputEvent(in InputEvent event, boolean sync);
+ void syncInputTransactions();
boolean setRotation(int rotation);
Bitmap takeScreenshot(in Rect crop, int rotation);
boolean clearWindowContentFrameStats(int windowId);
}
/**
+ * A request for WindowManagerService to wait until all animations have completed and input
+ * information has been sent from WindowManager to native InputManager.
+ *
+ * @hide
+ */
+ @TestApi
+ public void syncInputTransactions() {
+ synchronized (mLock) {
+ throwIfNotConnectedLocked();
+ }
+ try {
+ // Calling out without a lock held.
+ mUiAutomationConnection.syncInputTransactions();
+ } catch (RemoteException re) {
+ Log.e(LOG_TAG, "Error while syncing input transactions!", re);
+ }
+ }
+
+ /**
* Sets the device rotation. A client can freeze the rotation in
* desired state or freeze the rotation to its current state or
* unfreeze the rotation (rotating the device changes its rotation
: InputManager.INJECT_INPUT_EVENT_MODE_ASYNC;
final long identity = Binder.clearCallingIdentity();
try {
- IWindowManager manager = IWindowManager.Stub.asInterface(
- ServiceManager.getService(Context.WINDOW_SERVICE));
- try {
- return manager.injectInputAfterTransactionsApplied(event, mode);
- } catch (RemoteException e) {
- }
- return false;
+ return mWindowManager.injectInputAfterTransactionsApplied(event, mode);
+ } catch (RemoteException e) {
} finally {
Binder.restoreCallingIdentity(identity);
}
+ return false;
}
@Override
+ public void syncInputTransactions() {
+ synchronized (mLock) {
+ throwIfCalledByNotTrustedUidLocked();
+ throwIfShutdownLocked();
+ throwIfNotConnectedLocked();
+ }
+
+ try {
+ mWindowManager.syncInputTransactions();
+ } catch (RemoteException e) {
+ }
+ }
+
+
+ @Override
public boolean setRotation(int rotation) {
synchronized (mLock) {
throwIfCalledByNotTrustedUidLocked();
* This is needed for testing since the system add windows and injects input
* quick enough that the windows don't have time to get sent to InputManager.
*/
- boolean injectInputAfterTransactionsApplied(in InputEvent ev, int mode);
+ boolean injectInputAfterTransactionsApplied(in InputEvent ev, int mode);
+
+ /**
+ * Waits until all animations have completed and input information has been sent from
+ * WindowManager to native InputManager.
+ *
+ * This is needed for testing since we need to ensure input information has been propagated to
+ * native InputManager before proceeding with tests.
+ */
+ void syncInputTransactions();
}
}
if (shouldWaitForAnimToComplete) {
- waitForAnimationsToComplete();
-
- synchronized (mGlobalLock) {
- mWindowPlacerLocked.performSurfacePlacementIfScheduled();
- mRoot.forAllDisplays(displayContent ->
- displayContent.getInputMonitor().updateInputWindowsImmediately());
- }
-
- new SurfaceControl.Transaction().syncInputWindows().apply(true);
+ syncInputTransactions();
}
return LocalServices.getService(InputManagerInternal.class).injectInputEvent(ev, mode);
}
+ @Override
+ public void syncInputTransactions() {
+ waitForAnimationsToComplete();
+
+ synchronized (mGlobalLock) {
+ mWindowPlacerLocked.performSurfacePlacementIfScheduled();
+ mRoot.forAllDisplays(displayContent ->
+ displayContent.getInputMonitor().updateInputWindowsImmediately());
+ }
+ new SurfaceControl.Transaction().syncInputWindows().apply(true);
+ }
+
private void waitForAnimationsToComplete() {
synchronized (mGlobalLock) {
long timeoutRemaining = ANIMATION_COMPLETED_TIMEOUT_MS;