Implement switchtoScreenshot recents callback
This lets the recents animation trigger a switchToScreenshot
to avoid premature live-tile disappearance.
Bug: 223321653
Test: put app in pip, open another app, go to recents, expand pip
Change-Id: I7ddcd891978fca7e91d7d90c1c8d9b824f5652a6
diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java b/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java
index b502676..fe31f1d 100644
--- a/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java
+++ b/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java
@@ -145,6 +145,18 @@
});
}
+ @BinderThread
+ @Override
+ public boolean onSwitchToScreenshot(Runnable onFinished) {
+ Utilities.postAsyncCallback(MAIN_EXECUTOR.getHandler(), () -> {
+ for (RecentsAnimationListener listener : getListeners()) {
+ if (listener.onSwitchToScreenshot(onFinished)) return;
+ }
+ onFinished.run();
+ });
+ return true;
+ }
+
private final void onAnimationFinished(RecentsAnimationController controller) {
Utilities.postAsyncCallback(MAIN_EXECUTOR.getHandler(), () -> {
for (RecentsAnimationListener listener : getListeners()) {
@@ -180,5 +192,12 @@
* Callback made when a task started from the recents is ready for an app transition.
*/
default void onTasksAppeared(@NonNull RemoteAnimationTargetCompat[] appearedTaskTarget) {}
+
+ /**
+ * @return whether this will call onFinished or not (onFinished should only be called once).
+ */
+ default boolean onSwitchToScreenshot(Runnable onFinished) {
+ return false;
+ }
}
}
diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
index 57b42f8..4bb2400 100644
--- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java
+++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
@@ -203,6 +203,24 @@
}
}
}
+
+ @Override
+ public boolean onSwitchToScreenshot(Runnable onFinished) {
+ if (!ENABLE_QUICKSTEP_LIVE_TILE.get() || !activityInterface.isInLiveTileMode()
+ || activityInterface.getCreatedActivity() == null) {
+ // No need to switch since tile is already a screenshot.
+ onFinished.run();
+ } else {
+ final RecentsView recentsView =
+ activityInterface.getCreatedActivity().getOverviewPanel();
+ if (recentsView != null) {
+ recentsView.switchToScreenshot(onFinished);
+ } else {
+ onFinished.run();
+ }
+ }
+ return true;
+ }
});
final long eventTime = gestureState.getSwipeUpStartTimeMs();
mCallbacks.addListener(gestureState);