Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a72eb16e authored by Himanshu Gupta's avatar Himanshu Gupta
Browse files

Adding single user layout for ResolverActivity

This change adds an option for the callers of
ResolverActivity to start Resolver Sheet in single
user mode.
When not specified, Resolver Sheet is launched in
multi-user mode.

Test: Manual flash
Bug: 325576602
Change-Id: If97d91cf093efc78602bc8d2fdeadc8d43ddf73a
parent caffbdb3
Loading
Loading
Loading
Loading
+24 −6
Original line number Diff line number Diff line
@@ -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.
@@ -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;
    }
@@ -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() {
@@ -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;
+50 −0
Original line number Diff line number Diff line
@@ -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;

@@ -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);
@@ -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) {
+4 −0
Original line number Diff line number Diff line
@@ -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;
    }