From 83754537f582e7096091d3bf40464a734b490194 Mon Sep 17 00:00:00 2001 From: Tiger Huang Date: Mon, 8 Jun 2020 19:48:17 +0800 Subject: [PATCH] Exclude translation caused by surface insets from the matrix The matrix returned from getTransformationMatrix is used by a11y controller for computing the touchable region. Since the touchable region doesn't include the surface insets area, the translation in the method should not be affected by surface insets. Fix: 151868913 Test: atest WindowStateTests Change-Id: I1ae58716d7270a58d527b807b74cdadc6e4624ab --- .../core/java/com/android/server/wm/WindowState.java | 9 +++++---- .../src/com/android/server/wm/WindowStateTests.java | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 32717d0e1e651..67cc2a3349462 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -5118,17 +5118,18 @@ class WindowState extends WindowContainer implements WindowManagerP float9[Matrix.MSKEW_Y] = mWinAnimator.mDtDx; float9[Matrix.MSKEW_X] = mWinAnimator.mDtDy; float9[Matrix.MSCALE_Y] = mWinAnimator.mDsDy; - int x = mSurfacePosition.x; - int y = mSurfacePosition.y; + transformSurfaceInsetsPosition(mTmpPoint, mAttrs.surfaceInsets); + int x = mSurfacePosition.x + mTmpPoint.x; + int y = mSurfacePosition.y + mTmpPoint.y; // We might be on a display which has been re-parented to a view in another window, so here // computes the global location of our display. DisplayContent dc = getDisplayContent(); while (dc != null && dc.getParentWindow() != null) { final WindowState displayParent = dc.getParentWindow(); - x += displayParent.mWindowFrames.mFrame.left - displayParent.mAttrs.surfaceInsets.left + x += displayParent.mWindowFrames.mFrame.left + (dc.getLocationInParentWindow().x * displayParent.mGlobalScale + 0.5f); - y += displayParent.mWindowFrames.mFrame.top - displayParent.mAttrs.surfaceInsets.top + y += displayParent.mWindowFrames.mFrame.top + (dc.getLocationInParentWindow().y * displayParent.mGlobalScale + 0.5f); dc = displayParent.getDisplayContent(); } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java index e9ed20bd9683b..d13d7e9201ded 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -646,6 +646,7 @@ public class WindowStateTests extends WindowTestsBase { final WindowState win1 = createWindow(null, TYPE_APPLICATION, dc, "win1"); win1.mHasSurface = true; win1.mSurfaceControl = mock(SurfaceControl.class); + win1.mAttrs.surfaceInsets.set(1, 2, 3, 4); win1.getFrameLw().offsetTo(WINDOW_OFFSET, 0); win1.updateSurfacePosition(t); win1.getTransformationMatrix(values, matrix);