diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java index ec4c58f9aa358..d526845f749a2 100644 --- a/services/core/java/com/android/server/wm/ActivityClientController.java +++ b/services/core/java/com/android/server/wm/ActivityClientController.java @@ -1088,7 +1088,7 @@ class ActivityClientController extends IActivityClientController.Stub { final ActivityRecord r = ActivityRecord.isInRootTaskLocked(token); if (r != null && r.isState(RESUMED, PAUSING)) { r.mDisplayContent.mAppTransition.overridePendingAppTransition( - packageName, enterAnim, exitAnim, null, null, + packageName, enterAnim, exitAnim, backgroundColor, null, null, r.mOverrideTaskTransition); r.mTransitionController.setOverrideAnimation( TransitionInfo.AnimationOptions.makeCustomAnimOptions(packageName, diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index fd5893623021c..6ef6c7ae074ae 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -4516,6 +4516,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A pendingOptions.getPackageName(), pendingOptions.getCustomEnterResId(), pendingOptions.getCustomExitResId(), + pendingOptions.getCustomBackgroundColor(), pendingOptions.getAnimationStartedListener(), pendingOptions.getAnimationFinishedListener(), pendingOptions.getOverrideTaskTransition()); diff --git a/services/core/java/com/android/server/wm/AnimationAdapter.java b/services/core/java/com/android/server/wm/AnimationAdapter.java index 5899a4e89ca79..a7430912c0b96 100644 --- a/services/core/java/com/android/server/wm/AnimationAdapter.java +++ b/services/core/java/com/android/server/wm/AnimationAdapter.java @@ -41,6 +41,22 @@ interface AnimationAdapter { */ boolean getShowWallpaper(); + /** + * @return Whether we should show a background behind the animating windows. + * @see Animation#getShowBackground() + */ + default boolean getShowBackground() { + return false; + } + + /** + * @return The background color to use during an animation if getShowBackground returns true. + * @see Animation#getBackgroundColor() + */ + default int getBackgroundColor() { + return 0; + } + /** * Requests to start the animation. * diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index 56adcfd76403d..05efb29cc775c 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -93,6 +93,7 @@ import static com.android.server.wm.WindowManagerInternal.KeyguardExitAnimationS import static com.android.server.wm.WindowStateAnimator.ROOT_TASK_CLIP_AFTER_ANIM; import static com.android.server.wm.WindowStateAnimator.ROOT_TASK_CLIP_NONE; +import android.annotation.ColorInt; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; @@ -198,6 +199,7 @@ public class AppTransition implements Dump { private IRemoteCallback mAnimationFinishedCallback; private int mNextAppTransitionEnter; private int mNextAppTransitionExit; + private @ColorInt int mNextAppTransitionBackgroundColor; private int mNextAppTransitionInPlace; private boolean mNextAppTransitionIsSync; @@ -829,6 +831,7 @@ public class AppTransition implements Dump { break; } a = animAttr != 0 ? loadAnimationAttr(lp, animAttr, transit) : null; + ProtoLog.v(WM_DEBUG_APP_TRANSITIONS_ANIM, "applyAnimation: anim=%s animAttr=0x%x transit=%s isEntrance=%b " + "Callers=%s", @@ -836,6 +839,11 @@ public class AppTransition implements Dump { Debug.getCallers(3)); } setAppTransitionFinishedCallbackIfNeeded(a); + + if (mNextAppTransitionBackgroundColor != 0) { + a.setBackgroundColor(mNextAppTransitionBackgroundColor); + } + return a; } @@ -861,14 +869,15 @@ public class AppTransition implements Dump { } void overridePendingAppTransition(String packageName, int enterAnim, int exitAnim, - IRemoteCallback startedCallback, IRemoteCallback endedCallback, - boolean overrideTaskTransaction) { + @ColorInt int backgroundColor, IRemoteCallback startedCallback, + IRemoteCallback endedCallback, boolean overrideTaskTransaction) { if (canOverridePendingAppTransition()) { clear(); mNextAppTransitionOverrideRequested = true; mNextAppTransitionPackage = packageName; mNextAppTransitionEnter = enterAnim; mNextAppTransitionExit = exitAnim; + mNextAppTransitionBackgroundColor = backgroundColor; postAnimationCallback(); mNextAppTransitionCallback = startedCallback; mAnimationFinishedCallback = endedCallback; diff --git a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java index a3eb980992c77..61f9fe29b2f88 100644 --- a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java +++ b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java @@ -50,6 +50,16 @@ class LocalAnimationAdapter implements AnimationAdapter { return mSpec.getShowWallpaper(); } + @Override + public boolean getShowBackground() { + return mSpec.getShowBackground(); + } + + @Override + public int getBackgroundColor() { + return mSpec.getBackgroundColor(); + } + @Override public void startAnimation(SurfaceControl animationLeash, Transaction t, @AnimationType int type, @NonNull OnAnimationFinishedCallback finishCallback) { @@ -96,6 +106,20 @@ class LocalAnimationAdapter implements AnimationAdapter { return false; } + /** + * @see AnimationAdapter#getShowBackground + */ + default boolean getShowBackground() { + return false; + } + + /** + * @see AnimationAdapter#getBackgroundColor + */ + default int getBackgroundColor() { + return 0; + } + /** * @see AnimationAdapter#getStatusBarTransitionsStartTime */ diff --git a/services/core/java/com/android/server/wm/WindowAnimationSpec.java b/services/core/java/com/android/server/wm/WindowAnimationSpec.java index 073a508083f07..5bfd546f76203 100644 --- a/services/core/java/com/android/server/wm/WindowAnimationSpec.java +++ b/services/core/java/com/android/server/wm/WindowAnimationSpec.java @@ -79,6 +79,16 @@ public class WindowAnimationSpec implements AnimationSpec { return mAnimation.getShowWallpaper(); } + @Override + public boolean getShowBackground() { + return mAnimation.getShowBackground(); + } + + @Override + public int getBackgroundColor() { + return mAnimation.getBackgroundColor(); + } + @Override public long getDuration() { return mAnimation.computeDurationHint(); diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 1cb75a6111e89..e1746cca455a3 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -39,6 +39,7 @@ import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_SYNC_ENGINE; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; import static com.android.server.wm.AppTransition.MAX_APP_TRANSITION_DURATION; +import static com.android.server.wm.AppTransition.isActivityTransitOld; import static com.android.server.wm.AppTransition.isTaskTransitOld; import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING; import static com.android.server.wm.IdentifierProto.HASH_CODE; @@ -99,6 +100,7 @@ import android.window.WindowContainerToken; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.graphics.ColorUtils; import com.android.internal.protolog.common.ProtoLog; import com.android.internal.util.ToBooleanFunction; import com.android.server.wm.SurfaceAnimator.Animatable; @@ -2820,6 +2822,25 @@ class WindowContainer extends ConfigurationContainer< } } + final ActivityRecord activityRecord = asActivityRecord(); + if (activityRecord != null && isActivityTransitOld(transit) + && adapter.getShowBackground()) { + final @ColorInt int backgroundColorForTransition; + if (adapter.getBackgroundColor() != 0) { + // If available use the background color provided through getBackgroundColor + // which if set originates from a call to overridePendingAppTransition. + backgroundColorForTransition = adapter.getBackgroundColor(); + } else { + // Otherwise default to the window's background color if provided through + // the theme as the background color for the animation - the top most window + // with a valid background color and showBackground set takes precedence. + final Task arTask = activityRecord.getTask(); + backgroundColorForTransition = ColorUtils.setAlphaComponent( + arTask.getTaskDescription().getBackgroundColor(), 255); + } + animationRunnerBuilder.setTaskBackgroundColor(backgroundColorForTransition); + } + animationRunnerBuilder.build() .startAnimation(getPendingTransaction(), adapter, !isVisible(), ANIMATION_TYPE_APP_TRANSITION, thumbnailAdapter);