Merge "Added direct call to syncInputTransactions" into qt-dev

This commit is contained in:
Chavi Weingarten
2019-04-25 16:27:37 +00:00
committed by Android (Google) Code Review
6 changed files with 62 additions and 17 deletions

View 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 {

View 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);

View File

@@ -601,6 +601,25 @@ public final class UiAutomation {
return false;
}
/**
* 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

View File

@@ -128,18 +128,29 @@ 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) {

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

View 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;