Handle race between creating and assigning RemoteTargetHandles
* Getting a callback from shell to inform when task is in split
and when it's been removed is asynchronous, and not
coordinated with launcher's swipe up gesture.
* There's a chance that user can quickswitch to single app
and start swipe up before shell could notify
LauncherSplitScreenListener, which would cause mismatched state.
Bug: 199658495
Change-Id: I722eeb26d83e99b2a2f77748984d0d7c390b5fec
diff --git a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
index dc04016..7ef4d19 100644
--- a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
+++ b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
@@ -16,9 +16,8 @@
package com.android.quickstep;
-import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
-
import android.content.Context;
+import android.util.Log;
import androidx.annotation.Nullable;
@@ -34,7 +33,9 @@
* {@link TaskViewSimulator}
*/
public class RemoteTargetGluer {
- private final RemoteTargetHandle[] mRemoteTargetHandles;
+ private static final String TAG = "RemoteTargetGluer";
+
+ private RemoteTargetHandle[] mRemoteTargetHandles;
private SplitConfigurationOptions.StagedSplitBounds mStagedSplitBounds;
/**
@@ -93,6 +94,13 @@
public RemoteTargetHandle[] assignTargetsForSplitScreen(RemoteAnimationTargets targets) {
int[] splitIds = LauncherSplitScreenListener.INSTANCE.getNoCreate()
.getRunningSplitTaskIds();
+ if (splitIds.length == 0 && mRemoteTargetHandles.length > 1) {
+ // There's a chance that between the creation of this class and assigning targets,
+ // LauncherSplitScreenListener may have received callback that removes split
+ mRemoteTargetHandles = new RemoteTargetHandle[]{mRemoteTargetHandles[0]};
+ Log.w(TAG, "splitTaskIds changed between creation and assignment");
+ }
+
RemoteAnimationTargetCompat primaryTaskTarget;
RemoteAnimationTargetCompat secondaryTaskTarget;
if (mRemoteTargetHandles.length == 1) {