diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java index bc6348d8d7..aa312619bb 100644 --- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java @@ -63,6 +63,7 @@ import com.android.quickstep.views.RecentsView; import com.android.systemui.shared.recents.model.ThumbnailData; import java.util.Arrays; +import java.util.HashMap; import java.util.Set; import java.util.function.Supplier; import java.util.stream.Stream; @@ -459,7 +460,7 @@ public class LauncherTaskbarUIController extends TaskbarUIController { } @Override - public void onRecentsAnimationCanceled(ThumbnailData thumbnailData) { + public void onRecentsAnimationCanceled(HashMap thumbnailDatas) { endGestureStateOverride(true); } diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index 30a0fdf80a..a0a940b6f7 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -121,6 +121,7 @@ import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.TaskStackChangeListeners; import java.util.ArrayList; +import java.util.HashMap; import java.util.function.Consumer; /** @@ -399,9 +400,10 @@ public abstract class AbsSwipeUpHandler, // Set up a entire animation lifecycle callback to notify the current recents view when // the animation is canceled mGestureState.runOnceAtState(STATE_RECENTS_ANIMATION_CANCELED, () -> { - ThumbnailData snapshot = mGestureState.consumeRecentsAnimationCanceledSnapshot(); - if (snapshot != null) { - mRecentsView.switchToScreenshot(snapshot, () -> { + HashMap snapshots = + mGestureState.consumeRecentsAnimationCanceledSnapshot(); + if (snapshots != null) { + mRecentsView.switchToScreenshot(snapshots, () -> { if (mRecentsAnimationController != null) { mRecentsAnimationController.cleanupScreenshot(); } @@ -809,7 +811,7 @@ public abstract class AbsSwipeUpHandler, } @Override - public void onRecentsAnimationCanceled(ThumbnailData thumbnailData) { + public void onRecentsAnimationCanceled(HashMap thumbnailDatas) { ActiveGestureLog.INSTANCE.addLog("cancelRecentsAnimation"); mActivityInitListener.unregister(); mStateCallback.setStateOnUiThread(STATE_GESTURE_CANCELLED | STATE_HANDLER_INVALIDATED); diff --git a/quickstep/src/com/android/quickstep/BaseActivityInterface.java b/quickstep/src/com/android/quickstep/BaseActivityInterface.java index cf06036ffa..0be5e621ab 100644 --- a/quickstep/src/com/android/quickstep/BaseActivityInterface.java +++ b/quickstep/src/com/android/quickstep/BaseActivityInterface.java @@ -66,6 +66,7 @@ import com.android.quickstep.views.TaskView; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; +import java.util.HashMap; import java.util.function.Consumer; import java.util.function.Predicate; @@ -192,7 +193,8 @@ public abstract class BaseActivityInterface thumbnailDatas, + Runnable runnable) { ACTIVITY_TYPE activity = getCreatedActivity(); if (activity == null) { return; @@ -204,7 +206,7 @@ public abstract class BaseActivityInterface mPreviouslyAppearedTaskIds = new HashSet<>(); private int mLastStartedTaskId = -1; private RecentsAnimationController mRecentsAnimationController; - private ThumbnailData mRecentsAnimationCanceledSnapshot; + private HashMap mRecentsAnimationCanceledSnapshots; /** The time when the swipe up gesture is triggered. */ private long mSwipeUpStartTimeMs; @@ -354,16 +355,16 @@ public class GestureState implements RecentsAnimationCallbacks.RecentsAnimationL } @Override - public void onRecentsAnimationCanceled(ThumbnailData thumbnailData) { - mRecentsAnimationCanceledSnapshot = thumbnailData; + public void onRecentsAnimationCanceled(HashMap thumbnailDatas) { + mRecentsAnimationCanceledSnapshots = thumbnailDatas; mStateCallback.setState(STATE_RECENTS_ANIMATION_CANCELED); mStateCallback.setState(STATE_RECENTS_ANIMATION_ENDED); - if (mRecentsAnimationCanceledSnapshot != null) { + if (mRecentsAnimationCanceledSnapshots != null) { // Clean up the screenshot to finalize the recents animation cancel if (mRecentsAnimationController != null) { mRecentsAnimationController.cleanupScreenshot(); } - mRecentsAnimationCanceledSnapshot = null; + mRecentsAnimationCanceledSnapshots = null; } } @@ -378,9 +379,10 @@ public class GestureState implements RecentsAnimationCallbacks.RecentsAnimationL * while STATE_RECENTS_ANIMATION_CANCELED state is being set, and the caller is responsible for * calling {@link RecentsAnimationController#cleanupScreenshot()}. */ - ThumbnailData consumeRecentsAnimationCanceledSnapshot() { - ThumbnailData data = mRecentsAnimationCanceledSnapshot; - mRecentsAnimationCanceledSnapshot = null; + HashMap consumeRecentsAnimationCanceledSnapshot() { + HashMap data = + new HashMap(mRecentsAnimationCanceledSnapshots); + mRecentsAnimationCanceledSnapshots = null; return data; } diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java index b2324640e5..26d935d501 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -39,6 +39,7 @@ import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.InteractionJankMonitorWrapper; import java.util.ArrayList; +import java.util.HashMap; /** * Helper class to handle various atomic commands for switching between Overview. @@ -211,7 +212,7 @@ public class OverviewCommandHelper { } @Override - public void onRecentsAnimationCanceled(ThumbnailData thumbnailData) { + public void onRecentsAnimationCanceled(HashMap thumbnailDatas) { interactionHandler.onGestureCancelled(); cmd.removeListener(this); diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java b/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java index e9482219de..750985a3f8 100644 --- a/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java +++ b/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java @@ -32,6 +32,7 @@ import com.android.systemui.shared.system.RecentsAnimationControllerCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import java.util.Arrays; +import java.util.HashMap; import java.util.Set; /** @@ -125,10 +126,10 @@ public class RecentsAnimationCallbacks implements @BinderThread @Override - public final void onAnimationCanceled(ThumbnailData thumbnailData) { + public final void onAnimationCanceled(HashMap thumbnailDatas) { Utilities.postAsyncCallback(MAIN_EXECUTOR.getHandler(), () -> { for (RecentsAnimationListener listener : getListeners()) { - listener.onRecentsAnimationCanceled(thumbnailData); + listener.onRecentsAnimationCanceled(thumbnailDatas); } }); } @@ -166,7 +167,7 @@ public class RecentsAnimationCallbacks implements * Callback from the system when the recents animation is canceled. {@param thumbnailData} * is passed back for rendering screenshot to replace live tile. */ - default void onRecentsAnimationCanceled(ThumbnailData thumbnailData) {} + default void onRecentsAnimationCanceled(HashMap thumbnailDatas) {} /** * Callback made whenever the recents animation is finished. diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java index 4b8998115d..f310bb0040 100644 --- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java +++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java @@ -42,6 +42,8 @@ import com.android.systemui.shared.system.RemoteTransitionCompat; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.TaskStackChangeListeners; +import java.util.HashMap; + public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAnimationListener { public static final boolean ENABLE_SHELL_TRANSITIONS = SystemProperties.getBoolean("persist.debug.shell_transit", false); @@ -135,7 +137,7 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn } @Override - public void onRecentsAnimationCanceled(ThumbnailData thumbnailData) { + public void onRecentsAnimationCanceled(HashMap thumbnailDatas) { cleanUpRecentsAnimation(); } diff --git a/quickstep/src/com/android/quickstep/inputconsumers/DeviceLockedInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/DeviceLockedInputConsumer.java index fcc0217499..3d737ca0e4 100644 --- a/quickstep/src/com/android/quickstep/inputconsumers/DeviceLockedInputConsumer.java +++ b/quickstep/src/com/android/quickstep/inputconsumers/DeviceLockedInputConsumer.java @@ -60,6 +60,8 @@ import com.android.systemui.shared.system.InputMonitorCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams.Builder; +import java.util.HashMap; + /** * A placeholder input consumer used when the device is still locked, e.g. from secure camera. */ @@ -239,7 +241,7 @@ public class DeviceLockedInputConsumer implements InputConsumer, } @Override - public void onRecentsAnimationCanceled(ThumbnailData thumbnailData) { + public void onRecentsAnimationCanceled(HashMap thumbnailDatas) { mRecentsAnimationController = null; mTransformParams.setTargetSet(null); } diff --git a/quickstep/src/com/android/quickstep/inputconsumers/ProgressDelegateInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/ProgressDelegateInputConsumer.java index c69b510b43..033fd853b8 100644 --- a/quickstep/src/com/android/quickstep/inputconsumers/ProgressDelegateInputConsumer.java +++ b/quickstep/src/com/android/quickstep/inputconsumers/ProgressDelegateInputConsumer.java @@ -44,6 +44,8 @@ import com.android.quickstep.TaskAnimationManager; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.InputMonitorCompat; +import java.util.HashMap; + /** * Input consumer which delegates the swipe-progress handling */ @@ -174,7 +176,7 @@ public class ProgressDelegateInputConsumer implements InputConsumer, } @Override - public void onRecentsAnimationCanceled(ThumbnailData thumbnailData) { + public void onRecentsAnimationCanceled(HashMap thumbnailDatas) { mRecentsAnimationController = null; } diff --git a/quickstep/src/com/android/quickstep/views/GroupedTaskView.java b/quickstep/src/com/android/quickstep/views/GroupedTaskView.java index 72d3731a7f..357fb672c4 100644 --- a/quickstep/src/com/android/quickstep/views/GroupedTaskView.java +++ b/quickstep/src/com/android/quickstep/views/GroupedTaskView.java @@ -24,6 +24,7 @@ import com.android.quickstep.util.RecentsOrientedState; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.ThumbnailData; +import java.util.HashMap; import java.util.function.Consumer; /** @@ -161,6 +162,20 @@ public class GroupedTaskView extends TaskView { STAGE_POSITION_TOP_OR_LEFT, callback); } + @Override + void refreshThumbnails(HashMap thumbnailDatas) { + super.refreshThumbnails(thumbnailDatas); + if (mSecondaryTask != null && thumbnailDatas != null) { + final ThumbnailData thumbnailData = thumbnailDatas.get(mSecondaryTask.key.id); + if (thumbnailData != null) { + mSnapshotView2.setThumbnail(mSecondaryTask, thumbnailData); + return; + } + } + + mSnapshotView2.refresh(); + } + @Override public TaskThumbnailView[] getThumbnails() { return new TaskThumbnailView[]{mSnapshotView, mSnapshotView2}; diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 1a3bfa9958..91ef95eea4 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -179,6 +179,7 @@ import com.android.systemui.shared.system.TaskStackChangeListeners; import com.android.wm.shell.pip.IPipAnimationListener; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.function.Consumer; @@ -4738,15 +4739,12 @@ public abstract class RecentsView thumbnailDatas, + Runnable onFinishRunnable) { + final TaskView taskView = getRunningTaskView(); if (taskView != null) { taskView.setShowScreenshot(true); - if (thumbnailData != null) { - taskView.getThumbnail().setThumbnail(taskView.getTask(), thumbnailData); - } else { - taskView.getThumbnail().refresh(); - } + taskView.refreshThumbnails(thumbnailDatas); ViewUtils.postFrameDrawn(taskView, onFinishRunnable); } else { onFinishRunnable.run(); diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index eef5fb3433..0f7e8eaba7 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -61,6 +61,7 @@ import android.widget.Toast; import androidx.annotation.IntDef; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DeviceProfile; @@ -97,6 +98,7 @@ import com.android.quickstep.util.TaskCornerRadius; import com.android.quickstep.util.TransformParams; import com.android.quickstep.views.TaskThumbnailView.PreviewPositionHelper; import com.android.systemui.shared.recents.model.Task; +import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.ActivityOptionsCompat; import com.android.systemui.shared.system.QuickStepContract; @@ -105,6 +107,7 @@ import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import java.lang.annotation.Retention; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.function.Consumer; import java.util.stream.Stream; @@ -558,6 +561,18 @@ public class TaskView extends FrameLayout implements Reusable { return mSnapshotView; } + void refreshThumbnails(@Nullable HashMap thumbnailDatas) { + if (mTask != null && thumbnailDatas != null) { + final ThumbnailData thumbnailData = thumbnailDatas.get(mTask.key.id); + if (thumbnailData != null) { + mSnapshotView.setThumbnail(mTask, thumbnailData); + return; + } + } + + mSnapshotView.refresh(); + } + /** TODO(b/197033698) Remove all usages of above method and migrate to this one */ public TaskThumbnailView[] getThumbnails() { return new TaskThumbnailView[]{mSnapshotView};