Merge "Fix issue #5508024: Rotation jank seen in live wallpapers" into ics-mr0
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 3af3e06..a199a7e 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -3973,6 +3973,7 @@
                 if (w.mAppFreezing) {
                     w.mAppFreezing = false;
                     if (w.mSurface != null && !w.mOrientationChanging) {
+                        if (DEBUG_ORIENTATION) Slog.v(TAG, "set mOrientationChanging of " + w);
                         w.mOrientationChanging = true;
                     }
                     unfrozeWindows = true;
@@ -5106,7 +5107,7 @@
         }
 
         if (rawss == null) {
-            Log.w(TAG, "Failure taking screenshot for (" + dw + "x" + dh
+            Slog.w(TAG, "Failure taking screenshot for (" + dw + "x" + dh
                     + ") to layer " + maxLayer);
             return null;
         }
@@ -5312,6 +5313,7 @@
         for (int i=mWindows.size()-1; i>=0; i--) {
             WindowState w = mWindows.get(i);
             if (w.mSurface != null) {
+                if (DEBUG_ORIENTATION) Slog.v(TAG, "Set mOrientationChanging of " + w);
                 w.mOrientationChanging = true;
             }
         }
@@ -7128,7 +7130,7 @@
         if (DEBUG_LAYERS) {
             RuntimeException here = new RuntimeException("here");
             here.fillInStackTrace();
-            Log.v(TAG, "Assigning layers", here);
+            Slog.v(TAG, "Assigning layers", here);
         }
 
         for (i=0; i<N; i++) {
@@ -7367,6 +7369,25 @@
         return mPolicy.finishLayoutLw();
     }
 
+    void makeWindowFreezingScreenIfNeededLocked(WindowState w) {
+        // If the screen is currently frozen or off, then keep
+        // it frozen/off until this window draws at its new
+        // orientation.
+        if (mDisplayFrozen || !mPolicy.isScreenOnFully()) {
+            if (DEBUG_ORIENTATION) Slog.v(TAG,
+                    "Changing surface while display frozen: " + w);
+            w.mOrientationChanging = true;
+            if (!mWindowsFreezingScreen) {
+                mWindowsFreezingScreen = true;
+                // XXX should probably keep timeout from
+                // when we first froze the display.
+                mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
+                mH.sendMessageDelayed(mH.obtainMessage(
+                        H.WINDOW_FREEZE_TIMEOUT), 2000);
+            }
+        }
+    }
+
     // "Something has changed!  Let's make it correct now."
     private final void performLayoutAndPlaceSurfacesLockedInner(
             boolean recoveringMemory) {
@@ -7718,6 +7739,10 @@
                                         + " drawn=" + wtoken.numDrawnWindows);
                                 wtoken.showAllWindowsLocked();
                                 unsetAppFreezingScreenLocked(wtoken, false, true);
+                                if (DEBUG_ORIENTATION) Slog.i(TAG,
+                                        "Setting orientationChangeComplete=true because wtoken "
+                                        + wtoken + " numInteresting=" + numInteresting
+                                        + " numDrawn=" + wtoken.numDrawnWindows);
                                 orientationChangeComplete = true;
                             }
                         } else if (!wtoken.allDrawn) {
@@ -8225,22 +8250,7 @@
 
                             w.mLastContentInsets.set(w.mContentInsets);
                             w.mLastVisibleInsets.set(w.mVisibleInsets);
-                            // If the screen is currently frozen or off, then keep
-                            // it frozen/off until this window draws at its new
-                            // orientation.
-                            if (mDisplayFrozen || !mPolicy.isScreenOnFully()) {
-                                if (DEBUG_ORIENTATION) Slog.v(TAG,
-                                        "Resizing while display frozen: " + w);
-                                w.mOrientationChanging = true;
-                                if (!mWindowsFreezingScreen) {
-                                    mWindowsFreezingScreen = true;
-                                    // XXX should probably keep timeout from
-                                    // when we first froze the display.
-                                    mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
-                                    mH.sendMessageDelayed(mH.obtainMessage(
-                                            H.WINDOW_FREEZE_TIMEOUT), 2000);
-                                }
-                            }
+                            makeWindowFreezingScreenIfNeededLocked(w);
                             // If the orientation is changing, then we need to
                             // hold off on unfreezing the display until this
                             // window has been redrawn; to do that, we need
@@ -8563,6 +8573,8 @@
                                 + Integer.toHexString(diff));
                     }
                     win.mConfiguration = mCurConfiguration;
+                    if (DEBUG_ORIENTATION && win.mDrawPending) Slog.i(
+                            TAG, "Resizing " + win + " WITH DRAW PENDING"); 
                     win.mClient.resized((int)win.mSurfaceW, (int)win.mSurfaceH,
                             win.mLastContentInsets, win.mLastVisibleInsets, win.mDrawPending,
                             configChanged ? win.mConfiguration : null);
@@ -9087,6 +9099,7 @@
         
         if (CUSTOM_SCREEN_ROTATION && mScreenRotationAnimation != null
                 && mScreenRotationAnimation.hasScreenshot()) {
+            if (DEBUG_ORIENTATION) Slog.i(TAG, "**** Dismissing screen rotation animation");
             if (mScreenRotationAnimation.dismiss(mFxSession, MAX_ANIMATION_DURATION,
                     mTransitionAnimationScale, mCurDisplayWidth, mCurDisplayHeight)) {
                 requestAnimationLocked(0);
diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java
index eeffb02..e9875a5 100644
--- a/services/java/com/android/server/wm/WindowState.java
+++ b/services/java/com/android/server/wm/WindowState.java
@@ -600,6 +600,7 @@
         if (mSurface == null) {
             mReportDestroySurface = false;
             mSurfacePendingDestroy = false;
+            Slog.i(WindowManagerService.TAG, "createSurface " + this + ": DRAW NOW PENDING");
             mDrawPending = true;
             mCommitDrawPending = false;
             mReadyToShow = false;
@@ -607,6 +608,8 @@
                 mAppToken.allDrawn = false;
             }
 
+            mService.makeWindowFreezingScreenIfNeededLocked(this);
+
             int flags = 0;
 
             if ((mAttrs.flags&WindowManager.LayoutParams.FLAG_SECURE) != 0) {
@@ -771,7 +774,7 @@
     boolean finishDrawingLocked() {
         if (mDrawPending) {
             if (SHOW_TRANSACTIONS || WindowManagerService.DEBUG_ORIENTATION) Slog.v(
-                WindowManagerService.TAG, "finishDrawingLocked: " + mSurface);
+                WindowManagerService.TAG, "finishDrawingLocked: " + this + " in " + mSurface);
             mCommitDrawPending = true;
             mDrawPending = false;
             return true;