From 5300fce94ffb621c82d917b22232a86d34812339 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Sat, 12 Jun 2021 13:46:50 -0700 Subject: [PATCH 1/2] Don't use icon home animator when entering PIP - If the app supports pip, can just do the fallback workspace home animation since the app will not be going to the icon Bug: 190464560 Test: Open YT, swipe up, ensure it goes to the icon, Reopen YT video, swipe up, ensure it goes into PIP without icon animation Change-Id: Ic22ccf17c664b9941ed944c0e39dc1f8d4efa84a --- .../src/com/android/quickstep/AbsSwipeUpHandler.java | 11 ++++++----- .../com/android/quickstep/FallbackSwipeHandler.java | 2 +- .../com/android/quickstep/LauncherSwipeHandlerV2.java | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index 52f34d90e0..b5c52179c8 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -1072,7 +1072,7 @@ public abstract class AbsSwipeUpHandler, protected abstract HomeAnimationFactory createHomeAnimationFactory( ArrayList launchCookies, long duration, boolean isTargetTranslucent, - RemoteAnimationTargetCompat runningTaskTarget); + boolean appCanEnterPip, RemoteAnimationTargetCompat runningTaskTarget); private final TaskStackChangeListener mActivityRestartListener = new TaskStackChangeListener() { @Override @@ -1117,13 +1117,14 @@ public abstract class AbsSwipeUpHandler, ? runningTaskTarget.taskInfo.launchCookies : new ArrayList<>(); boolean isTranslucent = runningTaskTarget != null && runningTaskTarget.isTranslucent; - HomeAnimationFactory homeAnimFactory = - createHomeAnimationFactory(cookies, duration, isTranslucent, runningTaskTarget); - mIsSwipingPipToHome = homeAnimFactory.supportSwipePipToHome() - && runningTaskTarget != null + boolean appCanEnterPip = runningTaskTarget != null && runningTaskTarget.taskInfo.pictureInPictureParams != null && TaskInfoCompat.isAutoEnterPipEnabled( runningTaskTarget.taskInfo.pictureInPictureParams); + HomeAnimationFactory homeAnimFactory = + createHomeAnimationFactory(cookies, duration, isTranslucent, appCanEnterPip, + runningTaskTarget); + mIsSwipingPipToHome = homeAnimFactory.supportSwipePipToHome() && appCanEnterPip; if (mIsSwipingPipToHome) { mSwipePipToHomeAnimator = getSwipePipToHomeAnimator( homeAnimFactory, runningTaskTarget, start); diff --git a/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java b/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java index 7290ff6a41..fd44e023a7 100644 --- a/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java @@ -129,7 +129,7 @@ public class FallbackSwipeHandler extends @Override protected HomeAnimationFactory createHomeAnimationFactory(ArrayList launchCookies, - long duration, boolean isTargetTranslucent, + long duration, boolean isTargetTranslucent, boolean appCanEnterPip, RemoteAnimationTargetCompat runningTaskTarget) { mActiveAnimationFactory = new FallbackHomeAnimationFactory(duration); ActivityOptions options = ActivityOptions.makeCustomAnimation(mContext, 0, 0); diff --git a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java index 40741e4945..47d94ba2ad 100644 --- a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java +++ b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java @@ -88,7 +88,7 @@ public class LauncherSwipeHandlerV2 extends @Override protected HomeAnimationFactory createHomeAnimationFactory(ArrayList launchCookies, - long duration, boolean isTargetTranslucent, + long duration, boolean isTargetTranslucent, boolean appCanEnterPip, RemoteAnimationTargetCompat runningTaskTarget) { if (mActivity == null) { mStateCallback.addChangeListener(STATE_LAUNCHER_PRESENT | STATE_HANDLER_INVALIDATED, @@ -108,7 +108,7 @@ public class LauncherSwipeHandlerV2 extends mActivity.getRootView().setForceHideBackArrow(true); mActivity.setHintUserWillBeActive(); - if (!canUseWorkspaceView) { + if (!canUseWorkspaceView || appCanEnterPip) { return new LauncherHomeAnimationFactory(); } if (workspaceView instanceof LauncherAppWidgetHostView) { From 954681d837e3374b120df023c899e439ec34b5b0 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Wed, 9 Jun 2021 21:51:14 -0700 Subject: [PATCH 2/2] Disallow auto-enter PIP when there is an existing PIP - Remove some deprecated calls when registering task stack listeners Bug: 190464560 Test: Enter YT Pip, try to enter another auto-enter PIP app Change-Id: Ib7d3a07effadb7b13f7c37f938741e27cf0e254e --- .../android/quickstep/AbsSwipeUpHandler.java | 11 +++-- .../android/quickstep/RecentTasksList.java | 3 +- .../RecentsAnimationDeviceState.java | 41 ++++++++++++++++--- .../com/android/quickstep/RecentsModel.java | 3 +- .../quickstep/RotationTouchHelper.java | 7 ++-- .../quickstep/TaskAnimationManager.java | 9 ++-- 6 files changed, 56 insertions(+), 18 deletions(-) diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index b5c52179c8..8f42993b62 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -117,6 +117,7 @@ import com.android.systemui.shared.system.LatencyTrackerCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.TaskInfoCompat; import com.android.systemui.shared.system.TaskStackChangeListener; +import com.android.systemui.shared.system.TaskStackChangeListeners; import java.util.ArrayList; import java.util.function.Consumer; @@ -1083,7 +1084,7 @@ public abstract class AbsSwipeUpHandler, // Since this is an edge case, just cancel and relaunch with default activity // options (since we don't know if there's an associated app icon to launch from) endRunningWindowAnim(true /* cancel */); - ActivityManagerWrapper.getInstance().unregisterTaskStackListener( + TaskStackChangeListeners.getInstance().unregisterTaskStackListener( mActivityRestartListener); ActivityManagerWrapper.getInstance().startActivityFromRecents(task.taskId, null); } @@ -1098,7 +1099,7 @@ public abstract class AbsSwipeUpHandler, // If we are transitioning to launcher, then listen for the activity to be restarted while // the transition is in progress if (mGestureState.getEndTarget().isLauncher) { - ActivityManagerWrapper.getInstance().registerTaskStackListener( + TaskStackChangeListeners.getInstance().registerTaskStackListener( mActivityRestartListener); mParallelRunningAnim = mActivityInterface.getParallelAnimationToLauncher( @@ -1117,7 +1118,8 @@ public abstract class AbsSwipeUpHandler, ? runningTaskTarget.taskInfo.launchCookies : new ArrayList<>(); boolean isTranslucent = runningTaskTarget != null && runningTaskTarget.isTranslucent; - boolean appCanEnterPip = runningTaskTarget != null + boolean appCanEnterPip = !mDeviceState.isPipActive() + && runningTaskTarget != null && runningTaskTarget.taskInfo.pictureInPictureParams != null && TaskInfoCompat.isAutoEnterPipEnabled( runningTaskTarget.taskInfo.pictureInPictureParams); @@ -1400,7 +1402,8 @@ public abstract class AbsSwipeUpHandler, } mActivityInitListener.unregister(); - ActivityManagerWrapper.getInstance().unregisterTaskStackListener(mActivityRestartListener); + TaskStackChangeListeners.getInstance().unregisterTaskStackListener( + mActivityRestartListener); mTaskSnapshot = null; } diff --git a/quickstep/src/com/android/quickstep/RecentTasksList.java b/quickstep/src/com/android/quickstep/RecentTasksList.java index 3302da0f77..3080f040ac 100644 --- a/quickstep/src/com/android/quickstep/RecentTasksList.java +++ b/quickstep/src/com/android/quickstep/RecentTasksList.java @@ -33,6 +33,7 @@ import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.KeyguardManagerCompat; import com.android.systemui.shared.system.TaskStackChangeListener; +import com.android.systemui.shared.system.TaskStackChangeListeners; import java.util.ArrayList; import java.util.Collections; @@ -66,7 +67,7 @@ public class RecentTasksList extends TaskStackChangeListener { mKeyguardManager = keyguardManager; mChangeId = 1; mActivityManagerWrapper = activityManagerWrapper; - mActivityManagerWrapper.registerTaskStackListener(this); + TaskStackChangeListeners.getInstance().registerTaskStackListener(this); } @VisibleForTesting diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java index fa37901f27..444d77a612 100644 --- a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java +++ b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java @@ -15,6 +15,8 @@ */ package com.android.quickstep; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; +import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.content.Intent.ACTION_USER_UNLOCKED; import static com.android.launcher3.util.DisplayController.CHANGE_ALL; @@ -41,6 +43,7 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_S import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED; import android.app.ActivityManager; +import android.app.ActivityTaskManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -50,6 +53,7 @@ import android.content.res.Resources; import android.graphics.Region; import android.net.Uri; import android.os.Process; +import android.os.RemoteException; import android.os.SystemProperties; import android.os.UserManager; import android.provider.Settings; @@ -75,6 +79,8 @@ import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags; import com.android.systemui.shared.system.SystemGestureExclusionListenerCompat; +import com.android.systemui.shared.system.TaskStackChangeListener; +import com.android.systemui.shared.system.TaskStackChangeListeners; import java.io.PrintWriter; import java.util.ArrayList; @@ -96,6 +102,8 @@ public class RecentsAnimationDeviceState implements private final DisplayController mDisplayController; private final int mDisplayId; private final RotationTouchHelper mRotationTouchHelper; + private final TaskStackChangeListener mPipListener; + private final List mGestureBlockedActivities; private final ArrayList mOnDestroyActions = new ArrayList<>(); @@ -106,9 +114,11 @@ public class RecentsAnimationDeviceState implements private final Region mDeferredGestureRegion = new Region(); private boolean mAssistantAvailable; private float mAssistantVisibility; + private boolean mIsUserSetupComplete; private boolean mIsOneHandedModeEnabled; private boolean mIsSwipeToNotificationEnabled; private final boolean mIsOneHandedModeSupported; + private boolean mPipIsActive; private boolean mIsUserUnlocked; private final ArrayList mUserUnlockedActions = new ArrayList<>(); @@ -125,10 +135,6 @@ public class RecentsAnimationDeviceState implements private Region mExclusionRegion; private SystemGestureExclusionListenerCompat mExclusionListener; - private final List mGestureBlockedActivities; - - private boolean mIsUserSetupComplete; - public RecentsAnimationDeviceState(Context context) { this(context, false); } @@ -204,7 +210,6 @@ public class RecentsAnimationDeviceState implements mIsOneHandedModeEnabled = false; } - Uri swipeBottomNotificationUri = Settings.Secure.getUriFor(ONE_HANDED_SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED); SettingsCache.OnChangeListener onChangeListener = @@ -220,6 +225,27 @@ public class RecentsAnimationDeviceState implements settingsCache.register(setupCompleteUri, userSetupChangeListener); runOnDestroy(() -> settingsCache.unregister(setupCompleteUri, userSetupChangeListener)); } + + try { + mPipIsActive = ActivityTaskManager.getService().getRootTaskInfo( + WINDOWING_MODE_PINNED, ACTIVITY_TYPE_UNDEFINED) != null; + } catch (RemoteException e) { + // Do nothing + } + mPipListener = new TaskStackChangeListener() { + @Override + public void onActivityPinned(String packageName, int userId, int taskId, int stackId) { + mPipIsActive = true; + } + + @Override + public void onActivityUnpinned() { + mPipIsActive = false; + } + }; + TaskStackChangeListeners.getInstance().registerTaskStackListener(mPipListener); + runOnDestroy(() -> + TaskStackChangeListeners.getInstance().unregisterTaskStackListener(mPipListener)); } private void runOnDestroy(Runnable action) { @@ -579,6 +605,10 @@ public class RecentsAnimationDeviceState implements return mIsSwipeToNotificationEnabled; } + public boolean isPipActive() { + return mPipIsActive; + } + public RotationTouchHelper getRotationTouchHelper() { return mRotationTouchHelper; } @@ -596,6 +626,7 @@ public class RecentsAnimationDeviceState implements pw.println(" isOneHandedModeEnabled=" + mIsOneHandedModeEnabled); pw.println(" isSwipeToNotificationEnabled=" + mIsSwipeToNotificationEnabled); pw.println(" deferredGestureRegion=" + mDeferredGestureRegion); + pw.println(" pipIsActive=" + mPipIsActive); mRotationTouchHelper.dump(pw); } } diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java index 2eb9dd84eb..1e82c8cbfa 100644 --- a/quickstep/src/com/android/quickstep/RecentsModel.java +++ b/quickstep/src/com/android/quickstep/RecentsModel.java @@ -39,6 +39,7 @@ import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.KeyguardManagerCompat; import com.android.systemui.shared.system.TaskStackChangeListener; +import com.android.systemui.shared.system.TaskStackChangeListeners; import java.util.ArrayList; import java.util.List; @@ -75,7 +76,7 @@ public class RecentsModel extends TaskStackChangeListener implements IconChangeL mIconCache = new TaskIconCache(context, RECENTS_MODEL_EXECUTOR, iconProvider); mThumbnailCache = new TaskThumbnailCache(context, RECENTS_MODEL_EXECUTOR); - ActivityManagerWrapper.getInstance().registerTaskStackListener(this); + TaskStackChangeListeners.getInstance().registerTaskStackListener(this); iconProvider.registerIconChangeListener(this, MAIN_EXECUTOR.getHandler()); } diff --git a/quickstep/src/com/android/quickstep/RotationTouchHelper.java b/quickstep/src/com/android/quickstep/RotationTouchHelper.java index fc7a3dfde3..678b176151 100644 --- a/quickstep/src/com/android/quickstep/RotationTouchHelper.java +++ b/quickstep/src/com/android/quickstep/RotationTouchHelper.java @@ -38,6 +38,7 @@ import com.android.quickstep.util.RecentsOrientedState; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.TaskStackChangeListener; +import com.android.systemui.shared.system.TaskStackChangeListeners; import java.io.PrintWriter; import java.util.ArrayList; @@ -178,14 +179,14 @@ public class RotationTouchHelper implements } private void setupOrientationSwipeHandler() { - ActivityManagerWrapper.getInstance().registerTaskStackListener(mFrozenTaskListener); - mOnDestroyFrozenTaskRunnable = () -> ActivityManagerWrapper.getInstance() + TaskStackChangeListeners.getInstance().registerTaskStackListener(mFrozenTaskListener); + mOnDestroyFrozenTaskRunnable = () -> TaskStackChangeListeners.getInstance() .unregisterTaskStackListener(mFrozenTaskListener); runOnDestroy(mOnDestroyFrozenTaskRunnable); } private void destroyOrientationSwipeHandlerCallback() { - ActivityManagerWrapper.getInstance().unregisterTaskStackListener(mFrozenTaskListener); + TaskStackChangeListeners.getInstance().unregisterTaskStackListener(mFrozenTaskListener); mOnDestroyActions.remove(mOnDestroyFrozenTaskRunnable); } diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java index 29ddde0c99..9731bf187e 100644 --- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java +++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java @@ -39,6 +39,7 @@ import com.android.systemui.shared.system.ActivityOptionsCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.RemoteTransitionCompat; import com.android.systemui.shared.system.TaskStackChangeListener; +import com.android.systemui.shared.system.TaskStackChangeListeners; public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAnimationListener { public static final boolean ENABLE_SHELL_TRANSITIONS = @@ -58,7 +59,7 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task, boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) { if (mLastGestureState == null) { - ActivityManagerWrapper.getInstance().unregisterTaskStackListener( + TaskStackChangeListeners.getInstance().unregisterTaskStackListener( mLiveTileRestartListener); return; } @@ -68,7 +69,7 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn RecentsView recentsView = activityInterface.getCreatedActivity().getOverviewPanel(); if (recentsView != null) { recentsView.launchSideTaskInLiveTileModeForRestartedApp(task.taskId); - ActivityManagerWrapper.getInstance().unregisterTaskStackListener( + TaskStackChangeListeners.getInstance().unregisterTaskStackListener( mLiveTileRestartListener); } } @@ -197,7 +198,7 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn } public void enableLiveTileRestartListener() { - ActivityManagerWrapper.getInstance().registerTaskStackListener(mLiveTileRestartListener); + TaskStackChangeListeners.getInstance().registerTaskStackListener(mLiveTileRestartListener); } /** @@ -241,7 +242,7 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn mLiveTileCleanUpHandler.run(); mLiveTileCleanUpHandler = null; } - ActivityManagerWrapper.getInstance().unregisterTaskStackListener(mLiveTileRestartListener); + TaskStackChangeListeners.getInstance().unregisterTaskStackListener(mLiveTileRestartListener); // Release all the target leashes if (mTargets != null) {