Merge "Support shell rotation transition on general window container" into tm-qpr-dev

This commit is contained in:
Riddle Hsu
2022-08-03 13:09:54 +00:00
committed by Android (Google) Code Review
5 changed files with 53 additions and 19 deletions

View File

@@ -154,8 +154,6 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
private final int mCurrentUserId;
private ScreenRotationAnimation mRotationAnimation;
private Drawable mEnterpriseThumbnailDrawable;
private BroadcastReceiver mEnterpriseResourceUpdatedReceiver = new BroadcastReceiver() {
@@ -340,12 +338,6 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
final Runnable onAnimFinish = () -> {
if (!animations.isEmpty()) return;
if (mRotationAnimation != null) {
mRotationAnimation.kill();
mRotationAnimation = null;
}
mAnimations.remove(transition);
finishCallback.onTransitionFinished(null /* wct */, null /* wctCB */);
};
@@ -365,11 +357,8 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
isSeamlessDisplayChange = isRotationSeamless(info, mDisplayController);
final int anim = getRotationAnimation(info);
if (!(isSeamlessDisplayChange || anim == ROTATION_ANIMATION_JUMPCUT)) {
mRotationAnimation = new ScreenRotationAnimation(mContext, mSurfaceSession,
mTransactionPool, startTransaction, change, info.getRootLeash(),
anim);
mRotationAnimation.startAnimation(animations, onAnimFinish,
mTransitionAnimationScaleSetting, mMainExecutor, mAnimExecutor);
startRotationAnimation(startTransaction, change, info, anim, animations,
onAnimFinish);
continue;
}
} else {
@@ -413,6 +402,13 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
startTransaction.setWindowCrop(change.getLeash(),
change.getEndAbsBounds().width(), change.getEndAbsBounds().height());
}
// Rotation change of independent non display window container.
if (change.getParent() == null
&& change.getStartRotation() != change.getEndRotation()) {
startRotationAnimation(startTransaction, change, info,
ROTATION_ANIMATION_ROTATE, animations, onAnimFinish);
continue;
}
}
// Don't animate anything that isn't independent.
@@ -543,6 +539,31 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
}
}
private void startRotationAnimation(SurfaceControl.Transaction startTransaction,
TransitionInfo.Change change, TransitionInfo info, int animHint,
ArrayList<Animator> animations, Runnable onAnimFinish) {
final ScreenRotationAnimation anim = new ScreenRotationAnimation(mContext, mSurfaceSession,
mTransactionPool, startTransaction, change, info.getRootLeash(), animHint);
// The rotation animation may consist of 3 animations: fade-out screenshot, fade-in real
// content, and background color. The item of "animGroup" will be removed if the sub
// animation is finished. Then if the list becomes empty, the rotation animation is done.
final ArrayList<Animator> animGroup = new ArrayList<>(3);
final ArrayList<Animator> animGroupStore = new ArrayList<>(3);
final Runnable finishCallback = () -> {
if (!animGroup.isEmpty()) return;
anim.kill();
animations.removeAll(animGroupStore);
onAnimFinish.run();
};
anim.startAnimation(animGroup, finishCallback, mTransitionAnimationScaleSetting,
mMainExecutor, mAnimExecutor);
for (int i = animGroup.size() - 1; i >= 0; i--) {
final Animator animator = animGroup.get(i);
animGroupStore.add(animator);
animations.add(animator);
}
}
private void edgeExtendWindow(TransitionInfo.Change change,
Animation a, SurfaceControl.Transaction startTransaction,
SurfaceControl.Transaction finishTransaction) {

View File

@@ -84,7 +84,7 @@ class ScreenRotationAnimation {
private final Context mContext;
private final TransactionPool mTransactionPool;
private final float[] mTmpFloats = new float[9];
/** The leash of display. */
/** The leash of the changing window container. */
private final SurfaceControl mSurfaceControl;
private final Rect mStartBounds = new Rect();
private final Rect mEndBounds = new Rect();

View File

@@ -356,7 +356,7 @@ public class Transitions implements RemoteCallable<Transitions> {
// Put all the OPEN/SHOW on top
if ((change.getFlags() & FLAG_IS_WALLPAPER) != 0) {
// Wallpaper is always at the bottom.
layer = 0;
layer = -zSplitLine;
} else if (mode == TRANSIT_OPEN || mode == TRANSIT_TO_FRONT) {
if (isOpening) {
// put on top

View File

@@ -2453,8 +2453,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
dc.setImeLayeringTarget(null);
dc.computeImeTarget(true /* updateImeTarget */);
}
if (dc.getImeInputTarget() == this
&& (mActivityRecord == null || !mActivityRecord.isRelaunching())) {
if (dc.getImeInputTarget() == this && !inRelaunchingActivity()) {
dc.updateImeInputAndControlTarget(null);
}
@@ -2581,7 +2580,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// usually unnoticeable (e.g. covered by rotation animation) and the animation
// bounds could be inconsistent, such as depending on when the window applies
// its draw transaction with new rotation.
final boolean allowExitAnimation = !getDisplayContent().inTransition();
final boolean allowExitAnimation = !getDisplayContent().inTransition()
// There will be a new window so the exit animation may not be visible or
// look weird if its orientation is changed.
&& !inRelaunchingActivity();
if (wasVisible) {
final int transit = (!startingWindow) ? TRANSIT_EXIT : TRANSIT_PREVIEW_DONE;
@@ -3871,7 +3873,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// If the activity is scheduled to relaunch, skip sending the resized to ViewRootImpl now
// since it will be destroyed anyway. This also prevents the client from receiving
// windowing mode change before it is destroyed.
if (mActivityRecord != null && mActivityRecord.isRelaunching()) {
if (inRelaunchingActivity()) {
return;
}
// If this is an activity or wallpaper and is invisible or going invisible, don't report
@@ -3957,6 +3959,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
}
boolean inRelaunchingActivity() {
return mActivityRecord != null && mActivityRecord.isRelaunching();
}
boolean isClientLocal() {
return mClient instanceof IWindow.Stub;
}

View File

@@ -46,6 +46,7 @@ import android.view.DisplayInfo;
import android.view.InsetsState;
import android.view.Surface;
import android.view.SurfaceControl;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams.WindowType;
import android.window.WindowContext;
@@ -558,6 +559,12 @@ class WindowToken extends WindowContainer<WindowState> {
// The window may be detached or detaching.
return;
}
if (mTransitionController.isShellTransitionsEnabled()
&& asActivityRecord() != null && isVisible()) {
// Trigger an activity level rotation transition.
mTransitionController.requestTransitionIfNeeded(WindowManager.TRANSIT_CHANGE, this);
mTransitionController.setReady(this);
}
final int originalRotation = getWindowConfiguration().getRotation();
onConfigurationChanged(parent.getConfiguration());
onCancelFixedRotationTransform(originalRotation);