OSDN Git Service

Don't change geometry in relayout if preserve geometry is requested
authorChong Zhang <chz@google.com>
Mon, 21 Mar 2016 23:13:10 +0000 (16:13 -0700)
committerChong Zhang <chz@google.com>
Tue, 22 Mar 2016 17:28:27 +0000 (10:28 -0700)
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
core/java/android/view/SurfaceView.java
services/core/java/com/android/server/wm/Session.java
services/core/java/com/android/server/wm/WindowManagerService.java
tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java

index 6a2cc80..a1e2e94 100644 (file)
@@ -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);
 
     /*
index 2c9d691..477ffd9 100644 (file)
@@ -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);
index a589f89..c0c1ed8 100644 (file)
@@ -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);
     }
 
index b84ed7b..14291ca 100644 (file)
@@ -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();
index fe05b0e..53adb41 100644 (file)
@@ -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;