Add fallback for missing remote animation callbacks

- In some cases WM won't callback the remote animation callbacks (neither
  start nor cancel) and Launcher never finishes executing the pending
  command (preventing the subsequent commands from running).  For the time
  being, just cancel the current state to allow the commands to be
  processed.

Bug: 194011186
Test: Mash on overview and home buttons with a 3p launcher

Signed-off-by: Winson Chung <winsonc@google.com>
Change-Id: I1b1296fab316b979f441ebb474d1475e3fa68f95
Merged-In: I1b1296fab316b979f441ebb474d1475e3fa68f95
This commit is contained in:
Winson Chung
2022-01-21 06:17:10 +00:00
parent a84f86f254
commit bb530e9058
3 changed files with 31 additions and 0 deletions

View File

@@ -38,6 +38,7 @@ import com.android.quickstep.views.TaskView;
import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.system.InteractionJankMonitorWrapper;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
@@ -271,6 +272,14 @@ public class OverviewCommandHelper {
scheduleNextTask(cmd);
}
public void dump(PrintWriter pw) {
pw.println("OverviewCommandHelper:");
pw.println(" mPendingCommands=" + mPendingCommands.size());
if (!mPendingCommands.isEmpty()) {
pw.println(" pendingCommandType=" + mPendingCommands.get(0).type);
}
}
private static class CommandInfo {
public final long createTime = SystemClock.elapsedRealtime();
public final int type;

View File

@@ -99,6 +99,7 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
private Handler mUiHandler = new Handler(Looper.getMainLooper());
private static final long HOME_APPEAR_DURATION = 250;
private static final long RECENTS_ANIMATION_TIMEOUT = 1000;
private RecentsDragLayer mDragLayer;
private ScrimView mScrimView;
@@ -115,6 +116,11 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
// Strong refs to runners which are cleared when the activity is destroyed
private RemoteAnimationFactory mActivityLaunchAnimationRunner;
// For handling degenerate cases where starting an activity doesn't actually trigger the remote
// animation callback
private final Handler mHandler = new Handler();
private final Runnable mAnimationStartTimeoutRunnable = this::onAnimationStartTimeout;
/**
* Init drag layer and overview panel views.
*/
@@ -219,6 +225,16 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
// TODO(b/137318995) This should go home, but doing so removes freeform windows
}
/**
* Called if the remote animation callback from #getActivityLaunchOptions() hasn't called back
* in a reasonable time due to a conflict with the recents animation.
*/
private void onAnimationStartTimeout() {
if (mActivityLaunchAnimationRunner != null) {
mActivityLaunchAnimationRunner.onAnimationCancelled();
}
}
@Override
public ActivityOptionsWrapper getActivityLaunchOptions(final View v, @Nullable ItemInfo item) {
if (!(v instanceof TaskView)) {
@@ -233,6 +249,7 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
public void onCreateAnimation(int transit, RemoteAnimationTargetCompat[] appTargets,
RemoteAnimationTargetCompat[] wallpaperTargets,
RemoteAnimationTargetCompat[] nonAppTargets, AnimationResult result) {
mHandler.removeCallbacks(mAnimationStartTimeoutRunnable);
AnimatorSet anim = composeRecentsLaunchAnimator(taskView, appTargets,
wallpaperTargets, nonAppTargets);
anim.addListener(resetStateListener());
@@ -242,6 +259,7 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
@Override
public void onAnimationCancelled() {
mHandler.removeCallbacks(mAnimationStartTimeoutRunnable);
onEndCallback.executeAllAndDestroy();
}
};
@@ -256,6 +274,7 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
ActivityOptionsCompat.makeRemoteAnimation(adapterCompat),
onEndCallback);
activityOptions.options.setSplashscreenStyle(SplashScreen.SPLASH_SCREEN_STYLE_ICON);
mHandler.postDelayed(mAnimationStartTimeoutRunnable, RECENTS_ANIMATION_TIMEOUT);
return activityOptions;
}

View File

@@ -967,6 +967,9 @@ public class TouchInteractionService extends Service
if (mOverviewComponentObserver != null) {
mOverviewComponentObserver.dump(pw);
}
if (mOverviewCommandHelper != null) {
mOverviewCommandHelper.dump(pw);
}
if (mGestureState != null) {
mGestureState.dump(pw);
}