Merge "Fix issue #2555171: Switching to app immediately after unmounting..." into froyo
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index cd6a131..657b6af 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -148,6 +148,7 @@
     static final boolean DEBUG_STARTING_WINDOW = false;
     static final boolean DEBUG_REORDER = false;
     static final boolean DEBUG_WALLPAPER = false;
+    static final boolean DEBUG_FREEZE = false;
     static final boolean SHOW_TRANSACTIONS = false;
     static final boolean HIDE_STACK_CRAWLS = true;
     static final boolean MEASURE_LATENCY = false;
@@ -4418,7 +4419,8 @@
             final int N = mWindows.size();
             for (int i=0; i<N; i++) {
                 WindowState w = (WindowState)mWindows.get(i);
-                if (w.isVisibleLw() && !w.mObscured && !w.isDrawnLw()) {
+                if (w.isVisibleLw() && !w.mObscured
+                        && (w.mOrientationChanging || !w.isDrawnLw())) {
                     return;
                 }
             }
@@ -7925,7 +7927,7 @@
             final AppWindowToken atoken = mAppToken;
             return mSurface != null && !mAttachedHidden
                     && (atoken == null ? mPolicyVisibility : !atoken.hiddenRequested)
-                    && !mDrawPending && !mCommitDrawPending
+                    && (mOrientationChanging || (!mDrawPending && !mCommitDrawPending))
                     && !mExiting && !mDestroying;
         }
 
@@ -8029,12 +8031,14 @@
 
         /**
          * Returns true if the window has a surface that it has drawn a
-         * complete UI in to.
+         * complete UI in to.  Note that this returns true if the orientation
+         * is changing even if the window hasn't redrawn because we don't want
+         * to stop things from executing during that time.
          */
         public boolean isDrawnLw() {
             final AppWindowToken atoken = mAppToken;
             return mSurface != null && !mDestroying
-                && !mDrawPending && !mCommitDrawPending;
+                && (mOrientationChanging || (!mDrawPending && !mCommitDrawPending));
         }
 
         public boolean fillsScreenLw(int screenWidth, int screenHeight,
@@ -10291,6 +10295,12 @@
                     if (w.mAttachedHidden || !w.isReadyForDisplay()) {
                         if (!w.mLastHidden) {
                             //dump();
+                            if (DEBUG_CONFIGURATION) Slog.v(TAG, "Window hiding: waitingToShow="
+                                    + w.mRootToken.waitingToShow + " polvis="
+                                    + w.mPolicyVisibility + " atthid="
+                                    + w.mAttachedHidden + " tokhid="
+                                    + w.mRootToken.hidden + " vis="
+                                    + w.mViewVisibility);
                             w.mLastHidden = true;
                             if (SHOW_TRANSACTIONS) logSurface(w,
                                     "HIDE (performLayout)", null);
@@ -10686,23 +10696,28 @@
         } else if (animating) {
             requestAnimationLocked(currentTime+(1000/60)-SystemClock.uptimeMillis());
         }
-        mQueue.setHoldScreenLocked(holdScreen != null);
-        if (screenBrightness < 0 || screenBrightness > 1.0f) {
-            mPowerManager.setScreenBrightnessOverride(-1);
-        } else {
-            mPowerManager.setScreenBrightnessOverride((int)
-                    (screenBrightness * Power.BRIGHTNESS_ON));
-        }
-        if (buttonBrightness < 0 || buttonBrightness > 1.0f) {
-            mPowerManager.setButtonBrightnessOverride(-1);
-        } else {
-            mPowerManager.setButtonBrightnessOverride((int)
-                    (buttonBrightness * Power.BRIGHTNESS_ON));
-        }
-        if (holdScreen != mHoldingScreenOn) {
-            mHoldingScreenOn = holdScreen;
-            Message m = mH.obtainMessage(H.HOLD_SCREEN_CHANGED, holdScreen);
-            mH.sendMessage(m);
+        
+        if (DEBUG_FREEZE) Slog.v(TAG, "Layout: mDisplayFrozen=" + mDisplayFrozen
+                + " holdScreen=" + holdScreen);
+        if (!mDisplayFrozen) {
+            mQueue.setHoldScreenLocked(holdScreen != null);
+            if (screenBrightness < 0 || screenBrightness > 1.0f) {
+                mPowerManager.setScreenBrightnessOverride(-1);
+            } else {
+                mPowerManager.setScreenBrightnessOverride((int)
+                        (screenBrightness * Power.BRIGHTNESS_ON));
+            }
+            if (buttonBrightness < 0 || buttonBrightness > 1.0f) {
+                mPowerManager.setButtonBrightnessOverride(-1);
+            } else {
+                mPowerManager.setButtonBrightnessOverride((int)
+                        (buttonBrightness * Power.BRIGHTNESS_ON));
+            }
+            if (holdScreen != mHoldingScreenOn) {
+                mHoldingScreenOn = holdScreen;
+                Message m = mH.obtainMessage(H.HOLD_SCREEN_CHANGED, holdScreen);
+                mH.sendMessage(m);
+            }
         }
 
         if (mTurnOnScreen) {
@@ -10979,6 +10994,8 @@
             mFreezeGcPending = now;
         }
 
+        if (DEBUG_FREEZE) Slog.v(TAG, "*** FREEZING DISPLAY", new RuntimeException());
+        
         mDisplayFrozen = true;
         if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
             mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET;
@@ -11002,6 +11019,8 @@
             return;
         }
         
+        if (DEBUG_FREEZE) Slog.v(TAG, "*** UNFREEZING DISPLAY", new RuntimeException());
+        
         mDisplayFrozen = false;
         mH.removeMessages(H.APP_FREEZE_TIMEOUT);
         if (PROFILE_ORIENTATION) {