Merge changes from topic "Fix WindowFocusTests Flaky-rvc-dev" into rvc-dev am: dcea9181e5 am: 59a8a01923 am: 93d7fbf823
Change-Id: I2660a3a84fb56ebfcd41df2f74a88570444cfd0b
This commit is contained in:
@@ -76,7 +76,6 @@ import android.view.InputChannel;
|
|||||||
import android.view.InputDevice;
|
import android.view.InputDevice;
|
||||||
import android.view.InputEvent;
|
import android.view.InputEvent;
|
||||||
import android.view.InputMonitor;
|
import android.view.InputMonitor;
|
||||||
import android.view.InputWindowHandle;
|
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
import android.view.PointerIcon;
|
import android.view.PointerIcon;
|
||||||
import android.view.Surface;
|
import android.view.Surface;
|
||||||
@@ -221,8 +220,7 @@ public class InputManagerService extends IInputManager.Stub
|
|||||||
int policyFlags);
|
int policyFlags);
|
||||||
private static native VerifiedInputEvent nativeVerifyInputEvent(long ptr, InputEvent event);
|
private static native VerifiedInputEvent nativeVerifyInputEvent(long ptr, InputEvent event);
|
||||||
private static native void nativeToggleCapsLock(long ptr, int deviceId);
|
private static native void nativeToggleCapsLock(long ptr, int deviceId);
|
||||||
private static native void nativeSetInputWindows(long ptr, InputWindowHandle[] windowHandles,
|
private static native void nativeDisplayRemoved(long ptr, int displayId);
|
||||||
int displayId);
|
|
||||||
private static native void nativeSetInputDispatchMode(long ptr, boolean enabled, boolean frozen);
|
private static native void nativeSetInputDispatchMode(long ptr, boolean enabled, boolean frozen);
|
||||||
private static native void nativeSetSystemUiVisibility(long ptr, int visibility);
|
private static native void nativeSetSystemUiVisibility(long ptr, int visibility);
|
||||||
private static native void nativeSetFocusedApplication(long ptr,
|
private static native void nativeSetFocusedApplication(long ptr,
|
||||||
@@ -1536,7 +1534,7 @@ public class InputManagerService extends IInputManager.Stub
|
|||||||
|
|
||||||
/** Clean up input window handles of the given display. */
|
/** Clean up input window handles of the given display. */
|
||||||
public void onDisplayRemoved(int displayId) {
|
public void onDisplayRemoved(int displayId) {
|
||||||
nativeSetInputWindows(mPtr, null /* windowHandles */, displayId);
|
nativeDisplayRemoved(mPtr, displayId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ final class InputMonitor {
|
|||||||
// When true, need to call updateInputWindowsLw().
|
// When true, need to call updateInputWindowsLw().
|
||||||
private boolean mUpdateInputWindowsNeeded = true;
|
private boolean mUpdateInputWindowsNeeded = true;
|
||||||
private boolean mUpdateInputWindowsPending;
|
private boolean mUpdateInputWindowsPending;
|
||||||
private boolean mApplyImmediately;
|
private boolean mUpdateInputWindowsImmediately;
|
||||||
|
|
||||||
// Currently focused input window handle.
|
// Currently focused input window handle.
|
||||||
private InputWindowHandle mFocusedInputWindowHandle;
|
private InputWindowHandle mFocusedInputWindowHandle;
|
||||||
@@ -347,14 +347,20 @@ final class InputMonitor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateInputWindowsImmediately() {
|
/**
|
||||||
|
* Immediately update the input transaction and merge into the passing Transaction that could be
|
||||||
|
* collected and applied later.
|
||||||
|
*/
|
||||||
|
void updateInputWindowsImmediately(SurfaceControl.Transaction t) {
|
||||||
mHandler.removeCallbacks(mUpdateInputWindows);
|
mHandler.removeCallbacks(mUpdateInputWindows);
|
||||||
mApplyImmediately = true;
|
mUpdateInputWindowsImmediately = true;
|
||||||
mUpdateInputWindows.run();
|
mUpdateInputWindows.run();
|
||||||
mApplyImmediately = false;
|
mUpdateInputWindowsImmediately = false;
|
||||||
|
t.merge(mInputTransaction);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called when the current input focus changes.
|
/**
|
||||||
|
* Called when the current input focus changes.
|
||||||
* Layer assignment is assumed to be complete by the time this is called.
|
* Layer assignment is assumed to be complete by the time this is called.
|
||||||
*/
|
*/
|
||||||
public void setInputFocusLw(WindowState newWindow, boolean updateInputWindows) {
|
public void setInputFocusLw(WindowState newWindow, boolean updateInputWindows) {
|
||||||
@@ -465,10 +471,7 @@ final class InputMonitor {
|
|||||||
if (mAddWallpaperInputConsumerHandle) {
|
if (mAddWallpaperInputConsumerHandle) {
|
||||||
mWallpaperInputConsumer.show(mInputTransaction, 0);
|
mWallpaperInputConsumer.show(mInputTransaction, 0);
|
||||||
}
|
}
|
||||||
|
if (!mUpdateInputWindowsImmediately) {
|
||||||
if (mApplyImmediately) {
|
|
||||||
mInputTransaction.apply();
|
|
||||||
} else {
|
|
||||||
mDisplayContent.getPendingTransaction().merge(mInputTransaction);
|
mDisplayContent.getPendingTransaction().merge(mInputTransaction);
|
||||||
mDisplayContent.scheduleAnimation();
|
mDisplayContent.scheduleAnimation();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -268,8 +268,9 @@ class TaskPositioner implements IBinder.DeathRecipient {
|
|||||||
mDisplayContent.getDisplayRotation().pause();
|
mDisplayContent.getDisplayRotation().pause();
|
||||||
|
|
||||||
// Notify InputMonitor to take mDragWindowHandle.
|
// Notify InputMonitor to take mDragWindowHandle.
|
||||||
mDisplayContent.getInputMonitor().updateInputWindowsImmediately();
|
final SurfaceControl.Transaction t = mService.mTransactionFactory.get();
|
||||||
new SurfaceControl.Transaction().syncInputWindows().apply(true);
|
mDisplayContent.getInputMonitor().updateInputWindowsImmediately(t);
|
||||||
|
t.syncInputWindows().apply();
|
||||||
|
|
||||||
final DisplayMetrics displayMetrics = displayContent.getDisplayMetrics();
|
final DisplayMetrics displayMetrics = displayContent.getDisplayMetrics();
|
||||||
mMinVisibleWidth = dipToPixel(MINIMUM_VISIBLE_WIDTH_IN_DP, displayMetrics);
|
mMinVisibleWidth = dipToPixel(MINIMUM_VISIBLE_WIDTH_IN_DP, displayMetrics);
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ public class WindowAnimator {
|
|||||||
* vsync-app and then schedule the animation tick at the right time (vsync-sf).
|
* vsync-app and then schedule the animation tick at the right time (vsync-sf).
|
||||||
*/
|
*/
|
||||||
private boolean mAnimationFrameCallbackScheduled;
|
private boolean mAnimationFrameCallbackScheduled;
|
||||||
|
boolean mNotifyWhenNoAnimation = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A list of runnable that need to be run after {@link WindowContainer#prepareSurfaces} is
|
* A list of runnable that need to be run after {@link WindowContainer#prepareSurfaces} is
|
||||||
@@ -97,6 +98,9 @@ public class WindowAnimator {
|
|||||||
synchronized (mService.mGlobalLock) {
|
synchronized (mService.mGlobalLock) {
|
||||||
mAnimationFrameCallbackScheduled = false;
|
mAnimationFrameCallbackScheduled = false;
|
||||||
animate(frameTimeNs);
|
animate(frameTimeNs);
|
||||||
|
if (mNotifyWhenNoAnimation && !mLastRootAnimating) {
|
||||||
|
mService.mGlobalLock.notifyAll();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -193,7 +193,6 @@ import android.text.format.DateUtils;
|
|||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.util.Log;
|
|
||||||
import android.util.MergedConfiguration;
|
import android.util.MergedConfiguration;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
@@ -7734,19 +7733,30 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
public void syncInputTransactions() {
|
public void syncInputTransactions() {
|
||||||
waitForAnimationsToComplete();
|
waitForAnimationsToComplete();
|
||||||
|
|
||||||
|
// Collect all input transactions from all displays to make sure we could sync all input
|
||||||
|
// windows at same time.
|
||||||
|
final SurfaceControl.Transaction t = mTransactionFactory.get();
|
||||||
synchronized (mGlobalLock) {
|
synchronized (mGlobalLock) {
|
||||||
mWindowPlacerLocked.performSurfacePlacementIfScheduled();
|
mWindowPlacerLocked.performSurfacePlacementIfScheduled();
|
||||||
mRoot.forAllDisplays(displayContent ->
|
mRoot.forAllDisplays(displayContent ->
|
||||||
displayContent.getInputMonitor().updateInputWindowsImmediately());
|
displayContent.getInputMonitor().updateInputWindowsImmediately(t));
|
||||||
}
|
}
|
||||||
|
|
||||||
mTransactionFactory.get().syncInputWindows().apply(true);
|
t.syncInputWindows().apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wait until all container animations and surface operations behalf of WindowManagerService
|
||||||
|
* complete.
|
||||||
|
*/
|
||||||
private void waitForAnimationsToComplete() {
|
private void waitForAnimationsToComplete() {
|
||||||
synchronized (mGlobalLock) {
|
synchronized (mGlobalLock) {
|
||||||
long timeoutRemaining = ANIMATION_COMPLETED_TIMEOUT_MS;
|
long timeoutRemaining = ANIMATION_COMPLETED_TIMEOUT_MS;
|
||||||
while (mRoot.isAnimating(TRANSITION | CHILDREN) && timeoutRemaining > 0) {
|
// This could prevent if there is no container animation, we still have to apply the
|
||||||
|
// pending transaction and exit waiting.
|
||||||
|
mAnimator.mNotifyWhenNoAnimation = true;
|
||||||
|
while ((mAnimator.isAnimationScheduled()
|
||||||
|
|| mRoot.isAnimating(TRANSITION | CHILDREN)) && timeoutRemaining > 0) {
|
||||||
long startTime = System.currentTimeMillis();
|
long startTime = System.currentTimeMillis();
|
||||||
try {
|
try {
|
||||||
mGlobalLock.wait(timeoutRemaining);
|
mGlobalLock.wait(timeoutRemaining);
|
||||||
@@ -7754,9 +7764,11 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
}
|
}
|
||||||
timeoutRemaining -= (System.currentTimeMillis() - startTime);
|
timeoutRemaining -= (System.currentTimeMillis() - startTime);
|
||||||
}
|
}
|
||||||
|
mAnimator.mNotifyWhenNoAnimation = false;
|
||||||
|
|
||||||
if (mRoot.isAnimating(TRANSITION | CHILDREN)) {
|
if (mAnimator.isAnimationScheduled()
|
||||||
Log.w(TAG, "Timed out waiting for animations to complete.");
|
|| mRoot.isAnimating(TRANSITION | CHILDREN)) {
|
||||||
|
Slog.w(TAG, "Timed out waiting for animations to complete.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -206,7 +206,7 @@ public:
|
|||||||
status_t unregisterInputChannel(JNIEnv* env, const sp<InputChannel>& inputChannel);
|
status_t unregisterInputChannel(JNIEnv* env, const sp<InputChannel>& inputChannel);
|
||||||
status_t pilferPointers(const sp<IBinder>& token);
|
status_t pilferPointers(const sp<IBinder>& token);
|
||||||
|
|
||||||
void setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray, int32_t displayId);
|
void displayRemoved(JNIEnv* env, int32_t displayId);
|
||||||
void setFocusedApplication(JNIEnv* env, int32_t displayId, jobject applicationHandleObj);
|
void setFocusedApplication(JNIEnv* env, int32_t displayId, jobject applicationHandleObj);
|
||||||
void setFocusedDisplay(JNIEnv* env, int32_t displayId);
|
void setFocusedDisplay(JNIEnv* env, int32_t displayId);
|
||||||
void setInputDispatchMode(bool enabled, bool frozen);
|
void setInputDispatchMode(bool enabled, bool frozen);
|
||||||
@@ -771,55 +771,10 @@ void NativeInputManager::getDispatcherConfiguration(InputDispatcherConfiguration
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeInputManager::setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray,
|
void NativeInputManager::displayRemoved(JNIEnv* env, int32_t displayId) {
|
||||||
int32_t displayId) {
|
// Set an empty list to remove all handles from the specific display.
|
||||||
std::vector<sp<InputWindowHandle> > windowHandles;
|
std::vector<sp<InputWindowHandle>> windowHandles;
|
||||||
|
mInputManager->getDispatcher()->setInputWindows({{displayId, windowHandles}});
|
||||||
if (windowHandleObjArray) {
|
|
||||||
jsize length = env->GetArrayLength(windowHandleObjArray);
|
|
||||||
for (jsize i = 0; i < length; i++) {
|
|
||||||
jobject windowHandleObj = env->GetObjectArrayElement(windowHandleObjArray, i);
|
|
||||||
if (! windowHandleObj) {
|
|
||||||
break; // found null element indicating end of used portion of the array
|
|
||||||
}
|
|
||||||
|
|
||||||
sp<InputWindowHandle> windowHandle =
|
|
||||||
android_view_InputWindowHandle_getHandle(env, windowHandleObj);
|
|
||||||
if (windowHandle != nullptr) {
|
|
||||||
windowHandles.push_back(windowHandle);
|
|
||||||
}
|
|
||||||
env->DeleteLocalRef(windowHandleObj);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mInputManager->getDispatcher()->setInputWindows(windowHandles, displayId);
|
|
||||||
|
|
||||||
// Do this after the dispatcher has updated the window handle state.
|
|
||||||
bool newPointerGesturesEnabled = true;
|
|
||||||
size_t numWindows = windowHandles.size();
|
|
||||||
for (size_t i = 0; i < numWindows; i++) {
|
|
||||||
const sp<InputWindowHandle>& windowHandle = windowHandles[i];
|
|
||||||
const InputWindowInfo* windowInfo = windowHandle->getInfo();
|
|
||||||
if (windowInfo && windowInfo->hasFocus && (windowInfo->inputFeatures
|
|
||||||
& InputWindowInfo::INPUT_FEATURE_DISABLE_TOUCH_PAD_GESTURES)) {
|
|
||||||
newPointerGesturesEnabled = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool pointerGesturesEnabledChanged = false;
|
|
||||||
{ // acquire lock
|
|
||||||
AutoMutex _l(mLock);
|
|
||||||
|
|
||||||
if (mLocked.pointerGesturesEnabled != newPointerGesturesEnabled) {
|
|
||||||
mLocked.pointerGesturesEnabled = newPointerGesturesEnabled;
|
|
||||||
pointerGesturesEnabledChanged = true;
|
|
||||||
}
|
|
||||||
} // release lock
|
|
||||||
|
|
||||||
if (pointerGesturesEnabledChanged) {
|
|
||||||
mInputManager->getReader()->requestRefreshConfiguration(
|
|
||||||
InputReaderConfiguration::CHANGE_POINTER_GESTURE_ENABLEMENT);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeInputManager::setFocusedApplication(JNIEnv* env, int32_t displayId,
|
void NativeInputManager::setFocusedApplication(JNIEnv* env, int32_t displayId,
|
||||||
@@ -1567,11 +1522,10 @@ static void nativeToggleCapsLock(JNIEnv* env, jclass /* clazz */,
|
|||||||
im->getInputManager()->getReader()->toggleCapsLockState(deviceId);
|
im->getInputManager()->getReader()->toggleCapsLockState(deviceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nativeSetInputWindows(JNIEnv* env, jclass /* clazz */,
|
static void nativeDisplayRemoved(JNIEnv* env, jclass /* clazz */, jlong ptr, jint displayId) {
|
||||||
jlong ptr, jobjectArray windowHandleObjArray, jint displayId) {
|
|
||||||
NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
|
NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
|
||||||
|
|
||||||
im->setInputWindows(env, windowHandleObjArray, displayId);
|
im->displayRemoved(env, displayId);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nativeSetFocusedApplication(JNIEnv* env, jclass /* clazz */,
|
static void nativeSetFocusedApplication(JNIEnv* env, jclass /* clazz */,
|
||||||
@@ -1815,8 +1769,7 @@ static const JNINativeMethod gInputManagerMethods[] = {
|
|||||||
{"nativeVerifyInputEvent", "(JLandroid/view/InputEvent;)Landroid/view/VerifiedInputEvent;",
|
{"nativeVerifyInputEvent", "(JLandroid/view/InputEvent;)Landroid/view/VerifiedInputEvent;",
|
||||||
(void*)nativeVerifyInputEvent},
|
(void*)nativeVerifyInputEvent},
|
||||||
{"nativeToggleCapsLock", "(JI)V", (void*)nativeToggleCapsLock},
|
{"nativeToggleCapsLock", "(JI)V", (void*)nativeToggleCapsLock},
|
||||||
{"nativeSetInputWindows", "(J[Landroid/view/InputWindowHandle;I)V",
|
{"nativeDisplayRemoved", "(JI)V", (void*)nativeDisplayRemoved},
|
||||||
(void*)nativeSetInputWindows},
|
|
||||||
{"nativeSetFocusedApplication", "(JILandroid/view/InputApplicationHandle;)V",
|
{"nativeSetFocusedApplication", "(JILandroid/view/InputApplicationHandle;)V",
|
||||||
(void*)nativeSetFocusedApplication},
|
(void*)nativeSetFocusedApplication},
|
||||||
{"nativeSetFocusedDisplay", "(JI)V", (void*)nativeSetFocusedDisplay},
|
{"nativeSetFocusedDisplay", "(JI)V", (void*)nativeSetFocusedDisplay},
|
||||||
|
|||||||
Reference in New Issue
Block a user