Some fixes for transition animation selection

- Request wallpaper adjust after we clear mDestroying or
  mAnimatingExit flags, as these could affect wallpaper
  target selection result.

- Adjust wallpaper before we check lower/upper target. As
  there could be pending operations that requested a wall-
  paper update. Lower/upper target is needed to correctly
  decide if the opening or closing apps had wallpaper.

- Make sure lower/upper targets are set even when current
  target is clientHidden, in which case we should set
  wallpaper target to old target but the lower/upper
  still needs to be set up.

bug: 30255354
Change-Id: Ie2c94439142cbb91660c5aa4164cc660831486d5
This commit is contained in:
Chong Zhang
2016-07-29 13:09:40 -07:00
parent d008c7354a
commit ec8299ca45
3 changed files with 39 additions and 19 deletions

View File

@@ -17,7 +17,9 @@
package com.android.server.wm;
import static android.app.ActivityManager.StackId;
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE;
@@ -358,6 +360,7 @@ class AppWindowToken extends WindowToken {
win.mWinAnimator.mAnimating = false;
}
}
requestUpdateWallpaperIfNeeded();
}
void destroySurfaces() {
@@ -405,6 +408,9 @@ class AppWindowToken extends WindowToken {
if (displayContent != null && !displayList.contains(displayContent)) {
displayList.add(displayContent);
}
if (cleanupOnResume) {
win.requestUpdateWallpaperIfNeeded();
}
win.mDestroying = false;
}
for (int i = 0; i < displayList.size(); i++) {

View File

@@ -587,18 +587,9 @@ class WallpaperController {
"Animating wallpapers: old#" + oldI + "=" + oldW + "; new#"
+ wallpaperTargetIndex + "=" + wallpaperTarget);
// Set the new target correctly.
if (wallpaperTarget.mAppToken != null
&& wallpaperTarget.mAppToken.hiddenRequested) {
if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG,
"Old wallpaper still the target.");
mWallpaperTarget = oldW;
wallpaperTarget = oldW;
wallpaperTargetIndex = oldI;
}
// Now set the upper and lower wallpaper targets correctly,
// Set the upper and lower wallpaper targets correctly,
// and make sure that we are positioning the wallpaper below the lower.
else if (wallpaperTargetIndex > oldI) {
if (wallpaperTargetIndex > oldI) {
// The new target is on top of the old one.
if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG,
"Found target above old target.");
@@ -613,6 +604,16 @@ class WallpaperController {
mUpperWallpaperTarget = oldW;
mLowerWallpaperTarget = wallpaperTarget;
}
// If the new target is going hidden, set it back to the old target.
if (wallpaperTarget.mAppToken != null
&& wallpaperTarget.mAppToken.hiddenRequested) {
if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG,
"Old wallpaper still the target.");
mWallpaperTarget = oldW;
wallpaperTarget = oldW;
wallpaperTargetIndex = oldI;
}
}
}
}

View File

@@ -1096,6 +1096,26 @@ class WindowSurfacePlacer {
boolean fullscreenAnim = false;
boolean voiceInteraction = false;
int i;
for (i = 0; i < appsCount; i++) {
final AppWindowToken wtoken = mService.mOpeningApps.valueAt(i);
// Clearing the mAnimatingExit flag before entering animation. It's set to
// true if app window is removed, or window relayout to invisible.
// This also affects window visibility. We need to clear it *before*
// maybeUpdateTransitToWallpaper() as the transition selection depends on
// wallpaper target visibility.
wtoken.clearAnimatingFlags();
}
// Adjust wallpaper before we pull the lower/upper target, since pending changes
// (like the clearAnimatingFlags() above) might affect wallpaper target result.
final DisplayContent displayContent = mService.getDefaultDisplayContentLocked();
if ((displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0 &&
mWallpaperControllerLocked.adjustWallpaperWindows()) {
mService.mLayersController.assignLayersLocked(windows);
displayContent.layoutNeeded = true;
}
final WindowState lowerWallpaperTarget =
mWallpaperControllerLocked.getLowerWallpaperTarget();
final WindowState upperWallpaperTarget =
@@ -1112,7 +1132,6 @@ class WindowSurfacePlacer {
upperWallpaperAppToken = upperWallpaperTarget.mAppToken;
}
int i;
// Do a first pass through the tokens for two
// things:
// (1) Determine if both the closing and opening
@@ -1137,12 +1156,6 @@ class WindowSurfacePlacer {
if (wtoken == lowerWallpaperAppToken || wtoken == upperWallpaperAppToken) {
openingAppHasWallpaper = true;
}
// Clearing the mAnimatingExit flag before entering animation. It's set to
// true if app window is removed, or window relayout to invisible.
// This also affects window visibility. We need to clear it *before*
// maybeUpdateTransitToWallpaper() as the transition selection depends on
// wallpaper target visibility.
wtoken.clearAnimatingFlags();
}
voiceInteraction |= wtoken.voiceInteraction;
@@ -1205,7 +1218,7 @@ class WindowSurfacePlacer {
// This has changed the visibility of windows, so perform
// a new layout to get them all up-to-date.
mService.getDefaultDisplayContentLocked().layoutNeeded = true;
displayContent.layoutNeeded = true;
// TODO(multidisplay): IMEs are only supported on the default display.
if (windows == mService.getDefaultWindowListLocked()