am 8091424e: am 9b52a218: Fix #2269582 Sometimes camera preview screen is truncated

Merge commit '8091424ea332f754e6f1c712a9e28bfa7d02741e' into eclair-mr2-plus-aosp

* commit '8091424ea332f754e6f1c712a9e28bfa7d02741e':
  Fix #2269582 Sometimes camera preview screen is truncated
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index ea0b778..d250e3c 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -133,6 +133,7 @@
     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;
@@ -2286,10 +2287,7 @@
                 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;
@@ -2305,6 +2303,8 @@
                         (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&(
@@ -3483,10 +3483,12 @@
                       + ": 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();
+                }
             }
         }
 
@@ -5080,7 +5082,9 @@
 
                 // 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);
                 }
 
@@ -7437,6 +7441,12 @@
                     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;
                     }
                 }
 
@@ -8073,6 +8083,9 @@
                         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) {
@@ -9209,6 +9222,9 @@
         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) {
@@ -9231,6 +9247,18 @@
                         || 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
@@ -9239,6 +9267,10 @@
                 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;
                     }
@@ -9258,9 +9290,17 @@
                 // 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);
                     }
                 }
             }
@@ -9285,8 +9325,11 @@
                     }
                 }
             } 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) {