From 65c067083e663805ed41ca0ae787345d186b0624 Mon Sep 17 00:00:00 2001 From: Phil Weaver Date: Tue, 15 Mar 2016 15:33:46 -0700 Subject: [PATCH] Stop non-touchable regions affecting magnification A window's magnifiability only applies to its touchable regions, so a non-touchable shadow over an IME won't affect the IME's magnifiability. Bug: 27179277 Change-Id: I86076e001035678c73973d7a98e0dcac6143553e --- .../server/wm/AccessibilityController.java | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java index 98d44ac3bffef..b501398c7d573 100644 --- a/services/core/java/com/android/server/wm/AccessibilityController.java +++ b/services/core/java/com/android/server/wm/AccessibilityController.java @@ -509,34 +509,35 @@ final class AccessibilityController { continue; } - Region windowBounds = mTempRegion2; + // Consider the touchable portion of the window Matrix matrix = mTempMatrix; populateTransformationMatrixLocked(windowState, matrix); + Region touchableRegion = mTempRegion3; + windowState.getTouchableRegion(touchableRegion); + Rect touchableFrame = mTempRect1; + touchableRegion.getBounds(touchableFrame); RectF windowFrame = mTempRectF; + windowFrame.set(touchableFrame); + windowFrame.offset(-windowState.mFrame.left, -windowState.mFrame.top); + matrix.mapRect(windowFrame); + Region windowBounds = mTempRegion2; + windowBounds.set((int) windowFrame.left, (int) windowFrame.top, + (int) windowFrame.right, (int) windowFrame.bottom); + // Only update new regions + Region portionOfWindowAlreadyAccountedFor = mTempRegion3; + portionOfWindowAlreadyAccountedFor.set(mMagnifiedBounds); + portionOfWindowAlreadyAccountedFor.op(nonMagnifiedBounds, Region.Op.UNION); + windowBounds.op(portionOfWindowAlreadyAccountedFor, Region.Op.DIFFERENCE); if (mWindowManagerService.mPolicy.canMagnifyWindow(windowState.mAttrs.type)) { - windowFrame.set(windowState.mFrame); - windowFrame.offset(-windowFrame.left, -windowFrame.top); - matrix.mapRect(windowFrame); - windowBounds.set((int) windowFrame.left, (int) windowFrame.top, - (int) windowFrame.right, (int) windowFrame.bottom); mMagnifiedBounds.op(windowBounds, Region.Op.UNION); mMagnifiedBounds.op(mAvailableBounds, Region.Op.INTERSECT); } else { - Region touchableRegion = mTempRegion3; - windowState.getTouchableRegion(touchableRegion); - Rect touchableFrame = mTempRect1; - touchableRegion.getBounds(touchableFrame); - windowFrame.set(touchableFrame); - windowFrame.offset(-windowState.mFrame.left, -windowState.mFrame.top); - matrix.mapRect(windowFrame); - windowBounds.set((int) windowFrame.left, (int) windowFrame.top, - (int) windowFrame.right, (int) windowFrame.bottom); nonMagnifiedBounds.op(windowBounds, Region.Op.UNION); - windowBounds.op(mMagnifiedBounds, Region.Op.DIFFERENCE); mAvailableBounds.op(windowBounds, Region.Op.DIFFERENCE); } + // Update accounted bounds Region accountedBounds = mTempRegion2; accountedBounds.set(mMagnifiedBounds); accountedBounds.op(nonMagnifiedBounds, Region.Op.UNION);