summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Riddle Hsu <riddlehsu@google.com> 2018-12-05 21:43:02 +0800
committer Riddle Hsu <riddlehsu@google.com> 2018-12-05 21:43:02 +0800
commitff03df5043b8060e8799763a792aa76ac73661f5 (patch)
tree4954a652dacf659189128a46cdda4b13ba8ac6c2
parent6b611eaefcd2c3be2bdcbd1c4f52b6152e5f1eee (diff)
Only use surface based touchable region for updating input window
The usages of magnification, touch-exclude-region, drag-and-drop, window info for accessibility still need the real position on screen. Bug: 120242516 Test: atest LoginActivityTest#testSaveOnly Change-Id: I49f8b5d0481fa3ffdec70aecac0f10da6e2284b6
-rw-r--r--services/core/java/com/android/server/wm/InputMonitor.java2
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java22
2 files changed, 17 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java
index 88b22cb5e01e..c1e9a7353fd5 100644
--- a/services/core/java/com/android/server/wm/InputMonitor.java
+++ b/services/core/java/com/android/server/wm/InputMonitor.java
@@ -194,7 +194,7 @@ final class InputMonitor {
final boolean hasFocus, final boolean hasWallpaper) {
// Add a window to our list of input windows.
inputWindowHandle.name = child.toString();
- flags = child.getTouchableRegion(inputWindowHandle.touchableRegion, flags);
+ flags = child.getSurfaceTouchableRegion(inputWindowHandle.touchableRegion, flags);
inputWindowHandle.layoutParamsFlags = flags;
inputWindowHandle.layoutParamsType = type;
inputWindowHandle.dispatchingTimeoutNanos = child.getInputDispatchingTimeoutNanos();
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index cdf911881395..2d47e5442fe0 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -2145,7 +2145,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
}
- int getTouchableRegion(Region region, int flags) {
+ int getSurfaceTouchableRegion(Region region, int flags) {
final boolean modal = (flags & (FLAG_NOT_TOUCH_MODAL | FLAG_NOT_FOCUSABLE)) == 0;
if (modal && mAppToken != null) {
// Limit the outer touch to the activity stack region.
@@ -2173,7 +2173,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
region.translate(-mWindowFrames.mFrame.left, -mWindowFrames.mFrame.top);
} else {
// Not modal or full screen modal
- getTouchableRegion(region);
+ getTouchableRegion(region, true /* forSurface */);
}
// The area containing the shadows is not touchable.
@@ -2810,7 +2810,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
frame.right - inset.right, frame.bottom - inset.bottom);
}
+ /** Get the touchable region in global coordinates. */
void getTouchableRegion(Region outRegion) {
+ getTouchableRegion(outRegion, false /* forSurface */);
+ }
+
+ /** If {@param forSuface} is {@code true}, the region will be translated to surface based. */
+ private void getTouchableRegion(Region outRegion, boolean forSurface) {
if (inPinnedWindowingMode() && !isFocused()) {
outRegion.setEmpty();
return;
@@ -2821,22 +2827,26 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
default:
case TOUCHABLE_INSETS_FRAME:
outRegion.set(frame);
- outRegion.translate(-frame.left, -frame.top);
break;
case TOUCHABLE_INSETS_CONTENT:
applyInsets(outRegion, frame, mGivenContentInsets);
- outRegion.translate(-frame.left, -frame.top);
break;
case TOUCHABLE_INSETS_VISIBLE:
applyInsets(outRegion, frame, mGivenVisibleInsets);
- outRegion.translate(-frame.left, -frame.top);
break;
case TOUCHABLE_INSETS_REGION: {
outRegion.set(mGivenTouchableRegion);
break;
}
}
- outRegion.translate(mAttrs.surfaceInsets.left, mAttrs.surfaceInsets.top);
+
+ if (forSurface) {
+ if (mTouchableInsets != TOUCHABLE_INSETS_REGION) {
+ outRegion.translate(-frame.left, -frame.top);
+ }
+ outRegion.getBounds(mTmpRect);
+ applyInsets(outRegion, mTmpRect, mAttrs.surfaceInsets);
+ }
}
private void cropRegionToStackBoundsIfNeeded(Region region) {