Merge "Set calling user as intent extra to indicate intent resolver edge case" into rvc-dev am: c235831ae5 am: e12aa6fadb

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11689273

Change-Id: I136b52edcb7f23afe11ca8c45442e35a3e2db60e
This commit is contained in:
TreeHugger Robot
2020-06-03 19:59:06 +00:00
committed by Automerger Merge Worker
2 changed files with 22 additions and 21 deletions

View File

@@ -18,6 +18,7 @@ package com.android.internal.app;
import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY;
import static com.android.internal.app.ResolverActivity.EXTRA_CALLING_USER;
import static com.android.internal.app.ResolverActivity.EXTRA_SELECTED_PROFILE;
import android.annotation.Nullable;
@@ -246,6 +247,7 @@ public class IntentForwarderActivity extends Activity {
int selectedProfile = findSelectedProfile(className);
sanitizeIntent(intentReceived);
intentReceived.putExtra(EXTRA_SELECTED_PROFILE, selectedProfile);
intentReceived.putExtra(EXTRA_CALLING_USER, UserHandle.of(callingUserId));
startActivityAsCaller(intentReceived, null, null, false, userId);
finish();
}

View File

@@ -184,6 +184,18 @@ public class ResolverActivity extends Activity implements
static final String EXTRA_SELECTED_PROFILE =
"com.android.internal.app.ResolverActivity.EXTRA_SELECTED_PROFILE";
/**
* {@link UserHandle} extra to indicate the user of the user that the starting intent
* originated from.
* <p>This is not necessarily the same as {@link #getUserId()} or {@link UserHandle#myUserId()},
* as there are edge cases when the intent resolver is launched in the other profile.
* For example, when we have 0 resolved apps in current profile and multiple resolved
* apps in the other profile, opening a link from the current profile launches the intent
* resolver in the other one. b/148536209 for more info.
*/
static final String EXTRA_CALLING_USER =
"com.android.internal.app.ResolverActivity.EXTRA_CALLING_USER";
static final int PROFILE_PERSONAL = AbstractMultiProfilePagerAdapter.PROFILE_PERSONAL;
static final int PROFILE_WORK = AbstractMultiProfilePagerAdapter.PROFILE_WORK;
@@ -470,17 +482,20 @@ public class ResolverActivity extends Activity implements
// the intent resolver is started in the other profile. Since this is the only case when
// this happens, we check for it here and set the current profile's tab.
int selectedProfile = getCurrentProfile();
UserHandle intentUser = UserHandle.of(getLaunchingUserId());
UserHandle intentUser = getIntent().hasExtra(EXTRA_CALLING_USER)
? getIntent().getParcelableExtra(EXTRA_CALLING_USER)
: getUser();
if (!getUser().equals(intentUser)) {
if (getPersonalProfileUserHandle().equals(intentUser)) {
selectedProfile = PROFILE_PERSONAL;
} else if (getWorkProfileUserHandle().equals(intentUser)) {
selectedProfile = PROFILE_WORK;
}
}
int selectedProfileExtra = getSelectedProfileExtra();
if (selectedProfileExtra != -1) {
selectedProfile = selectedProfileExtra;
} else {
int selectedProfileExtra = getSelectedProfileExtra();
if (selectedProfileExtra != -1) {
selectedProfile = selectedProfileExtra;
}
}
// We only show the default app for the profile of the current user. The filterLastUsed
// flag determines whether to show a default app and that app is not shown in the
@@ -535,22 +550,6 @@ public class ResolverActivity extends Activity implements
return selectedProfile;
}
/**
* Returns the user id of the user that the starting intent originated from.
* <p>This is not necessarily equal to {@link #getUserId()} or {@link UserHandle#myUserId()},
* as there are edge cases when the intent resolver is launched in the other profile.
* For example, when we have 0 resolved apps in current profile and multiple resolved apps
* in the other profile, opening a link from the current profile launches the intent resolver
* in the other one. b/148536209 for more info.
*/
private int getLaunchingUserId() {
int contentUserHint = getIntent().getContentUserHint();
if (contentUserHint == UserHandle.USER_CURRENT) {
return UserHandle.myUserId();
}
return contentUserHint;
}
protected @Profile int getCurrentProfile() {
return (UserHandle.myUserId() == UserHandle.USER_SYSTEM ? PROFILE_PERSONAL : PROFILE_WORK);
}