Merge "Accept snapshot list when cancelling recents animation" into sc-v2-dev

This commit is contained in:
Jerry Chang
2021-11-08 10:22:34 +00:00
committed by Android (Google) Code Review
12 changed files with 72 additions and 29 deletions
@@ -63,6 +63,7 @@ import com.android.quickstep.views.RecentsView;
import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.recents.model.ThumbnailData;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.Set; import java.util.Set;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.stream.Stream; import java.util.stream.Stream;
@@ -459,7 +460,7 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
} }
@Override @Override
public void onRecentsAnimationCanceled(ThumbnailData thumbnailData) { public void onRecentsAnimationCanceled(HashMap<Integer, ThumbnailData> thumbnailDatas) {
endGestureStateOverride(true); endGestureStateOverride(true);
} }
@@ -121,6 +121,7 @@ import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.shared.system.TaskStackChangeListeners; import com.android.systemui.shared.system.TaskStackChangeListeners;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.function.Consumer; import java.util.function.Consumer;
/** /**
@@ -399,9 +400,10 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
// Set up a entire animation lifecycle callback to notify the current recents view when // Set up a entire animation lifecycle callback to notify the current recents view when
// the animation is canceled // the animation is canceled
mGestureState.runOnceAtState(STATE_RECENTS_ANIMATION_CANCELED, () -> { mGestureState.runOnceAtState(STATE_RECENTS_ANIMATION_CANCELED, () -> {
ThumbnailData snapshot = mGestureState.consumeRecentsAnimationCanceledSnapshot(); HashMap<Integer, ThumbnailData> snapshots =
if (snapshot != null) { mGestureState.consumeRecentsAnimationCanceledSnapshot();
mRecentsView.switchToScreenshot(snapshot, () -> { if (snapshots != null) {
mRecentsView.switchToScreenshot(snapshots, () -> {
if (mRecentsAnimationController != null) { if (mRecentsAnimationController != null) {
mRecentsAnimationController.cleanupScreenshot(); mRecentsAnimationController.cleanupScreenshot();
} }
@@ -809,7 +811,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
} }
@Override @Override
public void onRecentsAnimationCanceled(ThumbnailData thumbnailData) { public void onRecentsAnimationCanceled(HashMap<Integer, ThumbnailData> thumbnailDatas) {
ActiveGestureLog.INSTANCE.addLog("cancelRecentsAnimation"); ActiveGestureLog.INSTANCE.addLog("cancelRecentsAnimation");
mActivityInitListener.unregister(); mActivityInitListener.unregister();
mStateCallback.setStateOnUiThread(STATE_GESTURE_CANCELLED | STATE_HANDLER_INVALIDATED); mStateCallback.setStateOnUiThread(STATE_GESTURE_CANCELLED | STATE_HANDLER_INVALIDATED);
@@ -66,6 +66,7 @@ import com.android.quickstep.views.TaskView;
import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import java.util.HashMap;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Predicate; import java.util.function.Predicate;
@@ -192,7 +193,8 @@ public abstract class BaseActivityInterface<STATE_TYPE extends BaseState<STATE_T
public void closeOverlay() { } public void closeOverlay() { }
public void switchRunningTaskViewToScreenshot(ThumbnailData thumbnailData, Runnable runnable) { public void switchRunningTaskViewToScreenshot(HashMap<Integer, ThumbnailData> thumbnailDatas,
Runnable runnable) {
ACTIVITY_TYPE activity = getCreatedActivity(); ACTIVITY_TYPE activity = getCreatedActivity();
if (activity == null) { if (activity == null) {
return; return;
@@ -204,7 +206,7 @@ public abstract class BaseActivityInterface<STATE_TYPE extends BaseState<STATE_T
} }
return; return;
} }
recentsView.switchToScreenshot(thumbnailData, runnable); recentsView.switchToScreenshot(thumbnailDatas, runnable);
} }
/** /**
@@ -35,6 +35,7 @@ import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
@@ -139,7 +140,7 @@ public class GestureState implements RecentsAnimationCallbacks.RecentsAnimationL
private Set<Integer> mPreviouslyAppearedTaskIds = new HashSet<>(); private Set<Integer> mPreviouslyAppearedTaskIds = new HashSet<>();
private int mLastStartedTaskId = -1; private int mLastStartedTaskId = -1;
private RecentsAnimationController mRecentsAnimationController; private RecentsAnimationController mRecentsAnimationController;
private ThumbnailData mRecentsAnimationCanceledSnapshot; private HashMap<Integer, ThumbnailData> mRecentsAnimationCanceledSnapshots;
/** The time when the swipe up gesture is triggered. */ /** The time when the swipe up gesture is triggered. */
private long mSwipeUpStartTimeMs; private long mSwipeUpStartTimeMs;
@@ -354,16 +355,16 @@ public class GestureState implements RecentsAnimationCallbacks.RecentsAnimationL
} }
@Override @Override
public void onRecentsAnimationCanceled(ThumbnailData thumbnailData) { public void onRecentsAnimationCanceled(HashMap<Integer, ThumbnailData> thumbnailDatas) {
mRecentsAnimationCanceledSnapshot = thumbnailData; mRecentsAnimationCanceledSnapshots = thumbnailDatas;
mStateCallback.setState(STATE_RECENTS_ANIMATION_CANCELED); mStateCallback.setState(STATE_RECENTS_ANIMATION_CANCELED);
mStateCallback.setState(STATE_RECENTS_ANIMATION_ENDED); mStateCallback.setState(STATE_RECENTS_ANIMATION_ENDED);
if (mRecentsAnimationCanceledSnapshot != null) { if (mRecentsAnimationCanceledSnapshots != null) {
// Clean up the screenshot to finalize the recents animation cancel // Clean up the screenshot to finalize the recents animation cancel
if (mRecentsAnimationController != null) { if (mRecentsAnimationController != null) {
mRecentsAnimationController.cleanupScreenshot(); 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 * while STATE_RECENTS_ANIMATION_CANCELED state is being set, and the caller is responsible for
* calling {@link RecentsAnimationController#cleanupScreenshot()}. * calling {@link RecentsAnimationController#cleanupScreenshot()}.
*/ */
ThumbnailData consumeRecentsAnimationCanceledSnapshot() { HashMap<Integer, ThumbnailData> consumeRecentsAnimationCanceledSnapshot() {
ThumbnailData data = mRecentsAnimationCanceledSnapshot; HashMap<Integer, ThumbnailData> data =
mRecentsAnimationCanceledSnapshot = null; new HashMap<Integer, ThumbnailData>(mRecentsAnimationCanceledSnapshots);
mRecentsAnimationCanceledSnapshots = null;
return data; return data;
} }
@@ -39,6 +39,7 @@ import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.system.InteractionJankMonitorWrapper; import com.android.systemui.shared.system.InteractionJankMonitorWrapper;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
/** /**
* Helper class to handle various atomic commands for switching between Overview. * Helper class to handle various atomic commands for switching between Overview.
@@ -211,7 +212,7 @@ public class OverviewCommandHelper {
} }
@Override @Override
public void onRecentsAnimationCanceled(ThumbnailData thumbnailData) { public void onRecentsAnimationCanceled(HashMap<Integer, ThumbnailData> thumbnailDatas) {
interactionHandler.onGestureCancelled(); interactionHandler.onGestureCancelled();
cmd.removeListener(this); cmd.removeListener(this);
@@ -32,6 +32,7 @@ import com.android.systemui.shared.system.RecentsAnimationControllerCompat;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.Set; import java.util.Set;
/** /**
@@ -125,10 +126,10 @@ public class RecentsAnimationCallbacks implements
@BinderThread @BinderThread
@Override @Override
public final void onAnimationCanceled(ThumbnailData thumbnailData) { public final void onAnimationCanceled(HashMap<Integer, ThumbnailData> thumbnailDatas) {
Utilities.postAsyncCallback(MAIN_EXECUTOR.getHandler(), () -> { Utilities.postAsyncCallback(MAIN_EXECUTOR.getHandler(), () -> {
for (RecentsAnimationListener listener : getListeners()) { 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} * Callback from the system when the recents animation is canceled. {@param thumbnailData}
* is passed back for rendering screenshot to replace live tile. * is passed back for rendering screenshot to replace live tile.
*/ */
default void onRecentsAnimationCanceled(ThumbnailData thumbnailData) {} default void onRecentsAnimationCanceled(HashMap<Integer, ThumbnailData> thumbnailDatas) {}
/** /**
* Callback made whenever the recents animation is finished. * Callback made whenever the recents animation is finished.
@@ -42,6 +42,8 @@ import com.android.systemui.shared.system.RemoteTransitionCompat;
import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.shared.system.TaskStackChangeListeners; import com.android.systemui.shared.system.TaskStackChangeListeners;
import java.util.HashMap;
public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAnimationListener { public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAnimationListener {
public static final boolean ENABLE_SHELL_TRANSITIONS = public static final boolean ENABLE_SHELL_TRANSITIONS =
SystemProperties.getBoolean("persist.debug.shell_transit", false); SystemProperties.getBoolean("persist.debug.shell_transit", false);
@@ -135,7 +137,7 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn
} }
@Override @Override
public void onRecentsAnimationCanceled(ThumbnailData thumbnailData) { public void onRecentsAnimationCanceled(HashMap<Integer, ThumbnailData> thumbnailDatas) {
cleanUpRecentsAnimation(); cleanUpRecentsAnimation();
} }
@@ -60,6 +60,8 @@ import com.android.systemui.shared.system.InputMonitorCompat;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams.Builder; 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. * 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 @Override
public void onRecentsAnimationCanceled(ThumbnailData thumbnailData) { public void onRecentsAnimationCanceled(HashMap<Integer, ThumbnailData> thumbnailDatas) {
mRecentsAnimationController = null; mRecentsAnimationController = null;
mTransformParams.setTargetSet(null); mTransformParams.setTargetSet(null);
} }
@@ -44,6 +44,8 @@ import com.android.quickstep.TaskAnimationManager;
import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.system.InputMonitorCompat; import com.android.systemui.shared.system.InputMonitorCompat;
import java.util.HashMap;
/** /**
* Input consumer which delegates the swipe-progress handling * Input consumer which delegates the swipe-progress handling
*/ */
@@ -174,7 +176,7 @@ public class ProgressDelegateInputConsumer implements InputConsumer,
} }
@Override @Override
public void onRecentsAnimationCanceled(ThumbnailData thumbnailData) { public void onRecentsAnimationCanceled(HashMap<Integer, ThumbnailData> thumbnailDatas) {
mRecentsAnimationController = null; mRecentsAnimationController = null;
} }
@@ -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.Task;
import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.recents.model.ThumbnailData;
import java.util.HashMap;
import java.util.function.Consumer; import java.util.function.Consumer;
/** /**
@@ -161,6 +162,20 @@ public class GroupedTaskView extends TaskView {
STAGE_POSITION_TOP_OR_LEFT, callback); STAGE_POSITION_TOP_OR_LEFT, callback);
} }
@Override
void refreshThumbnails(HashMap<Integer, ThumbnailData> 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 @Override
public TaskThumbnailView[] getThumbnails() { public TaskThumbnailView[] getThumbnails() {
return new TaskThumbnailView[]{mSnapshotView, mSnapshotView2}; return new TaskThumbnailView[]{mSnapshotView, mSnapshotView2};
@@ -180,6 +180,7 @@ import com.android.systemui.shared.system.TaskStackChangeListeners;
import com.android.wm.shell.pip.IPipAnimationListener; import com.android.wm.shell.pip.IPipAnimationListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
@@ -4748,15 +4749,12 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
* from gesture state, which is a larger change of it having to keep track of multiple tasks. * from gesture state, which is a larger change of it having to keep track of multiple tasks.
* OR. Maybe it doesn't need to pass in a thumbnail and we can use the exact same flow as above * OR. Maybe it doesn't need to pass in a thumbnail and we can use the exact same flow as above
*/ */
public void switchToScreenshot(ThumbnailData thumbnailData, Runnable onFinishRunnable) { public void switchToScreenshot(@Nullable HashMap<Integer, ThumbnailData> thumbnailDatas,
TaskView taskView = getRunningTaskView(); Runnable onFinishRunnable) {
final TaskView taskView = getRunningTaskView();
if (taskView != null) { if (taskView != null) {
taskView.setShowScreenshot(true); taskView.setShowScreenshot(true);
if (thumbnailData != null) { taskView.refreshThumbnails(thumbnailDatas);
taskView.getThumbnail().setThumbnail(taskView.getTask(), thumbnailData);
} else {
taskView.getThumbnail().refresh();
}
ViewUtils.postFrameDrawn(taskView, onFinishRunnable); ViewUtils.postFrameDrawn(taskView, onFinishRunnable);
} else { } else {
onFinishRunnable.run(); onFinishRunnable.run();
@@ -61,6 +61,7 @@ import android.widget.Toast;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.AbstractFloatingView;
import com.android.launcher3.DeviceProfile; import com.android.launcher3.DeviceProfile;
@@ -98,6 +99,7 @@ import com.android.quickstep.util.TaskViewSimulator;
import com.android.quickstep.util.TransformParams; import com.android.quickstep.util.TransformParams;
import com.android.quickstep.views.TaskThumbnailView.PreviewPositionHelper; import com.android.quickstep.views.TaskThumbnailView.PreviewPositionHelper;
import com.android.systemui.shared.recents.model.Task; 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.ActivityManagerWrapper;
import com.android.systemui.shared.system.ActivityOptionsCompat; import com.android.systemui.shared.system.ActivityOptionsCompat;
import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.QuickStepContract;
@@ -106,6 +108,7 @@ import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.stream.Stream; import java.util.stream.Stream;
@@ -559,6 +562,18 @@ public class TaskView extends FrameLayout implements Reusable {
return mSnapshotView; return mSnapshotView;
} }
void refreshThumbnails(@Nullable HashMap<Integer, ThumbnailData> 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 */ /** TODO(b/197033698) Remove all usages of above method and migrate to this one */
public TaskThumbnailView[] getThumbnails() { public TaskThumbnailView[] getThumbnails() {
return new TaskThumbnailView[]{mSnapshotView}; return new TaskThumbnailView[]{mSnapshotView};