OSDN Git Service

Added direct call to syncInputTransactions
authorchaviw <chaviw@google.com>
Mon, 22 Apr 2019 20:39:46 +0000 (13:39 -0700)
committerchaviw <chaviw@google.com>
Thu, 25 Apr 2019 00:01:31 +0000 (17:01 -0700)
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

api/test-current.txt
core/java/android/app/IUiAutomationConnection.aidl
core/java/android/app/UiAutomation.java
core/java/android/app/UiAutomationConnection.java
core/java/android/view/IWindowManager.aidl
services/core/java/com/android/server/wm/WindowManagerService.java

index 63c8df0..a665c0a 100644 (file)
@@ -369,6 +369,7 @@ package android.app {
     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 {
index 96da72a..8c3180b 100644 (file)
@@ -37,6 +37,7 @@ interface IUiAutomationConnection {
     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);
index 4944673..3935628 100644 (file)
@@ -602,6 +602,25 @@ public final class UiAutomation {
     }
 
     /**
+     * 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
index 7e07446..dc07df8 100644 (file)
@@ -128,19 +128,30 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub {
                 : 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();
index 6c37319..c730fe2 100644 (file)
@@ -640,5 +640,14 @@ interface IWindowManager
      * 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();
 }
index d46aa7b..dae29b2 100644 (file)
@@ -7550,20 +7550,24 @@ public class WindowManagerService extends IWindowManager.Stub
         }
 
         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;