Merge "PiP: Fix more Shell Transition potential issues." into sc-v2-dev

This commit is contained in:
Ben Lin
2021-10-27 00:11:13 +00:00
committed by Android (Google) Code Review
2 changed files with 25 additions and 4 deletions

View File

@@ -1292,13 +1292,17 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
} }
Rect baseBounds = direction == TRANSITION_DIRECTION_SNAP_AFTER_RESIZE Rect baseBounds = direction == TRANSITION_DIRECTION_SNAP_AFTER_RESIZE
? mPipBoundsState.getBounds() : currentBounds; ? mPipBoundsState.getBounds() : currentBounds;
final boolean existingAnimatorRunning = mPipAnimationController.getCurrentAnimator() != null
&& mPipAnimationController.getCurrentAnimator().isRunning();
final PipAnimationController.PipTransitionAnimator<?> animator = mPipAnimationController final PipAnimationController.PipTransitionAnimator<?> animator = mPipAnimationController
.getAnimator(mTaskInfo, mLeash, baseBounds, currentBounds, destinationBounds, .getAnimator(mTaskInfo, mLeash, baseBounds, currentBounds, destinationBounds,
sourceHintRect, direction, startingAngle, rotationDelta); sourceHintRect, direction, startingAngle, rotationDelta);
animator.setTransitionDirection(direction) animator.setTransitionDirection(direction)
.setPipAnimationCallback(mPipAnimationCallback)
.setPipTransactionHandler(mPipTransactionHandler) .setPipTransactionHandler(mPipTransactionHandler)
.setDuration(durationMs); .setDuration(durationMs);
if (!existingAnimatorRunning) {
animator.setPipAnimationCallback(mPipAnimationCallback);
}
if (isInPipDirection(direction)) { if (isInPipDirection(direction)) {
// Similar to auto-enter-pip transition, we use content overlay when there is no // Similar to auto-enter-pip transition, we use content overlay when there is no
// source rect hint to enter PiP use bounds animation. // source rect hint to enter PiP use bounds animation.

View File

@@ -116,6 +116,12 @@ public class PipTransition extends PipTransitionController {
if (mExitTransition == transition || info.getType() == TRANSIT_EXIT_PIP) { if (mExitTransition == transition || info.getType() == TRANSIT_EXIT_PIP) {
mExitTransition = null; mExitTransition = null;
if (info.getChanges().size() == 1) { if (info.getChanges().size() == 1) {
if (mFinishCallback != null) {
mFinishCallback.onTransitionFinished(null, null);
mFinishCallback = null;
throw new RuntimeException("Previous callback not called, aborting exit PIP.");
}
final TransitionInfo.Change change = info.getChanges().get(0); final TransitionInfo.Change change = info.getChanges().get(0);
mFinishCallback = finishCallback; mFinishCallback = finishCallback;
startTransaction.apply(); startTransaction.apply();
@@ -129,6 +135,12 @@ public class PipTransition extends PipTransitionController {
} }
if (info.getType() == TRANSIT_REMOVE_PIP) { if (info.getType() == TRANSIT_REMOVE_PIP) {
if (mFinishCallback != null) {
mFinishCallback.onTransitionFinished(null /* wct */, null /* callback */);
mFinishCallback = null;
throw new RuntimeException("Previous callback not called, aborting remove PIP.");
}
startTransaction.apply(); startTransaction.apply();
finishTransaction.setWindowCrop(info.getChanges().get(0).getLeash(), finishTransaction.setWindowCrop(info.getChanges().get(0).getLeash(),
mPipBoundsState.getDisplayBounds()); mPipBoundsState.getDisplayBounds());
@@ -159,6 +171,12 @@ public class PipTransition extends PipTransitionController {
return false; return false;
} }
if (mFinishCallback != null) {
mFinishCallback.onTransitionFinished(null /* wct */, null /* callback */);
mFinishCallback = null;
throw new RuntimeException("Previous callback not called, aborting entering PIP.");
}
// Show the wallpaper if there is a wallpaper change. // Show the wallpaper if there is a wallpaper change.
if (wallpaper != null) { if (wallpaper != null) {
startTransaction.show(wallpaper.getLeash()); startTransaction.show(wallpaper.getLeash());
@@ -231,7 +249,7 @@ public class PipTransition extends PipTransitionController {
if (tx != null) { if (tx != null) {
wct.setBoundsChangeTransaction(taskInfo.token, tx); wct.setBoundsChangeTransaction(taskInfo.token, tx);
} }
mFinishCallback.onTransitionFinished(wct, null /* wctCallback */); mFinishCallback.onTransitionFinished(wct, null /* callback */);
mFinishCallback = null; mFinishCallback = null;
} }
finishResizeForMenu(destinationBounds); finishResizeForMenu(destinationBounds);
@@ -240,7 +258,7 @@ public class PipTransition extends PipTransitionController {
@Override @Override
public void forceFinishTransition() { public void forceFinishTransition() {
if (mFinishCallback == null) return; if (mFinishCallback == null) return;
mFinishCallback.onTransitionFinished(null /* wct */, null /* wctCallback */); mFinishCallback.onTransitionFinished(null /* wct */, null /* callback */);
mFinishCallback = null; mFinishCallback = null;
} }
@@ -286,7 +304,6 @@ public class PipTransition extends PipTransitionController {
mPipBoundsState.setBounds(destinationBounds); mPipBoundsState.setBounds(destinationBounds);
onFinishResize(taskInfo, destinationBounds, TRANSITION_DIRECTION_TO_PIP, null /* tx */); onFinishResize(taskInfo, destinationBounds, TRANSITION_DIRECTION_TO_PIP, null /* tx */);
sendOnPipTransitionFinished(TRANSITION_DIRECTION_TO_PIP); sendOnPipTransitionFinished(TRANSITION_DIRECTION_TO_PIP);
mFinishCallback = null;
mPipTransitionState.setInSwipePipToHomeTransition(false); mPipTransitionState.setInSwipePipToHomeTransition(false);
return true; return true;
} }