Launch split task with correct UserHandle
PendingIntent#getActivity gets the owner UserHandle from the app
context. That makes the activity launch fail since the app only exists
in the work profile environment(secondary user).
This CL gets the correct Userhandle from Launcher and use
PendingIntent#getActivityAsUser to launch split task.
Bug: 242039471
Test: Launch Google chat by shortcut to enter split (work-profile)
Change-Id: Ie1db8a858bf9cee700cb3ff3a9e607a5d1dbad30
diff --git a/quickstep/src/com/android/launcher3/popup/QuickstepSystemShortcut.java b/quickstep/src/com/android/launcher3/popup/QuickstepSystemShortcut.java
index 4e59790..89c07f2 100644
--- a/quickstep/src/com/android/launcher3/popup/QuickstepSystemShortcut.java
+++ b/quickstep/src/com/android/launcher3/popup/QuickstepSystemShortcut.java
@@ -19,6 +19,7 @@
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
import android.util.Log;
import android.view.View;
@@ -71,7 +72,7 @@
RecentsView recentsView = mTarget.getOverviewPanel();
recentsView.initiateSplitSelect(
new SplitSelectSource(mOriginalView, new BitmapDrawable(bitmap), intent,
- mPosition));
+ mPosition, mItemInfo.user));
}
}
@@ -81,13 +82,15 @@
public final Drawable drawable;
public final Intent intent;
public final SplitPositionOption position;
+ public final UserHandle user;
public SplitSelectSource(View view, Drawable drawable, Intent intent,
- SplitPositionOption position) {
+ SplitPositionOption position, UserHandle user) {
this.view = view;
this.drawable = drawable;
this.intent = intent;
this.position = position;
+ this.user = user;
}
}
}
diff --git a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
index 0ca5574..8f32214 100644
--- a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
+++ b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
@@ -33,6 +33,7 @@
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
+import android.os.UserHandle;
import android.text.TextUtils;
import android.view.RemoteAnimationAdapter;
import android.view.SurfaceControl;
@@ -77,6 +78,8 @@
private int mSecondTaskId = INVALID_TASK_ID;
private String mSecondTaskPackageName;
private boolean mRecentsAnimationRunning;
+ @Nullable
+ private UserHandle mUser;
/** If not null, this is the TaskView we want to launch from */
@Nullable
private GroupedTaskView mLaunchingTaskView;
@@ -97,12 +100,15 @@
mInitialTaskId = taskId;
mStagePosition = stagePosition;
mInitialTaskIntent = null;
+ mUser = null;
}
- public void setInitialTaskSelect(Intent intent, @StagePosition int stagePosition) {
+ public void setInitialTaskSelect(Intent intent, @StagePosition int stagePosition,
+ @Nullable UserHandle user) {
mInitialTaskIntent = intent;
mStagePosition = stagePosition;
mInitialTaskId = INVALID_TASK_ID;
+ mUser = user;
}
/**
@@ -120,9 +126,12 @@
} else {
fillInIntent = null;
}
- final PendingIntent pendingIntent =
- mInitialTaskIntent == null ? null : PendingIntent.getActivity(mContext, 0,
- mInitialTaskIntent, FLAG_MUTABLE);
+
+ final PendingIntent pendingIntent = mInitialTaskIntent == null ? null : (mUser != null
+ ? PendingIntent.getActivityAsUser(mContext, 0, mInitialTaskIntent,
+ FLAG_MUTABLE, null /* options */, mUser)
+ : PendingIntent.getActivity(mContext, 0, mInitialTaskIntent, FLAG_MUTABLE));
+
launchTasks(mInitialTaskId, pendingIntent, fillInIntent, mSecondTaskId, mStagePosition,
callback, false /* freezeTaskList */, DEFAULT_SPLIT_RATIO);
}
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index a153f26..3bf044d 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -4161,7 +4161,7 @@
public void initiateSplitSelect(QuickstepSystemShortcut.SplitSelectSource splitSelectSource) {
mSplitSelectSource = splitSelectSource;
mSplitSelectStateController.setInitialTaskSelect(splitSelectSource.intent,
- splitSelectSource.position.stagePosition);
+ splitSelectSource.position.stagePosition, splitSelectSource.user);
}
public PendingAnimation createSplitSelectInitAnimation(int duration) {