Loading core/java/com/android/internal/app/ResolverActivity.java +24 −6 Original line number Diff line number Diff line Loading @@ -216,6 +216,12 @@ public class ResolverActivity extends Activity implements // Intent extra for connected audio devices public static final String EXTRA_IS_AUDIO_CAPTURE_DEVICE = "is_audio_capture_device"; /** * Boolean extra to indicate if Resolver Sheet needs to be started in single user mode. */ protected static final String EXTRA_RESTRICT_TO_SINGLE_USER = "com.android.internal.app.ResolverActivity.EXTRA_RESTRICT_TO_SINGLE_USER"; /** * Integer extra to indicate which profile should be automatically selected. * <p>Can only be used if there is a work profile. Loading Loading @@ -750,8 +756,10 @@ public class ResolverActivity extends Activity implements } protected UserHandle getPersonalProfileUserHandle() { if (privateSpaceEnabled() && isLaunchedAsPrivateProfile()){ return mPrivateProfileUserHandle; // When launched in single user mode, only personal tab is populated, so we use // tabOwnerUserHandleForLaunch as personal tab's user handle. if (privateSpaceEnabled() && isLaunchedInSingleUserMode()) { return getTabOwnerUserHandleForLaunch(); } return mPersonalProfileUserHandle; } Loading Loading @@ -822,11 +830,11 @@ public class ResolverActivity extends Activity implements // If we are in work or private profile's process, return WorkProfile/PrivateProfile user // as owner, otherwise we always return PersonalProfile user as owner if (UserHandle.of(UserHandle.myUserId()).equals(getWorkProfileUserHandle())) { return getWorkProfileUserHandle(); return mWorkProfileUserHandle; } else if (privateSpaceEnabled() && isLaunchedAsPrivateProfile()) { return getPrivateProfileUserHandle(); return mPrivateProfileUserHandle; } return getPersonalProfileUserHandle(); return mPersonalProfileUserHandle; } private boolean hasWorkProfile() { Loading @@ -847,8 +855,18 @@ public class ResolverActivity extends Activity implements && (UserHandle.myUserId() == getPrivateProfileUserHandle().getIdentifier()); } protected final boolean isLaunchedInSingleUserMode() { // When launched from Private Profile, return true if (isLaunchedAsPrivateProfile()) { return true; } return getIntent() .getBooleanExtra(EXTRA_RESTRICT_TO_SINGLE_USER, /* defaultValue = */ false); } protected boolean shouldShowTabs() { if (privateSpaceEnabled() && isLaunchedAsPrivateProfile()) { // No Tabs are shown when launched in single user mode. if (privateSpaceEnabled() && isLaunchedInSingleUserMode()) { return false; } return hasWorkProfile() && ENABLE_TABBED_VIEW; Loading core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java +50 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withText; import static com.android.internal.app.MatcherUtils.first; import static com.android.internal.app.ResolverActivity.EXTRA_RESTRICT_TO_SINGLE_USER; import static com.android.internal.app.ResolverDataProvider.createPackageManagerMockedInfo; import static com.android.internal.app.ResolverWrapperActivity.sOverrides; Loading Loading @@ -1254,6 +1255,51 @@ public class ResolverActivityTest { } } @Test public void testTriggerFromMainProfile_inSingleUserMode_withWorkProfilePresent() { mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE, android.multiuser.Flags.FLAG_ALLOW_RESOLVER_SHEET_FOR_PRIVATE_SPACE); markWorkProfileUserAvailable(); setTabOwnerUserHandleForLaunch(PERSONAL_USER_HANDLE); Intent sendIntent = createSendImageIntent(); sendIntent.putExtra(EXTRA_RESTRICT_TO_SINGLE_USER, true); List<ResolvedComponentInfo> personalResolvedComponentInfos = createResolvedComponentsForTestWithOtherProfile(3, PERSONAL_USER_HANDLE); List<ResolvedComponentInfo> workResolvedComponentInfos = createResolvedComponentsForTest(4, sOverrides.workProfileUserHandle); setupResolverControllers(personalResolvedComponentInfos, workResolvedComponentInfos); final ResolverWrapperActivity activity = mActivityRule.launchActivity(sendIntent); waitForIdle(); assertThat(activity.getPersonalListAdapter().getCount(), is(2)); onView(withId(R.id.tabs)).check(matches(not(isDisplayed()))); assertEquals(activity.getMultiProfilePagerAdapterCount(), 1); for (ResolvedComponentInfo resolvedInfo : personalResolvedComponentInfos) { assertEquals(resolvedInfo.getResolveInfoAt(0).userHandle, PERSONAL_USER_HANDLE); } } @Test public void testTriggerFromWorkProfile_inSingleUserMode() { mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE, android.multiuser.Flags.FLAG_ALLOW_RESOLVER_SHEET_FOR_PRIVATE_SPACE); markWorkProfileUserAvailable(); setTabOwnerUserHandleForLaunch(sOverrides.workProfileUserHandle); Intent sendIntent = createSendImageIntent(); sendIntent.putExtra(EXTRA_RESTRICT_TO_SINGLE_USER, true); List<ResolvedComponentInfo> personalResolvedComponentInfos = createResolvedComponentsForTest(3, sOverrides.workProfileUserHandle); setupResolverControllers(personalResolvedComponentInfos); final ResolverWrapperActivity activity = mActivityRule.launchActivity(sendIntent); waitForIdle(); assertThat(activity.getPersonalListAdapter().getCount(), is(3)); onView(withId(R.id.tabs)).check(matches(not(isDisplayed()))); assertEquals(activity.getMultiProfilePagerAdapterCount(), 1); for (ResolvedComponentInfo resolvedInfo : personalResolvedComponentInfos) { assertEquals(resolvedInfo.getResolveInfoAt(0).userHandle, sOverrides.workProfileUserHandle); } } private Intent createSendImageIntent() { Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); Loading Loading @@ -1339,6 +1385,10 @@ public class ResolverActivityTest { ResolverWrapperActivity.sOverrides.privateProfileUserHandle = UserHandle.of(12); } private void setTabOwnerUserHandleForLaunch(UserHandle tabOwnerUserHandleForLaunch) { sOverrides.tabOwnerUserHandleForLaunch = tabOwnerUserHandleForLaunch; } private void setupResolverControllers( List<ResolvedComponentInfo> personalResolvedComponentInfos, List<ResolvedComponentInfo> workResolvedComponentInfos) { Loading core/tests/coretests/src/com/android/internal/app/ResolverWrapperActivity.java +4 −0 Original line number Diff line number Diff line Loading @@ -116,6 +116,10 @@ public class ResolverWrapperActivity extends ResolverActivity { when(sOverrides.resolverListController.getUserHandle()).thenReturn(UserHandle.SYSTEM); return sOverrides.resolverListController; } if (isLaunchedInSingleUserMode()) { when(sOverrides.resolverListController.getUserHandle()).thenReturn(userHandle); return sOverrides.resolverListController; } when(sOverrides.workResolverListController.getUserHandle()).thenReturn(userHandle); return sOverrides.workResolverListController; } Loading Loading
core/java/com/android/internal/app/ResolverActivity.java +24 −6 Original line number Diff line number Diff line Loading @@ -216,6 +216,12 @@ public class ResolverActivity extends Activity implements // Intent extra for connected audio devices public static final String EXTRA_IS_AUDIO_CAPTURE_DEVICE = "is_audio_capture_device"; /** * Boolean extra to indicate if Resolver Sheet needs to be started in single user mode. */ protected static final String EXTRA_RESTRICT_TO_SINGLE_USER = "com.android.internal.app.ResolverActivity.EXTRA_RESTRICT_TO_SINGLE_USER"; /** * Integer extra to indicate which profile should be automatically selected. * <p>Can only be used if there is a work profile. Loading Loading @@ -750,8 +756,10 @@ public class ResolverActivity extends Activity implements } protected UserHandle getPersonalProfileUserHandle() { if (privateSpaceEnabled() && isLaunchedAsPrivateProfile()){ return mPrivateProfileUserHandle; // When launched in single user mode, only personal tab is populated, so we use // tabOwnerUserHandleForLaunch as personal tab's user handle. if (privateSpaceEnabled() && isLaunchedInSingleUserMode()) { return getTabOwnerUserHandleForLaunch(); } return mPersonalProfileUserHandle; } Loading Loading @@ -822,11 +830,11 @@ public class ResolverActivity extends Activity implements // If we are in work or private profile's process, return WorkProfile/PrivateProfile user // as owner, otherwise we always return PersonalProfile user as owner if (UserHandle.of(UserHandle.myUserId()).equals(getWorkProfileUserHandle())) { return getWorkProfileUserHandle(); return mWorkProfileUserHandle; } else if (privateSpaceEnabled() && isLaunchedAsPrivateProfile()) { return getPrivateProfileUserHandle(); return mPrivateProfileUserHandle; } return getPersonalProfileUserHandle(); return mPersonalProfileUserHandle; } private boolean hasWorkProfile() { Loading @@ -847,8 +855,18 @@ public class ResolverActivity extends Activity implements && (UserHandle.myUserId() == getPrivateProfileUserHandle().getIdentifier()); } protected final boolean isLaunchedInSingleUserMode() { // When launched from Private Profile, return true if (isLaunchedAsPrivateProfile()) { return true; } return getIntent() .getBooleanExtra(EXTRA_RESTRICT_TO_SINGLE_USER, /* defaultValue = */ false); } protected boolean shouldShowTabs() { if (privateSpaceEnabled() && isLaunchedAsPrivateProfile()) { // No Tabs are shown when launched in single user mode. if (privateSpaceEnabled() && isLaunchedInSingleUserMode()) { return false; } return hasWorkProfile() && ENABLE_TABBED_VIEW; Loading
core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java +50 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withText; import static com.android.internal.app.MatcherUtils.first; import static com.android.internal.app.ResolverActivity.EXTRA_RESTRICT_TO_SINGLE_USER; import static com.android.internal.app.ResolverDataProvider.createPackageManagerMockedInfo; import static com.android.internal.app.ResolverWrapperActivity.sOverrides; Loading Loading @@ -1254,6 +1255,51 @@ public class ResolverActivityTest { } } @Test public void testTriggerFromMainProfile_inSingleUserMode_withWorkProfilePresent() { mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE, android.multiuser.Flags.FLAG_ALLOW_RESOLVER_SHEET_FOR_PRIVATE_SPACE); markWorkProfileUserAvailable(); setTabOwnerUserHandleForLaunch(PERSONAL_USER_HANDLE); Intent sendIntent = createSendImageIntent(); sendIntent.putExtra(EXTRA_RESTRICT_TO_SINGLE_USER, true); List<ResolvedComponentInfo> personalResolvedComponentInfos = createResolvedComponentsForTestWithOtherProfile(3, PERSONAL_USER_HANDLE); List<ResolvedComponentInfo> workResolvedComponentInfos = createResolvedComponentsForTest(4, sOverrides.workProfileUserHandle); setupResolverControllers(personalResolvedComponentInfos, workResolvedComponentInfos); final ResolverWrapperActivity activity = mActivityRule.launchActivity(sendIntent); waitForIdle(); assertThat(activity.getPersonalListAdapter().getCount(), is(2)); onView(withId(R.id.tabs)).check(matches(not(isDisplayed()))); assertEquals(activity.getMultiProfilePagerAdapterCount(), 1); for (ResolvedComponentInfo resolvedInfo : personalResolvedComponentInfos) { assertEquals(resolvedInfo.getResolveInfoAt(0).userHandle, PERSONAL_USER_HANDLE); } } @Test public void testTriggerFromWorkProfile_inSingleUserMode() { mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE, android.multiuser.Flags.FLAG_ALLOW_RESOLVER_SHEET_FOR_PRIVATE_SPACE); markWorkProfileUserAvailable(); setTabOwnerUserHandleForLaunch(sOverrides.workProfileUserHandle); Intent sendIntent = createSendImageIntent(); sendIntent.putExtra(EXTRA_RESTRICT_TO_SINGLE_USER, true); List<ResolvedComponentInfo> personalResolvedComponentInfos = createResolvedComponentsForTest(3, sOverrides.workProfileUserHandle); setupResolverControllers(personalResolvedComponentInfos); final ResolverWrapperActivity activity = mActivityRule.launchActivity(sendIntent); waitForIdle(); assertThat(activity.getPersonalListAdapter().getCount(), is(3)); onView(withId(R.id.tabs)).check(matches(not(isDisplayed()))); assertEquals(activity.getMultiProfilePagerAdapterCount(), 1); for (ResolvedComponentInfo resolvedInfo : personalResolvedComponentInfos) { assertEquals(resolvedInfo.getResolveInfoAt(0).userHandle, sOverrides.workProfileUserHandle); } } private Intent createSendImageIntent() { Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); Loading Loading @@ -1339,6 +1385,10 @@ public class ResolverActivityTest { ResolverWrapperActivity.sOverrides.privateProfileUserHandle = UserHandle.of(12); } private void setTabOwnerUserHandleForLaunch(UserHandle tabOwnerUserHandleForLaunch) { sOverrides.tabOwnerUserHandleForLaunch = tabOwnerUserHandleForLaunch; } private void setupResolverControllers( List<ResolvedComponentInfo> personalResolvedComponentInfos, List<ResolvedComponentInfo> workResolvedComponentInfos) { Loading
core/tests/coretests/src/com/android/internal/app/ResolverWrapperActivity.java +4 −0 Original line number Diff line number Diff line Loading @@ -116,6 +116,10 @@ public class ResolverWrapperActivity extends ResolverActivity { when(sOverrides.resolverListController.getUserHandle()).thenReturn(UserHandle.SYSTEM); return sOverrides.resolverListController; } if (isLaunchedInSingleUserMode()) { when(sOverrides.resolverListController.getUserHandle()).thenReturn(userHandle); return sOverrides.resolverListController; } when(sOverrides.workResolverListController.getUserHandle()).thenReturn(userHandle); return sOverrides.workResolverListController; } Loading