Merge "Fix pip finish-callback when enter animation runs in shell" into tm-dev

This commit is contained in:
Evan Rosky
2022-03-18 03:23:51 +00:00
committed by Android (Google) Code Review

View File

@@ -166,8 +166,7 @@ public class PipTransition extends PipTransitionController {
mExitTransition = null; mExitTransition = null;
mHasFadeOut = false; mHasFadeOut = false;
if (mFinishCallback != null) { if (mFinishCallback != null) {
mFinishCallback.onTransitionFinished(null, null); callFinishCallback(null /* wct */);
mFinishCallback = null;
mFinishTransaction = null; mFinishTransaction = null;
throw new RuntimeException("Previous callback not called, aborting exit PIP."); throw new RuntimeException("Previous callback not called, aborting exit PIP.");
} }
@@ -232,6 +231,11 @@ public class PipTransition extends PipTransitionController {
return false; return false;
} }
/** Helper to identify whether this handler is currently the one playing an animation */
private boolean isAnimatingLocally() {
return mFinishTransaction != null;
}
@Nullable @Nullable
@Override @Override
public WindowContainerTransaction handleRequest(@NonNull IBinder transition, public WindowContainerTransaction handleRequest(@NonNull IBinder transition,
@@ -282,9 +286,11 @@ public class PipTransition extends PipTransitionController {
if (enteringPip) { if (enteringPip) {
mPipTransitionState.setTransitionState(ENTERED_PIP); mPipTransitionState.setTransitionState(ENTERED_PIP);
} }
// If there is an expected exit transition, then the exit will be "merged" into this // If we have an exit transition, but aren't playing a transition locally, it
// transition so don't fire the finish-callback in that case. // means we're expecting the exit transition will be "merged" into another transition
if (mExitTransition == null && mFinishCallback != null) { // (likely a remote like launcher), so don't fire the finish-callback here -- wait until
// the exit transition is merged.
if ((mExitTransition == null || isAnimatingLocally()) && mFinishCallback != null) {
WindowContainerTransaction wct = new WindowContainerTransaction(); WindowContainerTransaction wct = new WindowContainerTransaction();
prepareFinishResizeTransaction(taskInfo, destinationBounds, prepareFinishResizeTransaction(taskInfo, destinationBounds,
direction, wct); direction, wct);
@@ -305,12 +311,19 @@ public class PipTransition extends PipTransitionController {
mSurfaceTransactionHelper.crop(mFinishTransaction, leash, finishBounds); mSurfaceTransactionHelper.crop(mFinishTransaction, leash, finishBounds);
} }
mFinishTransaction = null; mFinishTransaction = null;
mFinishCallback.onTransitionFinished(wct, null /* callback */); callFinishCallback(wct);
mFinishCallback = null;
} }
finishResizeForMenu(destinationBounds); finishResizeForMenu(destinationBounds);
} }
private void callFinishCallback(WindowContainerTransaction wct) {
// Need to unset mFinishCallback first because onTransitionFinished can re-enter this
// handler if there is a pending PiP animation.
final Transitions.TransitionFinishCallback finishCallback = mFinishCallback;
mFinishCallback = null;
finishCallback.onTransitionFinished(wct, null /* callback */);
}
@Override @Override
public void forceFinishTransition() { public void forceFinishTransition() {
if (mFinishCallback == null) return; if (mFinishCallback == null) return;
@@ -572,8 +585,7 @@ public class PipTransition extends PipTransitionController {
mHasFadeOut = false; mHasFadeOut = false;
if (mFinishCallback != null) { if (mFinishCallback != null) {
mFinishCallback.onTransitionFinished(null /* wct */, null /* callback */); callFinishCallback(null /* wct */);
mFinishCallback = null;
mFinishTransaction = null; mFinishTransaction = null;
throw new RuntimeException("Previous callback not called, aborting entering PIP."); throw new RuntimeException("Previous callback not called, aborting entering PIP.");
} }