OSDN Git Service

Fix #2269582 Sometimes camera preview screen is truncated
authorDianne Hackborn <hackbod@google.com>
Fri, 11 Dec 2009 22:51:35 +0000 (14:51 -0800)
committerDianne Hackborn <hackbod@google.com>
Sat, 12 Dec 2009 02:35:07 +0000 (18:35 -0800)
There were a few places in the window manager where we wouldn't cause
a layout after making a window visible.  This would leave it using
whatever size and position it last have since we don't layout windows
when they are not visible.

Also includes a little part I missed in the security issue that
allowed wallpapers to see input on the lock screen.

Change-Id: Icd7e037ad9a67ac936bc7039d87ed68f49502d73

services/java/com/android/server/WindowManagerService.java

index aab37b9..3180a17 100644 (file)
@@ -133,6 +133,7 @@ public class WindowManagerService extends IWindowManager.Stub
     static final boolean DEBUG = false;
     static final boolean DEBUG_FOCUS = false;
     static final boolean DEBUG_ANIM = false;
+    static final boolean DEBUG_LAYOUT = false;
     static final boolean DEBUG_LAYERS = false;
     static final boolean DEBUG_INPUT = false;
     static final boolean DEBUG_INPUT_METHOD = false;
@@ -2288,10 +2289,7 @@ public class WindowManagerService extends IWindowManager.Stub
                 attrChanges = win.mAttrs.copyFrom(attrs);
             }
 
-            if (localLOGV) Log.v(
-                TAG, "Relayout given client " + client.asBinder()
-                + " (" + win.mAttrs.getTitle() + ")");
-
+            if (DEBUG_LAYOUT) Log.v(TAG, "Relayout " + win + ": " + win.mAttrs);
 
             if ((attrChanges & WindowManager.LayoutParams.ALPHA_CHANGED) != 0) {
                 win.mAlpha = attrs.alpha;
@@ -2307,6 +2305,8 @@ public class WindowManagerService extends IWindowManager.Stub
                         (attrs.width  / (float)requestedWidth) : 1.0f;
                 win.mVScale = (attrs.height != requestedHeight) ?
                         (attrs.height / (float)requestedHeight) : 1.0f;
+            } else {
+                win.mHScale = win.mVScale = 1;
             }
 
             boolean imMayMove = (flagChanges&(
@@ -3485,10 +3485,12 @@ public class WindowManagerService extends IWindowManager.Stub
                       + ": hidden=" + wtoken.hidden + " hiddenRequested="
                       + wtoken.hiddenRequested);
 
-            if (changed && performLayout) {
+            if (changed) {
                 mLayoutNeeded = true;
-                updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES);
-                performLayoutAndPlaceSurfacesLocked();
+                if (performLayout) {
+                    updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES);
+                    performLayoutAndPlaceSurfacesLocked();
+                }
             }
         }
 
@@ -5082,7 +5084,9 @@ public class WindowManagerService extends IWindowManager.Stub
                 
                 // If we are on top of the wallpaper, then the wallpaper also
                 // gets to see this movement.
-                if (mWallpaperTarget == target || mSendingPointersToWallpaper) {
+                if ((mWallpaperTarget == target &&
+                        target.mAttrs.type != WindowManager.LayoutParams.TYPE_KEYGUARD)
+                        || mSendingPointersToWallpaper) {
                     sendPointerToWallpaperLocked(null, ev, eventTime);
                 }
                 
@@ -7447,6 +7451,12 @@ public class WindowManagerService extends IWindowManager.Stub
                     if (c.mSurface != null && c.mAttachedHidden) {
                         c.mAttachedHidden = false;
                         c.performShowLocked();
+                        // It hadn't been shown, which means layout not
+                        // performed on it, so now we want to make sure to
+                        // do a layout.  If called from within the transaction
+                        // loop, this will cause it to restart with a new
+                        // layout.
+                        mLayoutNeeded = true;
                     }
                 }
 
@@ -8083,6 +8093,9 @@ public class WindowManagerService extends IWindowManager.Stub
                         pw.print(mPolicyVisibilityAfterAnim);
                         pw.print(" mAttachedHidden="); pw.println(mAttachedHidden);
             }
