Merge "Added direct call to syncInputTransactions" into qt-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
6ce572ec6c
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user