Merge changes I63f2b185,I0d749c1a into pi-dev
* changes:
[Magnifier-42] Fix bug in window positioning
[Magnifier-41] Fix behavior in windows with insets
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 4bd6fc8..239185e 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -245,7 +245,7 @@
final WindowLeaked mLocation;
- final WindowManager.LayoutParams mWindowAttributes = new WindowManager.LayoutParams();
+ public final WindowManager.LayoutParams mWindowAttributes = new WindowManager.LayoutParams();
final W mWindow;
diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java
index f1a1457..08c4dc9 100644
--- a/core/java/android/widget/Magnifier.java
+++ b/core/java/android/widget/Magnifier.java
@@ -161,6 +161,15 @@
// to the magnified view. This will not take into account overlapping views.
final Rect viewVisibleRegion = new Rect();
mView.getGlobalVisibleRect(viewVisibleRegion);
+ if (mView.getViewRootImpl() != null) {
+ // Clamping coordinates relative to the surface, not to the window.
+ final Rect surfaceInsets = mView.getViewRootImpl().mWindowAttributes.surfaceInsets;
+ viewVisibleRegion.offset(surfaceInsets.left, surfaceInsets.top);
+ }
+ if (mView instanceof SurfaceView) {
+ // If we copy content from a SurfaceView, clamp coordinates relative to it.
+ viewVisibleRegion.offset(-mViewCoordinatesInSurface[0], -mViewCoordinatesInSurface[1]);
+ }
final int startX = Math.max(viewVisibleRegion.left, Math.min(
mCenterZoomCoords.x - mBitmapWidth / 2,
viewVisibleRegion.right - mBitmapWidth));
@@ -235,13 +244,17 @@
/**
* @hide
+ *
+ * @return The top left coordinates of the magnifier, relative to the parent window.
*/
@Nullable
public Point getWindowCoords() {
if (mWindow == null) {
return null;
}
- return new Point(mWindow.mLastDrawContentPositionX, mWindow.mLastDrawContentPositionY);
+ final Rect surfaceInsets = mView.getViewRootImpl().mWindowAttributes.surfaceInsets;
+ return new Point(mWindow.mLastDrawContentPositionX - surfaceInsets.left,
+ mWindow.mLastDrawContentPositionY - surfaceInsets.top);
}
@Nullable
@@ -308,8 +321,9 @@
} else if (mView.getViewRootImpl() != null) {
final ViewRootImpl viewRootImpl = mView.getViewRootImpl();
surface = viewRootImpl.mSurface;
- surfaceWidth = viewRootImpl.getWidth();
- surfaceHeight = viewRootImpl.getHeight();
+ final Rect surfaceInsets = viewRootImpl.mWindowAttributes.surfaceInsets;
+ surfaceWidth = viewRootImpl.getWidth() + surfaceInsets.left + surfaceInsets.right;
+ surfaceHeight = viewRootImpl.getHeight() + surfaceInsets.top + surfaceInsets.bottom;
} else {
surface = null;
surfaceWidth = NONEXISTENT_PREVIOUS_CONFIG_VALUE;
@@ -328,11 +342,31 @@
// Clamp window coordinates inside the parent surface, to avoid displaying
// the magnifier out of screen or overlapping with system insets.
- final Rect insets = mView.getRootWindowInsets().getSystemWindowInsets();
- final int windowCoordsX = Math.max(insets.left,
- Math.min(surfaceWidth - mWindowWidth - insets.right, mWindowCoords.x));
- final int windowCoordsY = Math.max(insets.top,
- Math.min(surfaceHeight - mWindowHeight - insets.bottom, mWindowCoords.y));
+ Rect windowBounds = null;
+ if (mView.getViewRootImpl() != null) {
+ // TODO: deduplicate against the first part of #getValidParentSurfaceForMagnifier()
+ // TODO: deduplicate against the first part of the current method
+ final ViewRootImpl viewRootImpl = mView.getViewRootImpl();
+ final Surface parentSurface = viewRootImpl.mSurface;
+ final Rect surfaceInsets = viewRootImpl.mWindowAttributes.surfaceInsets;
+ final int parentWidth =
+ viewRootImpl.getWidth() + surfaceInsets.left + surfaceInsets.right;
+ final int parentHeight =
+ viewRootImpl.getHeight() + surfaceInsets.top + surfaceInsets.bottom;
+ if (parentSurface != null && parentSurface.isValid()) {
+ final Rect systemInsets = mView.getRootWindowInsets().getSystemWindowInsets();
+ windowBounds = new Rect(systemInsets.left, systemInsets.top,
+ parentWidth - systemInsets.right, parentHeight - systemInsets.bottom);
+ }
+ }
+ if (windowBounds == null && mView instanceof SurfaceView) {
+ windowBounds = ((SurfaceView) mView).getHolder().getSurfaceFrame();
+ }
+
+ final int windowCoordsX = Math.max(windowBounds.left,
+ Math.min(windowBounds.right - mWindowWidth, mWindowCoords.x));
+ final int windowCoordsY = Math.max(windowBounds.top,
+ Math.min(windowBounds.bottom - mWindowHeight, mWindowCoords.y));
// Perform the pixel copy.
mPixelCopyRequestRect.set(clampedStartXInSurface,