Merge "Start sharesheet in the same profile instead of switching to other profile." into rvc-dev am: 1f6f9a6c75

Change-Id: I43891e09a2bdd5fef640bfe97e2678213d6f78ab
This commit is contained in:
TreeHugger Robot
2020-04-14 13:25:16 +00:00
committed by Automerger Merge Worker
3 changed files with 86 additions and 22 deletions

View File

@@ -169,6 +169,17 @@ public class ChooserActivity extends ResolverActivity implements
public static final String EXTRA_PRIVATE_RETAIN_IN_ON_STOP public static final String EXTRA_PRIVATE_RETAIN_IN_ON_STOP
= "com.android.internal.app.ChooserActivity.EXTRA_PRIVATE_RETAIN_IN_ON_STOP"; = "com.android.internal.app.ChooserActivity.EXTRA_PRIVATE_RETAIN_IN_ON_STOP";
/**
* Integer extra to indicate which profile should be automatically selected.
* <p>Can only be used if there is a work profile.
* <p>Possible values can be either {@link #PROFILE_PERSONAL} or {@link #PROFILE_WORK}.
*/
static final String EXTRA_SELECTED_PROFILE =
"com.android.internal.app.ChooserActivity.EXTRA_SELECTED_PROFILE";
static final int PROFILE_PERSONAL = AbstractMultiProfilePagerAdapter.PROFILE_PERSONAL;
static final int PROFILE_WORK = AbstractMultiProfilePagerAdapter.PROFILE_WORK;
private static final String PREF_NUM_SHEET_EXPANSIONS = "pref_num_sheet_expansions"; private static final String PREF_NUM_SHEET_EXPANSIONS = "pref_num_sheet_expansions";
private static final String CHIP_LABEL_METADATA_KEY = "android.service.chooser.chip_label"; private static final String CHIP_LABEL_METADATA_KEY = "android.service.chooser.chip_label";
@@ -860,15 +871,31 @@ public class ChooserActivity extends ResolverActivity implements
filterLastUsed, filterLastUsed,
mUseLayoutForBrowsables, mUseLayoutForBrowsables,
/* userHandle */ getWorkProfileUserHandle()); /* userHandle */ getWorkProfileUserHandle());
int selectedProfile = findSelectedProfile();
return new ChooserMultiProfilePagerAdapter( return new ChooserMultiProfilePagerAdapter(
/* context */ this, /* context */ this,
personalAdapter, personalAdapter,
workAdapter, workAdapter,
/* defaultProfile */ getCurrentProfile(), selectedProfile,
getPersonalProfileUserHandle(), getPersonalProfileUserHandle(),
getWorkProfileUserHandle()); getWorkProfileUserHandle());
} }
private int findSelectedProfile() {
int selectedProfile;
if (getIntent().hasExtra(EXTRA_SELECTED_PROFILE)) {
selectedProfile = getIntent().getIntExtra(EXTRA_SELECTED_PROFILE, /* defValue = */ -1);
if (selectedProfile != PROFILE_PERSONAL && selectedProfile != PROFILE_WORK) {
throw new IllegalArgumentException(EXTRA_SELECTED_PROFILE + " has invalid value "
+ selectedProfile + ". Must be either ChooserActivity.PROFILE_PERSONAL or "
+ "ChooserActivity.PROFILE_WORK.");
}
} else {
selectedProfile = getProfileForUser(getUser());
}
return selectedProfile;
}
@Override @Override
protected boolean postRebuildList(boolean rebuildCompleted) { protected boolean postRebuildList(boolean rebuildCompleted) {
updateStickyContentPreview(); updateStickyContentPreview();
@@ -2479,7 +2506,10 @@ public class ChooserActivity extends ResolverActivity implements
gridAdapter.getMaxTargetsPerRow()); gridAdapter.getMaxTargetsPerRow());
} }
if (mChooserMultiProfilePagerAdapter.getCurrentUserHandle() != getUser()) { UserHandle currentUserHandle = mChooserMultiProfilePagerAdapter.getCurrentUserHandle();
int currentProfile = getProfileForUser(currentUserHandle);
int initialProfile = findSelectedProfile();
if (currentProfile != initialProfile) {
return; return;
} }
@@ -2576,6 +2606,19 @@ public class ChooserActivity extends ResolverActivity implements
} }
} }
/**
* Returns {@link #PROFILE_PERSONAL}, {@link #PROFILE_WORK}, or -1 if the given user handle
* does not match either the personal or work user handle.
**/
private int getProfileForUser(UserHandle currentUserHandle) {
if (currentUserHandle == getPersonalProfileUserHandle()) {
return PROFILE_PERSONAL;
} else if (currentUserHandle == getWorkProfileUserHandle()) {
return PROFILE_WORK;
}
return -1;
}
private ViewGroup getCurrentEmptyStateView() { private ViewGroup getCurrentEmptyStateView() {
int currentPage = mChooserMultiProfilePagerAdapter.getCurrentPage(); int currentPage = mChooserMultiProfilePagerAdapter.getCurrentPage();
return mChooserMultiProfilePagerAdapter.getItem(currentPage).getEmptyStateView(); return mChooserMultiProfilePagerAdapter.getItem(currentPage).getEmptyStateView();

View File

@@ -108,20 +108,16 @@ public class IntentForwarderActivity extends Activity {
finish(); finish();
return; return;
} }
if (Intent.ACTION_CHOOSER.equals(intentReceived.getAction())) {
launchChooserActivityWithCorrectTab(intentReceived, className);
return;
}
final int callingUserId = getUserId(); final int callingUserId = getUserId();
final Intent newIntent = canForward(intentReceived, getUserId(), targetUserId, final Intent newIntent = canForward(intentReceived, getUserId(), targetUserId,
mInjector.getIPackageManager(), getContentResolver()); mInjector.getIPackageManager(), getContentResolver());
if (newIntent != null) { if (newIntent != null) {
if (Intent.ACTION_CHOOSER.equals(newIntent.getAction())) { newIntent.prepareToLeaveUser(callingUserId);
Intent innerIntent = newIntent.getParcelableExtra(Intent.EXTRA_INTENT);
// At this point, innerIntent is not null. Otherwise, canForward would have returned
// false.
innerIntent.prepareToLeaveUser(callingUserId);
innerIntent.fixUris(callingUserId);
} else {
newIntent.prepareToLeaveUser(callingUserId);
}
final ResolveInfo ri = mInjector.resolveActivityAsUser(newIntent, MATCH_DEFAULT_ONLY, final ResolveInfo ri = mInjector.resolveActivityAsUser(newIntent, MATCH_DEFAULT_ONLY,
targetUserId); targetUserId);
@@ -153,6 +149,33 @@ public class IntentForwarderActivity extends Activity {
finish(); finish();
} }
private void launchChooserActivityWithCorrectTab(Intent intentReceived, String className) {
// When showing the sharesheet, instead of forwarding to the other profile,
// we launch the sharesheet in the current user and select the other tab.
// This fixes b/152866292 where the user can not go back to the original profile
// when cross-profile intents are disabled.
int selectedProfile = findSelectedProfile(className);
sanitizeIntent(intentReceived);
intentReceived.putExtra(ChooserActivity.EXTRA_SELECTED_PROFILE, selectedProfile);
Intent innerIntent = intentReceived.getParcelableExtra(Intent.EXTRA_INTENT);
if (innerIntent == null) {
Slog.wtf(TAG, "Cannot start a chooser intent with no extra " + Intent.EXTRA_INTENT);
return;
}
sanitizeIntent(innerIntent);
startActivity(intentReceived);
finish();
}
private int findSelectedProfile(String className) {
if (className.equals(FORWARD_INTENT_TO_PARENT)) {
return ChooserActivity.PROFILE_PERSONAL;
} else if (className.equals(FORWARD_INTENT_TO_MANAGED_PROFILE)) {
return ChooserActivity.PROFILE_WORK;
}
return -1;
}
private boolean shouldShowDisclosure(@Nullable ResolveInfo ri, Intent intent) { private boolean shouldShowDisclosure(@Nullable ResolveInfo ri, Intent intent) {
if (!isDeviceProvisioned()) { if (!isDeviceProvisioned()) {
return false; return false;

View File

@@ -213,13 +213,9 @@ public class IntentForwarderActivityTest {
} }
@Test @Test
public void forwardToManagedProfile_canForward_chooserIntent() throws Exception { public void launchInSameProfile_chooserIntent() {
sComponentName = FORWARD_TO_MANAGED_PROFILE_COMPONENT_NAME; sComponentName = FORWARD_TO_MANAGED_PROFILE_COMPONENT_NAME;
// Intent can be forwarded.
when(mIPm.canForwardTo(
any(Intent.class), nullable(String.class), anyInt(), anyInt())).thenReturn(true);
// Manage profile exists. // Manage profile exists.
List<UserInfo> profiles = new ArrayList<>(); List<UserInfo> profiles = new ArrayList<>();
profiles.add(CURRENT_USER_INFO); profiles.add(CURRENT_USER_INFO);
@@ -235,10 +231,6 @@ public class IntentForwarderActivityTest {
intent.putExtra(Intent.EXTRA_INTENT, sendIntent); intent.putExtra(Intent.EXTRA_INTENT, sendIntent);
IntentForwarderWrapperActivity activity = mActivityRule.launchActivity(intent); IntentForwarderWrapperActivity activity = mActivityRule.launchActivity(intent);
ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
verify(mIPm).canForwardTo(intentCaptor.capture(), eq(TYPE_PLAIN_TEXT), anyInt(), anyInt());
assertEquals(Intent.ACTION_SEND, intentCaptor.getValue().getAction());
assertNotNull(activity.mStartActivityIntent); assertNotNull(activity.mStartActivityIntent);
assertEquals(Intent.ACTION_CHOOSER, activity.mStartActivityIntent.getAction()); assertEquals(Intent.ACTION_CHOOSER, activity.mStartActivityIntent.getAction());
assertNull(activity.mStartActivityIntent.getPackage()); assertNull(activity.mStartActivityIntent.getPackage());
@@ -249,9 +241,9 @@ public class IntentForwarderActivityTest {
assertEquals(Intent.ACTION_SEND, innerIntent.getAction()); assertEquals(Intent.ACTION_SEND, innerIntent.getAction());
assertNull(innerIntent.getComponent()); assertNull(innerIntent.getComponent());
assertNull(innerIntent.getPackage()); assertNull(innerIntent.getPackage());
assertEquals(CURRENT_USER_INFO.id, innerIntent.getContentUserHint()); assertEquals(UserHandle.USER_CURRENT, innerIntent.getContentUserHint());
assertEquals(MANAGED_PROFILE_INFO.id, activity.mUserIdActivityLaunchedIn); assertEquals(CURRENT_USER_INFO.id, activity.mUserIdActivityLaunchedIn);
} }
@Test @Test
@@ -655,6 +647,12 @@ public class IntentForwarderActivityTest {
mUserIdActivityLaunchedIn = userId; mUserIdActivityLaunchedIn = userId;
} }
@Override
public void startActivity(Intent intent) {
mStartActivityIntent = intent;
mUserIdActivityLaunchedIn = getUserId();
}
@Override @Override
protected MetricsLogger getMetricsLogger() { protected MetricsLogger getMetricsLogger() {
return mMetricsLogger; return mMetricsLogger;