+            if (!mRelayoutCalled) {
+                pw.print(prefix); pw.print("mRelayoutCalled="); pw.println(mRelayoutCalled);
+            }
             pw.print(prefix); pw.print("Requested w="); pw.print(mRequestedWidth);
                     pw.print(" h="); pw.println(mRequestedHeight);
             if (mXOffset != 0 || mYOffset != 0) {
@@ -9219,6 +9232,9 @@ public class WindowManagerService extends IWindowManager.Stub
         int repeats = 0;
         int i;
 
+        if (DEBUG_LAYOUT) Log.v(TAG, "performLayout: needed="
+                + mLayoutNeeded + " dw=" + dw + " dh=" + dh);
+        
         // FIRST LOOP: Perform a layout, if needed.
 
         while (mLayoutNeeded) {
@@ -9241,6 +9257,18 @@ public class WindowManagerService extends IWindowManager.Stub
                         || win.mAttachedHidden
                         || win.mExiting || win.mDestroying;
 
+                if (win.mLayoutAttached) {
+                    if (DEBUG_LAYOUT) Log.v(TAG, "First pass " + win
+                            + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame
+                            + " mLayoutAttached=" + win.mLayoutAttached);
+                    if (DEBUG_LAYOUT && gone) Log.v(TAG, "  (mViewVisibility="
+                            + win.mViewVisibility + " mRelayoutCalled="
+                            + win.mRelayoutCalled + " hidden="
+                            + win.mRootToken.hidden + " hiddenRequested="
+                            + (atoken != null && atoken.hiddenRequested)
+                            + " mAttachedHidden=" + win.mAttachedHidden);
+                }
+                
                 // If this view is GONE, then skip it -- keep the current
                 // frame, and let the caller know so they can ignore it
                 // if they want.  (We do the normal layout for INVISIBLE
@@ -9249,6 +9277,10 @@ public class WindowManagerService extends IWindowManager.Stub
                 if (!gone || !win.mHaveFrame) {
                     if (!win.mLayoutAttached) {
                         mPolicy.layoutWindowLw(win, win.mAttrs, null);
+                        if (DEBUG_LAYOUT) Log.v(TAG, "-> mFrame="
+                                + win.mFrame + " mContainingFrame="
+                                + win.mContainingFrame + " mDisplayFrame="
+                                + win.mDisplayFrame);
                     } else {
                         if (topAttached < 0) topAttached = i;
                     }
@@ -9268,9 +9300,17 @@ public class WindowManagerService extends IWindowManager.Stub
                 // windows, since that means "perform layout as normal,
                 // just don't display").
                 if (win.mLayoutAttached) {
+                    if (DEBUG_LAYOUT) Log.v(TAG, "Second pass " + win
+                            + " mHaveFrame=" + win.mHaveFrame
+                            + " mViewVisibility=" + win.mViewVisibility
+                            + " mRelayoutCalled=" + win.mRelayoutCalled);
                     if ((win.mViewVisibility != View.GONE && win.mRelayoutCalled)
                             || !win.mHaveFrame) {
                         mPolicy.layoutWindowLw(win, win.mAttrs, win.mAttachedWindow);
+                        if (DEBUG_LAYOUT) Log.v(TAG, "-> mFrame="
+                                + win.mFrame + " mContainingFrame="
+                                + win.mContainingFrame + " mDisplayFrame="
+                                + win.mDisplayFrame);
                     }
                 }
             }
@@ -9295,8 +9335,11 @@ public class WindowManagerService extends IWindowManager.Stub
                     }
                 }
             } else {
+                if (DEBUG_LAYOUT) Log.v(TAG, "Repeating layout because changes=0x"
+                        + Integer.toHexString(changes));
                 repeats++;
                 if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG) != 0) {
+                    if (DEBUG_LAYOUT) Log.v(TAG, "Computing new config from layout");
                     Configuration newConfig = updateOrientationFromAppTokensLocked(
                             null, null);
                     if (newConfig != null) {