mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-20 11:18:21 +00:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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};
|
||||
|
||||
Reference in New Issue
Block a user