Merge "Re-enabling fade-in of header bar icons."
diff --git a/services/core/java/com/android/server/wm/AppWindowAnimator.java b/services/core/java/com/android/server/wm/AppWindowAnimator.java
index e046a77..fa5ee72 100644
--- a/services/core/java/com/android/server/wm/AppWindowAnimator.java
+++ b/services/core/java/com/android/server/wm/AppWindowAnimator.java
@@ -339,8 +339,7 @@
return false;
}
- if ((mAppToken.allDrawn || mAppToken.mAnimatingWithSavedSurface
- || animating || mAppToken.startingDisplayed)
+ if ((mAppToken.allDrawn || animating || mAppToken.startingDisplayed)
&& animation != null) {
if (!animating) {
if (DEBUG_ANIM) Slog.v(TAG,
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index c0d34e8..6452fee 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -299,10 +299,10 @@
}
}
- void markSurfacesExiting() {
+ void setWindowsExiting(boolean exiting) {
for (int i = allAppWindows.size() - 1; i >= 0; i--) {
WindowState win = allAppWindows.get(i);
- win.mExiting = true;
+ win.mExiting = exiting;
}
}
@@ -312,11 +312,11 @@
* @return true if the surfaces should be saved, false otherwise.
*/
boolean shouldSaveSurface() {
- // We want to save surface if the app's windows are "allDrawn", or if we're
- // currently animating with save surfaces. (If the app didn't even finish
- // drawing when the user exits, but we have a saved surface from last time,
- // we still want to keep that surface.)
- return allDrawn || mAnimatingWithSavedSurface;
+ // We want to save surface if the app's windows are "allDrawn".
+ // (If we started entering animation early with saved surfaces, allDrawn
+ // should have been restored to true. So we'll save again in that case
+ // even if app didn't actually finish drawing.)
+ return allDrawn;
}
boolean hasSavedSurface() {
@@ -334,13 +334,26 @@
return;
}
mAnimatingWithSavedSurface = true;
+
+ // Check if we have enough drawn windows to mark allDrawn= true.
+ int numInteresting = 0;
+ int numDrawn = 0;
for (int i = windows.size() - 1; i >= 0; i--) {
- WindowState ws = windows.get(i);
- ws.restoreSavedSurface();
+ WindowState w = windows.get(i);
+ w.restoreSavedSurface();
+ if (w != startingWindow && !w.mAppDied
+ && (!mAppAnimator.freezingScreen || !w.mAppFreezing)) {
+ numInteresting++;
+ if (w.isDrawnLw()) {
+ numDrawn++;
+ }
+ }
}
- // Mark the app allDrawn since it must be allDrawn at the time
- // it was first saved.
- allDrawn = true;
+
+ allDrawn |= (numInteresting == numDrawn);
+
+ if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.d(TAG,
+ "restoreSavedSurfaces: " + appWindowToken + " allDrawn=" + allDrawn);
}
void destroySavedSurfaces() {
@@ -348,6 +361,7 @@
WindowState win = windows.get(i);
win.destroySavedSurface();
}
+ mAnimatingWithSavedSurface = false;
}
@Override
diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java
index 722c3b4..8d2fb9b 100644
--- a/services/core/java/com/android/server/wm/WindowAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowAnimator.java
@@ -428,7 +428,7 @@
final AppWindowToken atoken = win.mAppToken;
if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
- if (atoken == null || atoken.allDrawn || atoken.mAnimatingWithSavedSurface) {
+ if (atoken == null || atoken.allDrawn) {
if (winAnimator.performShowLocked()) {
setPendingLayoutChanges(displayId,
WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM);
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 849fc33..c14e32e 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2691,7 +2691,17 @@
} else {
winAnimator.mEnterAnimationPending = false;
winAnimator.mEnteringAnimation = false;
- if (winAnimator.hasSurface() && !win.mExiting) {
+ final boolean usingSavedSurfaceBeforeVisible =
+ oldVisibility != View.VISIBLE && win.isAnimatingWithSavedSurface();
+ if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) {
+ if (winAnimator.hasSurface() && !win.mExiting
+ && usingSavedSurfaceBeforeVisible) {
+ Slog.d(TAG, "Ignoring layout to invisible when using saved surface " + win);
+ }
+ }
+
+ if (winAnimator.hasSurface() && !win.mExiting
+ && !usingSavedSurfaceBeforeVisible) {
if (DEBUG_VISIBILITY) Slog.i(TAG_WM, "Relayout invis " + win
+ ": mExiting=" + win.mExiting);
// If we are not currently running the exit animation, we
@@ -4219,6 +4229,7 @@
}
wtoken.inPendingTransaction = true;
if (visible) {
+ wtoken.setWindowsExiting(false);
mOpeningApps.add(wtoken);
wtoken.startingMoved = false;
wtoken.mEnteringAnimation = true;
@@ -4243,7 +4254,7 @@
}
}
} else {
- wtoken.markSurfacesExiting();
+ wtoken.setWindowsExiting(true);
mClosingApps.add(wtoken);
wtoken.mEnteringAnimation = false;
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 10a2a6c..4a9b356 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -1447,8 +1447,8 @@
}
for (int i = mAppToken.allAppWindows.size() - 1; i >= 0; i--) {
final WindowState win = mAppToken.allAppWindows.get(i);
- if (DEBUG_ADD_REMOVE) Slog.d(TAG, "Removing replaced window: " + win);
if (win.mWillReplaceWindow && win.mReplacingWindow == this) {
+ if (DEBUG_ADD_REMOVE) Slog.d(TAG, "Removing replaced window: " + win);
win.mWillReplaceWindow = false;
win.mAnimateReplacingWindow = false;
win.mReplacingRemoveRequested = false;
@@ -2190,6 +2190,8 @@
pw.print(prefix); pw.print("mRootToken="); pw.println(mRootToken);
if (mAppToken != null) {
pw.print(prefix); pw.print("mAppToken="); pw.print(mAppToken);
+ pw.print(" isAnimatingWithSavedSurface()=");
+ pw.print(isAnimatingWithSavedSurface());
pw.print(" mAppDied=");pw.println(mAppDied);
}
if (mTargetAppToken != null) {
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index d21a3b4..e904ad5 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -272,11 +272,14 @@
}
void cancelExitAnimationForNextAnimationLocked() {
+ if (DEBUG_ANIM) Slog.d(TAG,
+ "cancelExitAnimationForNextAnimationLocked: " + mWin);
+
if (mAnimation != null) {
mAnimation.cancel();
mAnimation = null;
mLocalAnimating = false;
- destroySurfaceLocked();
+ mWin.destroyOrSaveSurface();
}
}
@@ -498,10 +501,12 @@
Slog.v(TAG, "Finishing drawing window " + mWin + ": mDrawState="
+ drawStateToString());
}
- if (mWin.mAppToken != null) {
+ if (mWin.mAppToken != null && mWin.mAppToken.mAnimatingWithSavedSurface) {
// App has drawn something to its windows, we're no longer animating with
// the saved surfaces. If the user exits now, we only want to save again
// if allDrawn is true.
+ if (DEBUG_ANIM) Slog.d(TAG,
+ "finishDrawingLocked: mAnimatingWithSavedSurface=false " + mWin);
mWin.mAppToken.mAnimatingWithSavedSurface = false;
}
if (mDrawState == DRAW_PENDING) {
@@ -534,8 +539,7 @@
mDrawState = READY_TO_SHOW;
boolean result = false;
final AppWindowToken atoken = mWin.mAppToken;
- if (atoken == null || atoken.allDrawn || atoken.mAnimatingWithSavedSurface ||
- mWin.mAttrs.type == TYPE_APPLICATION_STARTING) {
+ if (atoken == null || atoken.allDrawn || mWin.mAttrs.type == TYPE_APPLICATION_STARTING) {
result = performShowLocked();
}
if (mDestroyPreservedSurfaceUponRedraw) {
@@ -569,6 +573,8 @@
final WindowState w = mWin;
if (w.hasSavedSurface()) {
Slog.i(TAG, "***** createSurface: " + this + ": called when we had a saved surface");
+ w.restoreSavedSurface();
+ return mSurfaceController;
}
if (mSurfaceController == null) {
diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
index 761d6e9..d1d4721 100644
--- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
+++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
@@ -774,8 +774,9 @@
+ " a=" + winAnimator.mAnimating);
}
}
- if (w != atoken.startingWindow && !w.mAppDied) {
- if (!atoken.mAppAnimator.freezingScreen || !w.mAppFreezing) {
+ if (w != atoken.startingWindow) {
+ if (!w.mAppDied &&
+ (!atoken.mAppAnimator.freezingScreen || !w.mAppFreezing)) {
atoken.numInterestingWindows++;
if (w.isDrawnLw()) {
atoken.numDrawnWindows++;
@@ -1156,8 +1157,6 @@
}
wtoken.inPendingTransaction = false;
- wtoken.restoreSavedSurfaces();
-
if (!mService.setTokenVisibilityLocked(
wtoken, animLp, true, transit, false, voiceInteraction)){
// This token isn't going to be animating. Add it to the list of tokens to
@@ -1277,9 +1276,8 @@
+ wtoken.startingDisplayed + " startingMoved="
+ wtoken.startingMoved);
- if (wtoken.hasSavedSurface() || wtoken.mAnimatingWithSavedSurface) {
- continue;
- }
+ wtoken.restoreSavedSurfaces();
+
if (!wtoken.allDrawn && !wtoken.startingDisplayed && !wtoken.startingMoved) {
return false;
}