diff --git a/core/java/android/view/animation/Animation.java b/core/java/android/view/animation/Animation.java index 474db128fcc3f..64686dd977a2a 100644 --- a/core/java/android/view/animation/Animation.java +++ b/core/java/android/view/animation/Animation.java @@ -206,6 +206,8 @@ public abstract class Animation implements Cloneable { */ private boolean mDetachWallpaper = false; + private boolean mShowWallpaper; + private boolean mMore = true; private boolean mOneMoreTime = true; @@ -253,7 +255,10 @@ public abstract class Animation implements Cloneable { setBackgroundColor(a.getInt(com.android.internal.R.styleable.Animation_background, 0)); - setDetachWallpaper(a.getBoolean(com.android.internal.R.styleable.Animation_detachWallpaper, false)); + setDetachWallpaper( + a.getBoolean(com.android.internal.R.styleable.Animation_detachWallpaper, false)); + setShowWallpaper( + a.getBoolean(com.android.internal.R.styleable.Animation_showWallpaper, false)); final int resID = a.getResourceId(com.android.internal.R.styleable.Animation_interpolator, 0); @@ -660,6 +665,18 @@ public abstract class Animation implements Cloneable { mDetachWallpaper = detachWallpaper; } + /** + * If this animation is run as a window animation, this will make the wallpaper visible behind + * the animation. + * + * @param showWallpaper Whether the wallpaper should be shown during the animation. + * @attr ref android.R.styleable#Animation_detachWallpaper + * @hide + */ + public void setShowWallpaper(boolean showWallpaper) { + mShowWallpaper = showWallpaper; + } + /** * Gets the acceleration curve type for this animation. * @@ -774,6 +791,16 @@ public abstract class Animation implements Cloneable { return mDetachWallpaper; } + /** + * @return If run as a window animation, returns whether the wallpaper will be shown behind + * during the animation. + * @attr ref android.R.styleable#Animation_showWallpaper + * @hide + */ + public boolean getShowWallpaper() { + return mShowWallpaper; + } + /** *

Indicates whether or not this animation will affect the transformation * matrix. For instance, a fade animation will not affect the matrix whereas diff --git a/core/res/res/anim/task_close_enter.xml b/core/res/res/anim/task_close_enter.xml index 81d1300038e39..c298b8090a01c 100644 --- a/core/res/res/anim/task_close_enter.xml +++ b/core/res/res/anim/task_close_enter.xml @@ -17,7 +17,8 @@ --> + android:zAdjustment="top" + android:showWallpaper="true"> + android:shareInterpolator="false" + android:showWallpaper="true"> + android:zAdjustment="top" + android:showWallpaper="true"> + android:zAdjustment="top" + android:showWallpaper="true"> + android:shareInterpolator="false" + android:showWallpaper="true"> + + diff --git a/services/core/java/com/android/server/wm/AnimationAdapter.java b/services/core/java/com/android/server/wm/AnimationAdapter.java index ed4543ef82feb..64f77a2cc4ce7 100644 --- a/services/core/java/com/android/server/wm/AnimationAdapter.java +++ b/services/core/java/com/android/server/wm/AnimationAdapter.java @@ -38,6 +38,12 @@ interface AnimationAdapter { */ boolean getDetachWallpaper(); + /** + * @return Whether we should show the wallpaper during the animation. + * @see Animation#getShowWallpaper() + */ + boolean getShowWallpaper(); + /** * @return The background color behind the animation. */ diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 8155656cd5f4f..20bcd2d8194b1 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -1668,6 +1668,9 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree } if (adapter != null) { startAnimation(getPendingTransaction(), adapter, !isVisible()); + if (adapter.getShowWallpaper()) { + mDisplayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; + } } } else { cancelAnimation(); diff --git a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java index 2173fa3a283d1..1b41cb84516d6 100644 --- a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java +++ b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java @@ -42,6 +42,11 @@ class LocalAnimationAdapter implements AnimationAdapter { return mSpec.getDetachWallpaper(); } + @Override + public boolean getShowWallpaper() { + return mSpec.getShowWallpaper(); + } + @Override public int getBackgroundColor() { return mSpec.getBackgroundColor(); @@ -81,6 +86,13 @@ class LocalAnimationAdapter implements AnimationAdapter { return false; } + /** + * @see AnimationAdapter#getShowWallpaper + */ + default boolean getShowWallpaper() { + return false; + } + /** * @see AnimationAdapter#getBackgroundColor */ diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index 78dd580259a03..31b5c698dc5e9 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -367,6 +367,11 @@ public class RecentsAnimationController { return false; } + @Override + public boolean getShowWallpaper() { + return false; + } + @Override public int getBackgroundColor() { return 0; diff --git a/services/core/java/com/android/server/wm/RemoteAnimationController.java b/services/core/java/com/android/server/wm/RemoteAnimationController.java index 35fc99fe46122..ed6e606b0c755 100644 --- a/services/core/java/com/android/server/wm/RemoteAnimationController.java +++ b/services/core/java/com/android/server/wm/RemoteAnimationController.java @@ -220,6 +220,11 @@ class RemoteAnimationController { return false; } + @Override + public boolean getShowWallpaper() { + return false; + } + @Override public int getBackgroundColor() { return 0; diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index a4f20b012576f..6356a3512e65c 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -606,8 +606,11 @@ class RootWindowContainer extends WindowContainer { // If we are ready to perform an app transition, check through all of the app tokens to be // shown and see if they are ready to go. if (mService.mAppTransition.isReady()) { - defaultDisplay.pendingLayoutChanges |= - surfacePlacer.handleAppTransitionReadyLocked(); + // This needs to be split into two expressions, as handleAppTransitionReadyLocked may + // modify dc.pendingLayoutChanges, which would get lost when writing + // defaultDisplay.pendingLayoutChanges |= handleAppTransitionReadyLocked() + final int layoutChanges = surfacePlacer.handleAppTransitionReadyLocked(); + defaultDisplay.pendingLayoutChanges |= layoutChanges; if (DEBUG_LAYOUT_REPEATS) surfacePlacer.debugLayoutRepeats("after handleAppTransitionReadyLocked", defaultDisplay.pendingLayoutChanges); diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index f2ad6fb7a8880..a7d51f175ab55 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -151,7 +151,10 @@ class WallpaperController { final RecentsAnimationController recentsAnimationController = mService.getRecentsAnimationController(); - final boolean hasWallpaper = (w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0; + final boolean animationWallpaper = w.mAppToken != null && w.mAppToken.getAnimation() != null + && w.mAppToken.getAnimation().getShowWallpaper(); + final boolean hasWallpaper = (w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0 + || animationWallpaper; final boolean isRecentsTransitionTarget = (recentsAnimationController != null && recentsAnimationController.isWallpaperVisible(w)); if (isRecentsTransitionTarget) { diff --git a/services/core/java/com/android/server/wm/WindowAnimationSpec.java b/services/core/java/com/android/server/wm/WindowAnimationSpec.java index 0863ee9eebb37..43fa3d56914e1 100644 --- a/services/core/java/com/android/server/wm/WindowAnimationSpec.java +++ b/services/core/java/com/android/server/wm/WindowAnimationSpec.java @@ -68,6 +68,11 @@ public class WindowAnimationSpec implements AnimationSpec { return mAnimation.getDetachWallpaper(); } + @Override + public boolean getShowWallpaper() { + return mAnimation.getShowWallpaper(); + } + @Override public int getBackgroundColor() { return mAnimation.getBackgroundColor();