From 6136273888c42faad74dce19ec49904a55affc15 Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Mon, 21 Mar 2016 16:13:10 -0700 Subject: [PATCH] Don't change geometry in relayout if preserve geometry is requested This causes scaling to be applied in the relayout window since the requested size won't match the window size. Apply the requested size in repositionChild instead. bug: 27676101 Change-Id: I03beee2b9fe118a6be329b5fd1338d54e48d9a22 --- core/java/android/view/IWindowSession.aidl | 11 +++++++---- core/java/android/view/SurfaceView.java | 8 ++++++-- services/core/java/com/android/server/wm/Session.java | 4 +++- .../com/android/server/wm/WindowManagerService.java | 11 ++++++++--- .../layoutlib/bridge/android/BridgeWindowSession.java | 3 ++- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl index 6a2cc802e1f12..a1e2e946c48ad 100644 --- a/core/java/android/view/IWindowSession.aidl +++ b/core/java/android/view/IWindowSession.aidl @@ -112,15 +112,18 @@ interface IWindowSession { * * @param window The window being modified. Must be attached to a parent window * or this call will fail. - * @param x The new x position - * @param y The new y position - * @param width The new width - * @param height The new height + * @param left The new left position + * @param top The new top position + * @param right The new right position + * @param bottom The new bottom position + * @param requestedWidth The new requested width + * @param requestedHeight The new requested height * @param deferTransactionUntilFrame Frame number from our parent (attached) to * defer this action until. * @param outFrame Rect in which is placed the new position/size on screen. */ void repositionChild(IWindow childWindow, int left, int top, int right, int bottom, + int requestedWidth, int requestedHeight, long deferTransactionUntilFrame, out Rect outFrame); /* diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 2c9d691214b00..477ffd9b5ba41 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -665,7 +665,9 @@ public class SurfaceView extends View { "postion = [%d, %d, %d, %d]", mWindowSpaceLeft, mWindowSpaceTop, mLocation[0], mLocation[1])); mSession.repositionChild(mWindow, mWindowSpaceLeft, mWindowSpaceTop, - mLocation[0], mLocation[1], -1, mWinFrame); + mLocation[0], mLocation[1], + mWindowSpaceWidth, mWindowSpaceHeight, + -1, mWinFrame); } catch (RemoteException ex) { Log.e(TAG, "Exception from relayout", ex); } @@ -700,7 +702,9 @@ public class SurfaceView extends View { right, bottom)); } // Just using mRTLastReportedPosition as a dummy rect here - session.repositionChild(window, left, top, right, bottom, frameNumber, + session.repositionChild(window, left, top, right, bottom, + mWindowSpaceWidth, mWindowSpaceHeight, + frameNumber, mRTLastReportedPosition); // Now overwrite mRTLastReportedPosition with our values mRTLastReportedPosition.set(left, top, right, bottom); diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java index a589f894e3bcc..c0c1ed8e2d0c9 100644 --- a/services/core/java/com/android/server/wm/Session.java +++ b/services/core/java/com/android/server/wm/Session.java @@ -195,8 +195,10 @@ final class Session extends IWindowSession.Stub @Override public void repositionChild(IWindow window, int left, int top, int right, int bottom, - long deferTransactionUntilFrame, Rect outFrame) { + int requestedWidth, int requestedHeight, + long deferTransactionUntilFrame, Rect outFrame) { mService.repositionChild(this, window, left, top, right, bottom, + requestedWidth, requestedHeight, deferTransactionUntilFrame, outFrame); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index b84ed7be9ad40..14291caa40728 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2522,6 +2522,7 @@ public class WindowManagerService extends IWindowManager.Stub void repositionChild(Session session, IWindow client, int left, int top, int right, int bottom, + int requestedWidth, int requestedHeight, long deferTransactionUntilFrame, Rect outFrame) { Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "repositionChild"); long origId = Binder.clearCallingIdentity(); @@ -2537,6 +2538,7 @@ public class WindowManagerService extends IWindowManager.Stub "repositionChild called but window is not" + "attached to a parent win=" + win); } + win.setRequestedSize(requestedWidth, requestedHeight); win.mAttrs.x = left; win.mAttrs.y = top; @@ -2593,7 +2595,8 @@ public class WindowManagerService extends IWindowManager.Stub == PackageManager.PERMISSION_GRANTED; long origId = Binder.clearCallingIdentity(); - + final boolean preserveGeometry = (attrs != null) && (attrs.privateFlags & + WindowManager.LayoutParams.PRIVATE_FLAG_PRESERVE_GEOMETRY) != 0; synchronized(mWindowMap) { WindowState win = windowForClientLocked(session, client, false); if (win == null) { @@ -2601,7 +2604,7 @@ public class WindowManagerService extends IWindowManager.Stub } WindowStateAnimator winAnimator = win.mWinAnimator; - if (viewVisibility != View.GONE) { + if (!preserveGeometry && viewVisibility != View.GONE) { win.setRequestedSize(requestedWidth, requestedHeight); } @@ -2650,7 +2653,9 @@ public class WindowManagerService extends IWindowManager.Stub if ((attrChanges & WindowManager.LayoutParams.ALPHA_CHANGED) != 0) { winAnimator.mAlpha = attrs.alpha; } - win.setWindowScale(requestedWidth, requestedHeight); + if (!preserveGeometry) { + win.setWindowScale(win.mRequestedWidth, win.mRequestedHeight); + } boolean imMayMove = (flagChanges & (FLAG_ALT_FOCUSABLE_IM | FLAG_NOT_FOCUSABLE)) != 0; final boolean isDefaultDisplay = win.isDefaultDisplay(); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java index fe05b0e91e831..53adb41af0cb4 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java @@ -96,7 +96,8 @@ public final class BridgeWindowSession implements IWindowSession { } @Override - public void repositionChild(IWindow childWindow, int x, int y, int width, int height, + public void repositionChild(IWindow window, int left, int top, int right, int bottom, + int requestedWidth, int requestedHeight, long deferTransactionUntilFrame, Rect outFrame) { // pass for now. return;