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;