Accept snapshot list when cancelling recents animation

Bug: 200813008
Test: enter overview after activated split screen, observed task
      thumbnails showing with correct bounds after roation.
Change-Id: Ifea17d2c685d16db111c4fab88e131595254b9a5
This commit is contained in:
Jerry Chang
2021-11-04 20:19:34 +08:00
parent 97d749833c
commit 331f46fab3
12 changed files with 72 additions and 29 deletions

View File

@@ -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<Integer, ThumbnailData> thumbnailDatas) {
endGestureStateOverride(true);
}

View File

@@ -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<T extends StatefulActivity<S>,
// 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<Integer, ThumbnailData> snapshots =
mGestureState.consumeRecentsAnimationCanceledSnapshot();
if (snapshots != null) {
mRecentsView.switchToScreenshot(snapshots, () -> {
if (mRecentsAnimationController != null) {
mRecentsAnimationController.cleanupScreenshot();
}
@@ -809,7 +811,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
}
@Override
public void onRecentsAnimationCanceled(ThumbnailData thumbnailData) {
public void onRecentsAnimationCanceled(HashMap<Integer, ThumbnailData> thumbnailDatas) {
ActiveGestureLog.INSTANCE.addLog("cancelRecentsAnimation");
mActivityInitListener.unregister();
mStateCallback.setStateOnUiThread(STATE_GESTURE_CANCELLED | STATE_HANDLER_INVALIDATED);

View File

@@ -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<STATE_TYPE extends BaseState<STATE_T
public void closeOverlay() { }
public void switchRunningTaskViewToScreenshot(ThumbnailData thumbnailData, Runnable runnable) {
public void switchRunningTaskViewToScreenshot(HashMap<Integer, ThumbnailData> thumbnailDatas,
Runnable runnable) {
ACTIVITY_TYPE activity = getCreatedActivity();
if (activity == null) {
return;
@@ -204,7 +206,7 @@ public abstract class BaseActivityInterface<STATE_TYPE extends BaseState<STATE_T
}
return;
}
recentsView.switchToScreenshot(thumbnailData, runnable);
recentsView.switchToScreenshot(thumbnailDatas, runnable);
}
/**

View File

@@ -35,6 +35,7 @@ import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
@@ -139,7 +140,7 @@ public class GestureState implements RecentsAnimationCallbacks.RecentsAnimationL
private Set<Integer> mPreviouslyAppearedTaskIds = new HashSet<>();
private int mLastStartedTaskId = -1;
private RecentsAnimationController mRecentsAnimationController;
private ThumbnailData mRecentsAnimationCanceledSnapshot;
private HashMap<Integer, ThumbnailData> 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<Integer, ThumbnailData> 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<Integer, ThumbnailData> consumeRecentsAnimationCanceledSnapshot() {
HashMap<Integer, ThumbnailData> data =
new HashMap<Integer, ThumbnailData>(mRecentsAnimationCanceledSnapshots);
mRecentsAnimationCanceledSnapshots = null;
return data;
}

View File

@@ -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<Integer, ThumbnailData> thumbnailDatas) {
interactionHandler.onGestureCancelled();
cmd.removeListener(this);

View File

@@ -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<Integer, ThumbnailData> 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<Integer, ThumbnailData> thumbnailDatas) {}
/**
* Callback made whenever the recents animation is finished.

View File

@@ -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<Integer, ThumbnailData> thumbnailDatas) {
cleanUpRecentsAnimation();
}

View File

@@ -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<Integer, ThumbnailData> thumbnailDatas) {
mRecentsAnimationController = null;
mTransformParams.setTargetSet(null);
}

View File

@@ -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<Integer, ThumbnailData> thumbnailDatas) {
mRecentsAnimationController = null;
}

View File

@@ -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<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
public TaskThumbnailView[] getThumbnails() {
return new TaskThumbnailView[]{mSnapshotView, mSnapshotView2};

View File

@@ -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<ACTIVITY_TYPE extends StatefulActivity<STATE_T
* 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
*/
public void switchToScreenshot(ThumbnailData thumbnailData, Runnable onFinishRunnable) {
TaskView taskView = getRunningTaskView();
public void switchToScreenshot(@Nullable HashMap<Integer, ThumbnailData> 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();

View File

@@ -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<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 */
public TaskThumbnailView[] getThumbnails() {
return new TaskThumbnailView[]{mSnapshotView};