diff --git a/core/java/android/window/StartingWindowRemovalInfo.java b/core/java/android/window/StartingWindowRemovalInfo.java index 573db0d58625a..384dacfe89ed6 100644 --- a/core/java/android/window/StartingWindowRemovalInfo.java +++ b/core/java/android/window/StartingWindowRemovalInfo.java @@ -61,6 +61,12 @@ public final class StartingWindowRemovalInfo implements Parcelable { */ public boolean deferRemoveForIme; + /** + * The rounded corner radius + * @hide + */ + public float roundedCornerRadius; + public StartingWindowRemovalInfo() { } @@ -80,6 +86,7 @@ public final class StartingWindowRemovalInfo implements Parcelable { mainFrame = source.readTypedObject(Rect.CREATOR); playRevealAnimation = source.readBoolean(); deferRemoveForIme = source.readBoolean(); + roundedCornerRadius = source.readFloat(); } @Override @@ -89,6 +96,7 @@ public final class StartingWindowRemovalInfo implements Parcelable { dest.writeTypedObject(mainFrame, flags); dest.writeBoolean(playRevealAnimation); dest.writeBoolean(deferRemoveForIme); + dest.writeFloat(roundedCornerRadius); } @Override @@ -96,6 +104,7 @@ public final class StartingWindowRemovalInfo implements Parcelable { return "StartingWindowRemovalInfo{taskId=" + taskId + " frame=" + mainFrame + " playRevealAnimation=" + playRevealAnimation + + " roundedCornerRadius=" + roundedCornerRadius + " deferRemoveForIme=" + deferRemoveForIme + "}"; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java index 8bba44049c88a..20da8773f3872 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java @@ -50,13 +50,17 @@ public class SplashScreenExitAnimation implements Animator.AnimatorListener { private final float mIconStartAlpha; private final float mBrandingStartAlpha; private final TransactionPool mTransactionPool; + // TODO(b/261167708): Clean enter animation code after moving Letterbox code to Shell + private final float mRoundedCornerRadius; private Runnable mFinishCallback; SplashScreenExitAnimation(Context context, SplashScreenView view, SurfaceControl leash, - Rect frame, int mainWindowShiftLength, TransactionPool pool, Runnable handleFinish) { + Rect frame, int mainWindowShiftLength, TransactionPool pool, Runnable handleFinish, + float roundedCornerRadius) { mSplashScreenView = view; mFirstWindowSurface = leash; + mRoundedCornerRadius = roundedCornerRadius; if (frame != null) { mFirstWindowFrame.set(frame); } @@ -97,7 +101,7 @@ public class SplashScreenExitAnimation implements Animator.AnimatorListener { SplashScreenExitAnimationUtils.startAnimations(mSplashScreenView, mFirstWindowSurface, mMainWindowShiftLength, mTransactionPool, mFirstWindowFrame, mAnimationDuration, mIconFadeOutDuration, mIconStartAlpha, mBrandingStartAlpha, mAppRevealDelay, - mAppRevealDuration, this); + mAppRevealDuration, this, mRoundedCornerRadius); } private void reset() { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimationUtils.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimationUtils.java index 3098e55ec78bf..a7e4385b60c87 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimationUtils.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimationUtils.java @@ -61,6 +61,24 @@ public class SplashScreenExitAnimationUtils { new PathInterpolator(0f, 0f, 0.4f, 1f); private static final Interpolator SHIFT_UP_INTERPOLATOR = new PathInterpolator(0f, 0f, 0f, 1f); + /** + * Creates and starts the animator to fade out the icon, reveal the app, and shift up main + * window with rounded corner radius. + */ + static void startAnimations(ViewGroup splashScreenView, + SurfaceControl firstWindowSurface, int mainWindowShiftLength, + TransactionPool transactionPool, Rect firstWindowFrame, int animationDuration, + int iconFadeOutDuration, float iconStartAlpha, float brandingStartAlpha, + int appRevealDelay, int appRevealDuration, Animator.AnimatorListener animatorListener, + float roundedCornerRadius) { + ValueAnimator animator = + createAnimator(splashScreenView, firstWindowSurface, mainWindowShiftLength, + transactionPool, firstWindowFrame, animationDuration, iconFadeOutDuration, + iconStartAlpha, brandingStartAlpha, appRevealDelay, appRevealDuration, + animatorListener, roundedCornerRadius); + animator.start(); + } + /** * Creates and starts the animator to fade out the icon, reveal the app, and shift up main * window. @@ -71,12 +89,10 @@ public class SplashScreenExitAnimationUtils { TransactionPool transactionPool, Rect firstWindowFrame, int animationDuration, int iconFadeOutDuration, float iconStartAlpha, float brandingStartAlpha, int appRevealDelay, int appRevealDuration, Animator.AnimatorListener animatorListener) { - ValueAnimator animator = - createAnimator(splashScreenView, firstWindowSurface, mainWindowShiftLength, - transactionPool, firstWindowFrame, animationDuration, iconFadeOutDuration, - iconStartAlpha, brandingStartAlpha, appRevealDelay, appRevealDuration, - animatorListener); - animator.start(); + startAnimations(splashScreenView, firstWindowSurface, mainWindowShiftLength, + transactionPool, firstWindowFrame, animationDuration, iconFadeOutDuration, + iconStartAlpha, brandingStartAlpha, appRevealDelay, appRevealDuration, + animatorListener, 0f /* roundedCornerRadius */); } /** @@ -87,7 +103,8 @@ public class SplashScreenExitAnimationUtils { SurfaceControl firstWindowSurface, int mMainWindowShiftLength, TransactionPool transactionPool, Rect firstWindowFrame, int animationDuration, int iconFadeOutDuration, float iconStartAlpha, float brandingStartAlpha, - int appRevealDelay, int appRevealDuration, Animator.AnimatorListener animatorListener) { + int appRevealDelay, int appRevealDuration, Animator.AnimatorListener animatorListener, + float roundedCornerRadius) { // reveal app final float transparentRatio = 0.8f; final int globalHeight = splashScreenView.getHeight(); @@ -124,7 +141,7 @@ public class SplashScreenExitAnimationUtils { shiftUpAnimation = new ShiftUpAnimation(0, -mMainWindowShiftLength, occludeHoleView, firstWindowSurface, splashScreenView, transactionPool, firstWindowFrame, - mMainWindowShiftLength); + mMainWindowShiftLength, roundedCornerRadius); } ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f); @@ -289,8 +306,8 @@ public class SplashScreenExitAnimationUtils { public ShiftUpAnimation(float fromYDelta, float toYDelta, View occludeHoleView, SurfaceControl firstWindowSurface, ViewGroup splashScreenView, TransactionPool transactionPool, Rect firstWindowFrame, - int mainWindowShiftLength) { - mFromYDelta = fromYDelta; + int mainWindowShiftLength, float roundedCornerRadius) { + mFromYDelta = fromYDelta - roundedCornerRadius; mToYDelta = toYDelta; mOccludeHoleView = occludeHoleView; mApplier = new SyncRtSurfaceTransactionApplier(occludeHoleView); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java index 6ce981e25f5e7..839d56a432222 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java @@ -993,10 +993,11 @@ public class SplashscreenContentDrawer { * Create and play the default exit animation for splash screen view. */ void applyExitAnimation(SplashScreenView view, SurfaceControl leash, - Rect frame, Runnable finishCallback, long createTime) { + Rect frame, Runnable finishCallback, long createTime, float roundedCornerRadius) { final Runnable playAnimation = () -> { final SplashScreenExitAnimation animation = new SplashScreenExitAnimation(mContext, - view, leash, frame, mMainWindowShiftLength, mTransactionPool, finishCallback); + view, leash, frame, mMainWindowShiftLength, mTransactionPool, finishCallback, + roundedCornerRadius); animation.startAnimations(); }; if (view.getIconView() == null) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java index ff6f2b03c02c8..22e804547d5c6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java @@ -646,7 +646,7 @@ public class StartingSurfaceDrawer { mSplashscreenContentDrawer.applyExitAnimation(record.mContentView, removalInfo.windowAnimationLeash, removalInfo.mainFrame, () -> removeWindowInner(record.mDecorView, true), - record.mCreateTime); + record.mCreateTime, removalInfo.roundedCornerRadius); } else { // the SplashScreenView has been copied to client, hide the view to skip // default exit animation diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java index c6989ef906d5f..d619547dbbd10 100644 --- a/services/core/java/com/android/server/wm/TaskOrganizerController.java +++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java @@ -691,6 +691,8 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { if (mainWindow == null || mainWindow.mRemoved) { removalInfo.playRevealAnimation = false; } else if (removalInfo.playRevealAnimation && playShiftUpAnimation) { + removalInfo.roundedCornerRadius = + topActivity.mLetterboxUiController.getRoundedCornersRadius(mainWindow); removalInfo.windowAnimationLeash = applyStartingWindowAnimation(mainWindow); removalInfo.mainFrame = mainWindow.getRelativeFrame(); }