From 8959d0b1398e4dcc94762ae717293c241fb3c064 Mon Sep 17 00:00:00 2001 From: Jerry Chang Date: Mon, 20 Dec 2021 11:09:56 +0000 Subject: [PATCH] Fix back to split pair from overview with shell-transition hang. Prevent it throws index out of bounds exception when entering split pair from overview panel. And make sure to update split screen state properly when enter split transition got merged to other transition. Fix: 210852531 Bug: 206487881 Test: Trigger split screen, swipe up to overview, verified it won't hang when select split pair from overview panel. Change-Id: Ifc5c224b7185224b811e6e2e7fa5d798c99bc6b1 --- .../shell/splitscreen/StageCoordinator.java | 21 +++++++++++++++++++ .../shared/system/RemoteTransitionCompat.java | 6 +----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 2385ec90ab232..c87f0bcb469c8 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -1207,6 +1207,27 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, return out; } + @Override + public void onTransitionMerged(@NonNull IBinder transition) { + // Once the pending enter transition got merged, make sure to bring divider bar visible and + // clear the pending transition from cache to prevent mess-up the following state. + if (transition == mSplitTransitions.mPendingEnter) { + mSplitLayout.init(); + setDividerVisibility(true, null /* transaction */); + setSplitsVisible(true); + mShouldUpdateRecents = true; + updateRecentTasksSplitPair(); + + if (!mLogger.hasStartedSession()) { + mLogger.logEnter(mSplitLayout.getDividerPositionAsFraction(), + getMainStagePosition(), mMainStage.getTopChildTaskUid(), + getSideStagePosition(), mSideStage.getTopChildTaskUid(), + mSplitLayout.isLandscape()); + } + mSplitTransitions.mPendingEnter = null; + } + } + @Override public boolean startAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info, diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java index 3cd090e3e0144..2d5080eaaa221 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java @@ -246,10 +246,6 @@ public class RemoteTransitionCompat implements Parcelable { if (mPausingTasks.contains(openingTasks.get(i).getContainer())) { ++pauseMatches; } - if (openingTasks.get(i).getContainer().equals(mPausingTasks.get(i))) { - // In this case, we are "returning" to an already running app, so just consume - // the merge and do nothing. - } } if (pauseMatches > 0) { if (pauseMatches != mPausingTasks.size()) { @@ -275,9 +271,9 @@ public class RemoteTransitionCompat implements Parcelable { t.reparent(target.leash.mSurfaceControl, mInfo.getRootLeash()); t.setLayer(target.leash.mSurfaceControl, layer); t.hide(target.leash.mSurfaceControl); - t.apply(); targets[i] = target; } + t.apply(); recents.onTasksAppeared(targets); return true; }