From 9f27fa3687f6189a54f63fd980ea0dc42c70a468 Mon Sep 17 00:00:00 2001 From: Jeff Chang Date: Thu, 18 Aug 2022 20:51:33 +0800 Subject: [PATCH] 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 --- .../popup/QuickstepSystemShortcut.java | 7 +++++-- .../util/SplitSelectStateController.java | 17 +++++++++++++---- .../android/quickstep/views/RecentsView.java | 2 +- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/quickstep/src/com/android/launcher3/popup/QuickstepSystemShortcut.java b/quickstep/src/com/android/launcher3/popup/QuickstepSystemShortcut.java index 4e59790771..89c07f234b 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.content.Intent; 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 @@ public interface QuickstepSystemShortcut { RecentsView recentsView = mTarget.getOverviewPanel(); recentsView.initiateSplitSelect( new SplitSelectSource(mOriginalView, new BitmapDrawable(bitmap), intent, - mPosition)); + mPosition, mItemInfo.user)); } } @@ -81,13 +82,15 @@ public interface QuickstepSystemShortcut { 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 0ca557443f..8f322140b8 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.Context; 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 @@ public class SplitSelectStateController { 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 @@ public class SplitSelectStateController { 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 @@ public class SplitSelectStateController { } 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 a153f2676e..3bf044da7e 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -4161,7 +4161,7 @@ public abstract class RecentsView