diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index 253903c798..43be051dd3 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -1273,8 +1273,7 @@ public abstract class AbsSwipeUpHandler, HomeAnimationFactory homeAnimFactory = createHomeAnimationFactory(cookies, duration, isTranslucent, appCanEnterPip, runningTaskTarget); - mIsSwipingPipToHome = !mIsSwipeForStagedSplit - && homeAnimFactory.supportSwipePipToHome() && appCanEnterPip; + mIsSwipingPipToHome = !mIsSwipeForStagedSplit && appCanEnterPip; final RectFSpringAnim[] windowAnim; if (mIsSwipingPipToHome) { mSwipePipToHomeAnimator = createWindowAnimationToPip( diff --git a/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java b/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java index 4eb190a2f5..d76484c135 100644 --- a/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java @@ -50,12 +50,14 @@ import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.anim.SpringAnimationBuilder; +import com.android.launcher3.states.StateAnimationConfig; import com.android.launcher3.util.DisplayController; import com.android.quickstep.fallback.FallbackRecentsView; import com.android.quickstep.fallback.RecentsState; @@ -93,6 +95,8 @@ public class FallbackSwipeHandler extends private final Matrix mTmpMatrix = new Matrix(); private float mMaxLauncherScale = 1; + private boolean mAppCanEnterPip; + public FallbackSwipeHandler(Context context, RecentsAnimationDeviceState deviceState, TaskAnimationManager taskAnimationManager, GestureState gestureState, long touchTimeMs, boolean continuingLastGesture, InputConsumerController inputConsumer) { @@ -135,16 +139,27 @@ public class FallbackSwipeHandler extends protected HomeAnimationFactory createHomeAnimationFactory(ArrayList launchCookies, long duration, boolean isTargetTranslucent, boolean appCanEnterPip, RemoteAnimationTargetCompat runningTaskTarget) { + mAppCanEnterPip = appCanEnterPip; + if (appCanEnterPip) { + return new FallbackPipToHomeAnimationFactory(); + } mActiveAnimationFactory = new FallbackHomeAnimationFactory(duration); + startHomeIntent(mActiveAnimationFactory); + return mActiveAnimationFactory; + } + + private void startHomeIntent( + @Nullable FallbackHomeAnimationFactory gestureContractAnimationFactory) { ActivityOptions options = ActivityOptions.makeCustomAnimation(mContext, 0, 0); Intent intent = new Intent(mGestureState.getHomeIntent()); - mActiveAnimationFactory.addGestureContract(intent); + if (gestureContractAnimationFactory != null) { + gestureContractAnimationFactory.addGestureContract(intent); + } try { mContext.startActivity(intent, options.toBundle()); } catch (NullPointerException | ActivityNotFoundException | SecurityException e) { mContext.startActivity(createHomeIntent()); } - return mActiveAnimationFactory; } @Override @@ -160,8 +175,19 @@ public class FallbackSwipeHandler extends @Override protected void finishRecentsControllerToHome(Runnable callback) { + final Runnable recentsCallback; + if (mAppCanEnterPip) { + // Make sure Launcher is resumed after auto-enter-pip transition to actually trigger + // the PiP task appearing. + recentsCallback = () -> { + callback.run(); + startHomeIntent(null /* gestureContractAnimationFactory */); + }; + } else { + recentsCallback = callback; + } mRecentsAnimationController.finish( - false /* toRecents */, callback, true /* sendUserLeaveHint */); + mAppCanEnterPip /* toRecents */, recentsCallback, true /* sendUserLeaveHint */); } @Override @@ -186,6 +212,17 @@ public class FallbackSwipeHandler extends } } + private class FallbackPipToHomeAnimationFactory extends HomeAnimationFactory { + @NonNull + @Override + public AnimatorPlaybackController createActivityAnimationToHome() { + // copied from {@link LauncherSwipeHandlerV2.LauncherHomeAnimationFactory} + long accuracy = 2 * Math.max(mDp.widthPx, mDp.heightPx); + return mActivity.getStateManager().createAnimationToNewWorkspace( + RecentsState.HOME, accuracy, StateAnimationConfig.SKIP_ALL_ANIMATIONS); + } + } + private class FallbackHomeAnimationFactory extends HomeAnimationFactory { private final Rect mTempRect = new Rect(); private final TransformParams mHomeAlphaParams = new TransformParams(); diff --git a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java index bc7a6ae449..e9571e0ca1 100644 --- a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java +++ b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java @@ -284,10 +284,5 @@ public class LauncherSwipeHandlerV2 extends getViewIgnoredInWorkspaceRevealAnimation()) .start(); } - - @Override - public boolean supportSwipePipToHome() { - return true; - } } } diff --git a/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java b/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java index 8d9a6855af..8862073725 100644 --- a/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java +++ b/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java @@ -183,14 +183,6 @@ public abstract class SwipeUpAnimationLogic implements public void onCancel() { } - /** - * @return {@code true} if this factory supports animating an Activity to PiP window on - * swiping up to home. - */ - public boolean supportSwipePipToHome() { - return false; - } - /** * @param progress The progress of the animation to the home screen. * @return The current alpha to set on the animating app window.