Loading libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimation.java +3 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,9 @@ public abstract class ShellBackAnimation { @Qualifier public @interface ReturnToHome {} @Qualifier public @interface DialogClose {} /** Retrieve the {@link BackAnimationRunner} associated with this animation. */ public abstract BackAnimationRunner getRunner(); Loading libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimationRegistry.java +7 −2 Original line number Diff line number Diff line Loading @@ -33,17 +33,22 @@ public class ShellBackAnimationRegistry { public ShellBackAnimationRegistry( @ShellBackAnimation.CrossActivity @Nullable ShellBackAnimation crossActivityAnimation, @ShellBackAnimation.CrossTask @Nullable ShellBackAnimation crossTaskAnimation, @ShellBackAnimation.DialogClose @Nullable ShellBackAnimation dialogCloseAnimation, @ShellBackAnimation.CustomizeActivity @Nullable ShellBackAnimation customizeActivityAnimation, @ShellBackAnimation.ReturnToHome @Nullable ShellBackAnimation defaultBackToHomeAnimation) { if (crossActivityAnimation != null) { mAnimationDefinition.set( BackNavigationInfo.TYPE_CROSS_ACTIVITY, crossActivityAnimation.getRunner()); } if (crossTaskAnimation != null) { mAnimationDefinition.set( BackNavigationInfo.TYPE_CROSS_TASK, crossTaskAnimation.getRunner()); } if (crossActivityAnimation != null) { if (dialogCloseAnimation != null) { mAnimationDefinition.set( BackNavigationInfo.TYPE_CROSS_ACTIVITY, crossActivityAnimation.getRunner()); BackNavigationInfo.TYPE_DIALOG_CLOSE, dialogCloseAnimation.getRunner()); } if (defaultBackToHomeAnimation != null) { mAnimationDefinition.set( Loading libs/WindowManager/Shell/src/com/android/wm/shell/dagger/back/ShellBackAnimationModule.java +1 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ public interface ShellBackAnimationModule { return new ShellBackAnimationRegistry( crossActivity, crossTask, /* dialogCloseAnimation */ null, customizeActivity, /* defaultBackToHomeAnimation= */ null); } Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java +2 −1 Original line number Diff line number Diff line Loading @@ -132,8 +132,9 @@ public class BackAnimationControllerTest extends ShellTestCase { new ShellBackAnimationRegistry( new CrossActivityAnimation(mContext, mAnimationBackground), new CrossTaskBackAnimation(mContext, mAnimationBackground), /* dialogCloseAnimation= */ null, new CustomizeActivityAnimation(mContext, mAnimationBackground), null); /* defaultBackToHomeAnimation= */ null); mController = new BackAnimationController( mShellInit, Loading services/core/java/com/android/server/wm/BackNavigationController.java +55 −20 Original line number Diff line number Diff line Loading @@ -78,8 +78,6 @@ class BackNavigationController { private @BackNavigationInfo.BackTargetType int mLastBackType; private boolean mShowWallpaper; private Runnable mPendingAnimation; private boolean mBackAnimationRunning; private final NavigationMonitor mNavigationMonitor = new NavigationMonitor(); private AnimationHandler mAnimationHandler; Loading Loading @@ -248,12 +246,13 @@ class BackNavigationController { // - We have an application callback. // - We don't have any ActivityRecord or Task to animate. // - The IME is opened, and we just need to close it. // - The home activity is the focused activity. // - The home activity is the focused activity & it's not TYPE_BASE_APPLICATION // - The current activity will do shared element transition when exiting. if (backType == BackNavigationInfo.TYPE_CALLBACK || currentActivity == null || currentTask == null || currentActivity.isActivityTypeHome() || (currentActivity.isActivityTypeHome() && window.mAttrs.type == TYPE_BASE_APPLICATION) || currentActivity.mHasSceneTransition) { infoBuilder.setType(BackNavigationInfo.TYPE_CALLBACK); infoBuilder.setOnBackNavigationDone(new RemoteCallback(result -> Loading Loading @@ -364,13 +363,20 @@ class BackNavigationController { boolean prepareAnimation = (backType == BackNavigationInfo.TYPE_RETURN_TO_HOME || backType == BackNavigationInfo.TYPE_CROSS_TASK || backType == BackNavigationInfo.TYPE_CROSS_ACTIVITY) || backType == BackNavigationInfo.TYPE_CROSS_ACTIVITY || backType == BackNavigationInfo.TYPE_DIALOG_CLOSE) && adapter != null; if (prepareAnimation) { final AnimationHandler.ScheduleAnimationBuilder builder = mAnimationHandler.prepareAnimation(backType, adapter, currentTask, prevTask, currentActivity, prevActivities); mAnimationHandler.prepareAnimation( backType, adapter, currentTask, prevTask, currentActivity, prevActivities, removedWindowContainer); mBackAnimationInProgress = builder != null; if (mBackAnimationInProgress) { if (removedWindowContainer.hasCommittedReparentToAnimationLeash() Loading Loading @@ -739,7 +745,6 @@ class BackNavigationController { mAnimationHandler.clearBackAnimateTarget(); mNavigationMonitor.stopMonitorTransition(); mWaitTransitionFinish = null; mBackAnimationRunning = false; } /** Loading Loading @@ -836,6 +841,7 @@ class BackNavigationController { private static final int UNKNOWN = 0; private static final int TASK_SWITCH = 1; private static final int ACTIVITY_SWITCH = 2; private static final int DIALOG_CLOSE = 3; private static boolean isActivitySwitch(@NonNull WindowContainer close, @NonNull WindowContainer[] open) { Loading @@ -860,12 +866,18 @@ class BackNavigationController { return open[0].asTask() != null && (close.asTask() != open[0].asTask()); } private static boolean isDialogClose(WindowContainer close) { return close.asWindowState() != null; } private void initiate(@NonNull WindowContainer close, @NonNull WindowContainer[] open, @NonNull ActivityRecord[] openingActivities) { if (isActivitySwitch(close, open)) { mSwitchType = ACTIVITY_SWITCH; } else if (isTaskSwitch(close, open)) { mSwitchType = TASK_SWITCH; } else if (isDialogClose(close)) { mSwitchType = DIALOG_CLOSE; } else { mSwitchType = UNKNOWN; return; Loading Loading @@ -1173,6 +1185,7 @@ class BackNavigationController { mIsOpen = isOpen; mSwitchType = switchType; } @Override public boolean getShowWallpaper() { return false; Loading @@ -1182,7 +1195,14 @@ class BackNavigationController { public void startAnimation(SurfaceControl animationLeash, SurfaceControl.Transaction t, int type, SurfaceAnimator.OnAnimationFinishedCallback finishCallback) { mCapturedLeash = animationLeash; createRemoteAnimationTarget(mIsOpen); createRemoteAnimationTarget(); final WindowState win = mTarget.asWindowState(); if (win != null && mSwitchType == DIALOG_CLOSE) { final Rect frame = win.getFrame(); final Point position = new Point(); win.transformFrameToSurfacePosition(frame.left, frame.top, position); t.setPosition(mCapturedLeash, position.x, position.y); } } @Override Loading Loading @@ -1216,12 +1236,14 @@ class BackNavigationController { } RemoteAnimationTarget createRemoteAnimationTarget(boolean isOpen) { RemoteAnimationTarget createRemoteAnimationTarget() { if (mAnimationTarget != null) { return mAnimationTarget; } Task t = mTarget.asTask(); ActivityRecord r = null; WindowState w = mTarget.asWindowState(); ActivityRecord r = w != null ? w.getActivityRecord() : null; Task t = r != null ? r.getTask() : mTarget.asTask(); if (t == null && mTarget.asTaskFragment() != null) { t = mTarget.asTaskFragment().getTask(); r = mTarget.asTaskFragment().getTopNonFinishingActivity(); Loading @@ -1247,7 +1269,7 @@ class BackNavigationController { } else { insets = new Rect(); } final int mode = isOpen ? MODE_OPENING : MODE_CLOSING; final int mode = mIsOpen ? MODE_OPENING : MODE_CLOSING; mAnimationTarget = new RemoteAnimationTarget(t.mTaskId, mode, mCapturedLeash, !r.fillsParent(), new Rect(), insets, r.getPrefixOrderIndex(), new Point(mBounds.left, mBounds.top), Loading @@ -1261,6 +1283,9 @@ class BackNavigationController { if (!mIsOpen) { return; } if (mSwitchType == DIALOG_CLOSE) { return; } final Task openTask = mSwitchType == TASK_SWITCH ? mTarget.asTask() : mSwitchType == ACTIVITY_SWITCH ? mTarget.asActivityRecord().getTask() : null; Loading Loading @@ -1332,9 +1357,14 @@ class BackNavigationController { } } ScheduleAnimationBuilder prepareAnimation(int backType, BackAnimationAdapter adapter, Task currentTask, Task previousTask, ActivityRecord currentActivity, ArrayList<ActivityRecord> previousActivity) { ScheduleAnimationBuilder prepareAnimation( int backType, BackAnimationAdapter adapter, Task currentTask, Task previousTask, ActivityRecord currentActivity, ArrayList<ActivityRecord> previousActivity, WindowContainer removedWindowContainer) { switch (backType) { case BackNavigationInfo.TYPE_RETURN_TO_HOME: return new ScheduleAnimationBuilder(backType, adapter) Loading @@ -1350,6 +1380,10 @@ class BackNavigationController { return new ScheduleAnimationBuilder(backType, adapter) .setComposeTarget(currentTask, previousTask) .setIsLaunchBehind(false); case BackNavigationInfo.TYPE_DIALOG_CLOSE: return new ScheduleAnimationBuilder(backType, adapter) .setComposeTarget(removedWindowContainer, currentActivity) .setIsLaunchBehind(false); } return null; } Loading Loading @@ -1574,7 +1608,6 @@ class BackNavigationController { if (mPendingAnimation != null) { mPendingAnimation.run(); mPendingAnimation = null; mBackAnimationRunning = true; } } Loading Loading @@ -1629,7 +1662,9 @@ class BackNavigationController { } else { proto.write(MAIN_OPEN_ACTIVITY, ""); } proto.write(ANIMATION_RUNNING, mBackAnimationRunning); // TODO (b/268563842) Only meaningful after new test added proto.write(ANIMATION_RUNNING, mAnimationHandler.mComposed || mAnimationHandler.mWaitTransition); proto.end(token); } } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimation.java +3 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,9 @@ public abstract class ShellBackAnimation { @Qualifier public @interface ReturnToHome {} @Qualifier public @interface DialogClose {} /** Retrieve the {@link BackAnimationRunner} associated with this animation. */ public abstract BackAnimationRunner getRunner(); Loading
libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimationRegistry.java +7 −2 Original line number Diff line number Diff line Loading @@ -33,17 +33,22 @@ public class ShellBackAnimationRegistry { public ShellBackAnimationRegistry( @ShellBackAnimation.CrossActivity @Nullable ShellBackAnimation crossActivityAnimation, @ShellBackAnimation.CrossTask @Nullable ShellBackAnimation crossTaskAnimation, @ShellBackAnimation.DialogClose @Nullable ShellBackAnimation dialogCloseAnimation, @ShellBackAnimation.CustomizeActivity @Nullable ShellBackAnimation customizeActivityAnimation, @ShellBackAnimation.ReturnToHome @Nullable ShellBackAnimation defaultBackToHomeAnimation) { if (crossActivityAnimation != null) { mAnimationDefinition.set( BackNavigationInfo.TYPE_CROSS_ACTIVITY, crossActivityAnimation.getRunner()); } if (crossTaskAnimation != null) { mAnimationDefinition.set( BackNavigationInfo.TYPE_CROSS_TASK, crossTaskAnimation.getRunner()); } if (crossActivityAnimation != null) { if (dialogCloseAnimation != null) { mAnimationDefinition.set( BackNavigationInfo.TYPE_CROSS_ACTIVITY, crossActivityAnimation.getRunner()); BackNavigationInfo.TYPE_DIALOG_CLOSE, dialogCloseAnimation.getRunner()); } if (defaultBackToHomeAnimation != null) { mAnimationDefinition.set( Loading
libs/WindowManager/Shell/src/com/android/wm/shell/dagger/back/ShellBackAnimationModule.java +1 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ public interface ShellBackAnimationModule { return new ShellBackAnimationRegistry( crossActivity, crossTask, /* dialogCloseAnimation */ null, customizeActivity, /* defaultBackToHomeAnimation= */ null); } Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java +2 −1 Original line number Diff line number Diff line Loading @@ -132,8 +132,9 @@ public class BackAnimationControllerTest extends ShellTestCase { new ShellBackAnimationRegistry( new CrossActivityAnimation(mContext, mAnimationBackground), new CrossTaskBackAnimation(mContext, mAnimationBackground), /* dialogCloseAnimation= */ null, new CustomizeActivityAnimation(mContext, mAnimationBackground), null); /* defaultBackToHomeAnimation= */ null); mController = new BackAnimationController( mShellInit, Loading
services/core/java/com/android/server/wm/BackNavigationController.java +55 −20 Original line number Diff line number Diff line Loading @@ -78,8 +78,6 @@ class BackNavigationController { private @BackNavigationInfo.BackTargetType int mLastBackType; private boolean mShowWallpaper; private Runnable mPendingAnimation; private boolean mBackAnimationRunning; private final NavigationMonitor mNavigationMonitor = new NavigationMonitor(); private AnimationHandler mAnimationHandler; Loading Loading @@ -248,12 +246,13 @@ class BackNavigationController { // - We have an application callback. // - We don't have any ActivityRecord or Task to animate. // - The IME is opened, and we just need to close it. // - The home activity is the focused activity. // - The home activity is the focused activity & it's not TYPE_BASE_APPLICATION // - The current activity will do shared element transition when exiting. if (backType == BackNavigationInfo.TYPE_CALLBACK || currentActivity == null || currentTask == null || currentActivity.isActivityTypeHome() || (currentActivity.isActivityTypeHome() && window.mAttrs.type == TYPE_BASE_APPLICATION) || currentActivity.mHasSceneTransition) { infoBuilder.setType(BackNavigationInfo.TYPE_CALLBACK); infoBuilder.setOnBackNavigationDone(new RemoteCallback(result -> Loading Loading @@ -364,13 +363,20 @@ class BackNavigationController { boolean prepareAnimation = (backType == BackNavigationInfo.TYPE_RETURN_TO_HOME || backType == BackNavigationInfo.TYPE_CROSS_TASK || backType == BackNavigationInfo.TYPE_CROSS_ACTIVITY) || backType == BackNavigationInfo.TYPE_CROSS_ACTIVITY || backType == BackNavigationInfo.TYPE_DIALOG_CLOSE) && adapter != null; if (prepareAnimation) { final AnimationHandler.ScheduleAnimationBuilder builder = mAnimationHandler.prepareAnimation(backType, adapter, currentTask, prevTask, currentActivity, prevActivities); mAnimationHandler.prepareAnimation( backType, adapter, currentTask, prevTask, currentActivity, prevActivities, removedWindowContainer); mBackAnimationInProgress = builder != null; if (mBackAnimationInProgress) { if (removedWindowContainer.hasCommittedReparentToAnimationLeash() Loading Loading @@ -739,7 +745,6 @@ class BackNavigationController { mAnimationHandler.clearBackAnimateTarget(); mNavigationMonitor.stopMonitorTransition(); mWaitTransitionFinish = null; mBackAnimationRunning = false; } /** Loading Loading @@ -836,6 +841,7 @@ class BackNavigationController { private static final int UNKNOWN = 0; private static final int TASK_SWITCH = 1; private static final int ACTIVITY_SWITCH = 2; private static final int DIALOG_CLOSE = 3; private static boolean isActivitySwitch(@NonNull WindowContainer close, @NonNull WindowContainer[] open) { Loading @@ -860,12 +866,18 @@ class BackNavigationController { return open[0].asTask() != null && (close.asTask() != open[0].asTask()); } private static boolean isDialogClose(WindowContainer close) { return close.asWindowState() != null; } private void initiate(@NonNull WindowContainer close, @NonNull WindowContainer[] open, @NonNull ActivityRecord[] openingActivities) { if (isActivitySwitch(close, open)) { mSwitchType = ACTIVITY_SWITCH; } else if (isTaskSwitch(close, open)) { mSwitchType = TASK_SWITCH; } else if (isDialogClose(close)) { mSwitchType = DIALOG_CLOSE; } else { mSwitchType = UNKNOWN; return; Loading Loading @@ -1173,6 +1185,7 @@ class BackNavigationController { mIsOpen = isOpen; mSwitchType = switchType; } @Override public boolean getShowWallpaper() { return false; Loading @@ -1182,7 +1195,14 @@ class BackNavigationController { public void startAnimation(SurfaceControl animationLeash, SurfaceControl.Transaction t, int type, SurfaceAnimator.OnAnimationFinishedCallback finishCallback) { mCapturedLeash = animationLeash; createRemoteAnimationTarget(mIsOpen); createRemoteAnimationTarget(); final WindowState win = mTarget.asWindowState(); if (win != null && mSwitchType == DIALOG_CLOSE) { final Rect frame = win.getFrame(); final Point position = new Point(); win.transformFrameToSurfacePosition(frame.left, frame.top, position); t.setPosition(mCapturedLeash, position.x, position.y); } } @Override Loading Loading @@ -1216,12 +1236,14 @@ class BackNavigationController { } RemoteAnimationTarget createRemoteAnimationTarget(boolean isOpen) { RemoteAnimationTarget createRemoteAnimationTarget() { if (mAnimationTarget != null) { return mAnimationTarget; } Task t = mTarget.asTask(); ActivityRecord r = null; WindowState w = mTarget.asWindowState(); ActivityRecord r = w != null ? w.getActivityRecord() : null; Task t = r != null ? r.getTask() : mTarget.asTask(); if (t == null && mTarget.asTaskFragment() != null) { t = mTarget.asTaskFragment().getTask(); r = mTarget.asTaskFragment().getTopNonFinishingActivity(); Loading @@ -1247,7 +1269,7 @@ class BackNavigationController { } else { insets = new Rect(); } final int mode = isOpen ? MODE_OPENING : MODE_CLOSING; final int mode = mIsOpen ? MODE_OPENING : MODE_CLOSING; mAnimationTarget = new RemoteAnimationTarget(t.mTaskId, mode, mCapturedLeash, !r.fillsParent(), new Rect(), insets, r.getPrefixOrderIndex(), new Point(mBounds.left, mBounds.top), Loading @@ -1261,6 +1283,9 @@ class BackNavigationController { if (!mIsOpen) { return; } if (mSwitchType == DIALOG_CLOSE) { return; } final Task openTask = mSwitchType == TASK_SWITCH ? mTarget.asTask() : mSwitchType == ACTIVITY_SWITCH ? mTarget.asActivityRecord().getTask() : null; Loading Loading @@ -1332,9 +1357,14 @@ class BackNavigationController { } } ScheduleAnimationBuilder prepareAnimation(int backType, BackAnimationAdapter adapter, Task currentTask, Task previousTask, ActivityRecord currentActivity, ArrayList<ActivityRecord> previousActivity) { ScheduleAnimationBuilder prepareAnimation( int backType, BackAnimationAdapter adapter, Task currentTask, Task previousTask, ActivityRecord currentActivity, ArrayList<ActivityRecord> previousActivity, WindowContainer removedWindowContainer) { switch (backType) { case BackNavigationInfo.TYPE_RETURN_TO_HOME: return new ScheduleAnimationBuilder(backType, adapter) Loading @@ -1350,6 +1380,10 @@ class BackNavigationController { return new ScheduleAnimationBuilder(backType, adapter) .setComposeTarget(currentTask, previousTask) .setIsLaunchBehind(false); case BackNavigationInfo.TYPE_DIALOG_CLOSE: return new ScheduleAnimationBuilder(backType, adapter) .setComposeTarget(removedWindowContainer, currentActivity) .setIsLaunchBehind(false); } return null; } Loading Loading @@ -1574,7 +1608,6 @@ class BackNavigationController { if (mPendingAnimation != null) { mPendingAnimation.run(); mPendingAnimation = null; mBackAnimationRunning = true; } } Loading Loading @@ -1629,7 +1662,9 @@ class BackNavigationController { } else { proto.write(MAIN_OPEN_ACTIVITY, ""); } proto.write(ANIMATION_RUNNING, mBackAnimationRunning); // TODO (b/268563842) Only meaningful after new test added proto.write(ANIMATION_RUNNING, mAnimationHandler.mComposed || mAnimationHandler.mWaitTransition); proto.end(token); } }