diff options
| author | 2020-06-22 10:13:51 +0000 | |
|---|---|---|
| committer | 2020-06-22 10:13:51 +0000 | |
| commit | 4ed1d04b680e791a2ea27801df257ef5ee30d2ba (patch) | |
| tree | 8c2bc8b8032ce890ddb9765cc9736753242e2ff2 | |
| parent | ff8d81faeeec531306e783448b47b1b38e8c0b54 (diff) | |
| parent | ace942e57bf8b5bc9504c03daf5cdabcadbb8daf (diff) | |
Merge "Fix "Allow/Deny" popup window no respond when enable pointer location" into rvc-dev am: ace942e57b
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11846910
Change-Id: I8a5cb088d618a226495a0c0758734bbe427e35db
| -rw-r--r-- | services/core/java/com/android/server/wm/InputMonitor.java | 50 |
1 files changed, 35 insertions, 15 deletions
diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java index 8734b5efa45d..0e2611d1ddb9 100644 --- a/services/core/java/com/android/server/wm/InputMonitor.java +++ b/services/core/java/com/android/server/wm/InputMonitor.java @@ -477,12 +477,11 @@ final class InputMonitor { mService.getRecentsAnimationController(); final boolean shouldApplyRecentsInputConsumer = recentsAnimationController != null && recentsAnimationController.shouldApplyInputConsumer(w.mActivityRecord); - if (inputChannel == null || inputWindowHandle == null || w.mRemoved - || (w.cantReceiveTouchInput() && !shouldApplyRecentsInputConsumer)) { + if (inputWindowHandle == null || w.mRemoved) { if (w.mWinAnimator.hasSurface()) { mInputTransaction.setInputWindowInfo( - w.mWinAnimator.mSurfaceController.getClientViewRootSurface(), - mInvalidInputWindow); + w.mWinAnimator.mSurfaceController.getClientViewRootSurface(), + mInvalidInputWindow); } // Skip this window because it cannot possibly receive input. return; @@ -491,9 +490,23 @@ final class InputMonitor { final int flags = w.mAttrs.flags; final int privateFlags = w.mAttrs.privateFlags; final int type = w.mAttrs.type; - final boolean hasFocus = w.isFocused(); final boolean isVisible = w.isVisibleLw(); + // Assign an InputInfo with type to the overlay window which can't receive input event. + // This is used to omit Surfaces from occlusion detection. + if (inputChannel == null + || (w.cantReceiveTouchInput() && !shouldApplyRecentsInputConsumer)) { + if (!w.mWinAnimator.hasSurface()) { + return; + } + populateOverlayInputInfo(inputWindowHandle, w.getName(), type, isVisible); + mInputTransaction.setInputWindowInfo( + w.mWinAnimator.mSurfaceController.getClientViewRootSurface(), + inputWindowHandle); + return; + } + + final boolean hasFocus = w.isFocused(); if (mAddRecentsAnimationInputConsumerHandle && shouldApplyRecentsInputConsumer) { if (recentsAnimationController.updateInputConsumerForApp( mRecentsAnimationInputConsumer.mWindowHandle, hasFocus)) { @@ -555,6 +568,22 @@ final class InputMonitor { } } + private static void populateOverlayInputInfo(final InputWindowHandle inputWindowHandle, + final String name, final int type, final boolean isVisible) { + inputWindowHandle.name = name; + inputWindowHandle.layoutParamsType = type; + inputWindowHandle.dispatchingTimeoutNanos = + WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS; + inputWindowHandle.visible = isVisible; + inputWindowHandle.canReceiveKeys = false; + inputWindowHandle.hasFocus = false; + inputWindowHandle.ownerPid = myPid(); + inputWindowHandle.ownerUid = myUid(); + inputWindowHandle.inputFeatures = INPUT_FEATURE_NO_INPUT_CHANNEL; + inputWindowHandle.scaleFactor = 1; + inputWindowHandle.layoutParamsFlags = FLAG_NOT_TOUCH_MODAL; + } + /** * Helper function to generate an InputInfo with type SECURE_SYSTEM_OVERLAY. This input * info will not have an input channel or be touchable, but is used to omit Surfaces @@ -564,16 +593,7 @@ final class InputMonitor { static void setTrustedOverlayInputInfo(SurfaceControl sc, SurfaceControl.Transaction t, int displayId, String name) { InputWindowHandle inputWindowHandle = new InputWindowHandle(null, displayId); - inputWindowHandle.name = name; - inputWindowHandle.layoutParamsType = TYPE_SECURE_SYSTEM_OVERLAY; - inputWindowHandle.dispatchingTimeoutNanos = -1; - inputWindowHandle.visible = true; - inputWindowHandle.canReceiveKeys = false; - inputWindowHandle.hasFocus = false; - inputWindowHandle.ownerPid = myPid(); - inputWindowHandle.ownerUid = myUid(); - inputWindowHandle.inputFeatures = INPUT_FEATURE_NO_INPUT_CHANNEL; - inputWindowHandle.scaleFactor = 1; + populateOverlayInputInfo(inputWindowHandle, name, TYPE_SECURE_SYSTEM_OVERLAY, true); t.setInputWindowInfo(sc, inputWindowHandle); } } |