Merge "Apply scale to boundsInParent"
diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java
index 23e1505..a6f63e8 100644
--- a/core/java/android/view/AccessibilityInteractionController.java
+++ b/core/java/android/view/AccessibilityInteractionController.java
@@ -21,6 +21,7 @@
import static android.view.accessibility.AccessibilityNodeInfo.EXTRA_DATA_REQUESTED_KEY;
import static android.view.accessibility.AccessibilityNodeInfo.EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY;
+import android.annotation.NonNull;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.RectF;
@@ -959,29 +960,6 @@
&& mViewRootImpl.mAttachInfo.mLeashedParentAccessibilityViewId == View.NO_ID);
}
- private void applyAppScaleAndMagnificationSpecIfNeeded(AccessibilityNodeInfo info,
- MagnificationSpec spec) {
- if (info == null) {
- return;
- }
-
- final float applicationScale = mViewRootImpl.mAttachInfo.mApplicationScale;
- if (!shouldApplyAppScaleAndMagnificationSpec(applicationScale, spec)) {
- return;
- }
- Rect boundsInParent = mTempRect;
-
- info.getBoundsInParent(boundsInParent);
- if (applicationScale != 1.0f) {
- boundsInParent.scale(applicationScale);
- }
- if (spec != null) {
- boundsInParent.scale(spec.scale);
- // boundsInParent must not be offset.
- }
- info.setBoundsInParent(boundsInParent);
- }
-
private boolean shouldApplyAppScaleAndMagnificationSpec(float appScale,
MagnificationSpec spec) {
return (appScale != 1.0f || (spec != null && !spec.isNop()));
@@ -1002,7 +980,6 @@
// Transform view bounds from window coordinates to screen coordinates.
transformBoundsWithScreenMatrix(info, matrixValues);
adjustIsVisibleToUserIfNeeded(info, interactiveRegion, spec);
- applyAppScaleAndMagnificationSpecIfNeeded(info, spec);
}
@@ -1042,10 +1019,7 @@
return;
}
transformMatrix.mapRect(transformedBounds);
- // Offset 0.5f to round after casting.
- transformedBounds.offset(0.5f, 0.5f);
- boundInScreen.set((int) (transformedBounds.left), (int) transformedBounds.top,
- (int) transformedBounds.right, (int) transformedBounds.bottom);
+ roundRectFToRect(transformedBounds, boundInScreen);
info.setBoundsInScreen(boundInScreen);
// Scale text locations if they are present
if (info.hasExtras()) {
@@ -1063,6 +1037,26 @@
}
}
}
+ applyTransformMatrixToBoundsInParentIfNeeded(info, transformMatrix);
+ }
+
+ private void applyTransformMatrixToBoundsInParentIfNeeded(AccessibilityNodeInfo info,
+ Matrix transformMatrix) {
+ final float[] screenMatrixValues = new float[9];
+ transformMatrix.getValues(screenMatrixValues);
+ final Matrix scaleMatrix = new Matrix();
+ scaleMatrix.setScale(screenMatrixValues[Matrix.MSCALE_X],
+ screenMatrixValues[Matrix.MSCALE_X]);
+ if (scaleMatrix.isIdentity()) {
+ return;
+ }
+ Rect boundsInParent = mTempRect;
+ final RectF transformedBounds = mTempRectF;
+ info.getBoundsInParent(boundsInParent);
+ transformedBounds.set(boundsInParent);
+ scaleMatrix.mapRect(transformedBounds);
+ roundRectFToRect(transformedBounds, boundsInParent);
+ info.setBoundsInParent(boundsInParent);
}
private void updateInfosForViewportAndReturnFindNodeResult(List<AccessibilityNodeInfo> infos,
@@ -1213,6 +1207,12 @@
return false;
}
+ private static void roundRectFToRect(@NonNull RectF sourceRectF, @NonNull Rect outRect) {
+ // Offset 0.5f to round after casting.
+ outRect.set((int) (sourceRectF.left + 0.5), (int) (sourceRectF.top + 0.5),
+ (int) (sourceRectF.right + 0.5), (int) (sourceRectF.bottom + 0.5));
+ }
+
/**
* This class encapsulates a prefetching strategy for the accessibility APIs for
* querying window content. It is responsible to prefetch a batch of