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

Commit bd74caeb authored by Jason Chiu's avatar Jason Chiu
Browse files

Check whether the user is a sub profile before starting Settings homepage

Fix: 336449492
Test: atest SettingsHomepageActivityTest LocationInjectedServicesPreferenceControllerTest UserDetailsSettingsTest ActionDisabledByAdminDialogHelperTest ProfileSelectFragmentTest ProfileSelectLocationFragmentTest
- Start a managed app's info page
- Start a private app's info page
- Switch to a secondary user and start Settings
- Switch to the guest user and start Settings

Change-Id: I1c7c95d95c4739d70839a742ebc4e72b59b1d555
parent dade97f2
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.app.Activity
import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent
import android.content.pm.UserInfo
import android.provider.Settings
import android.util.Log
import com.android.settings.SettingsActivity
@@ -93,9 +94,17 @@ object EmbeddedDeepLinkUtils {
        }
    }


    /**
     * Returns whether the user is a sub profile.
     */
    @JvmStatic
    fun isSubProfile(userInfo: UserInfo): Boolean =
        userInfo.isManagedProfile || userInfo.isPrivateProfile

    private fun Context.startTrampolineIntent(trampolineIntent: Intent): Boolean = try {
        val userInfo = userManager.getUserInfo(user.identifier)
        if (userInfo.isManagedProfile) {
        if (isSubProfile(userInfo)) {
            trampolineIntent.setClass(this, DeepLinkHomepageActivityInternal::class.java)
                .putExtra(SettingsActivity.EXTRA_USER_HANDLE, user)
            startActivityAsUser(
+2 −1
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ import com.android.settings.SettingsApplication;
import com.android.settings.accounts.AvatarViewMixin;
import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
import com.android.settings.activityembedding.ActivityEmbeddingUtils;
import com.android.settings.activityembedding.EmbeddedDeepLinkUtils;
import com.android.settings.core.CategoryMixin;
import com.android.settings.core.FeatureFlags;
import com.android.settings.homepage.contextualcards.ContextualCardsFragment;
@@ -204,7 +205,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements
        if (mIsEmbeddingActivityEnabled) {
            final UserManager um = getSystemService(UserManager.class);
            final UserInfo userInfo = um.getUserInfo(getUserId());
            if (userInfo.isManagedProfile()) {
            if (EmbeddedDeepLinkUtils.isSubProfile(userInfo)) {
                final Intent intent = new Intent(getIntent())
                        .addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT)
                        .putExtra(EXTRA_USER_HANDLE, getUser())
+69 −16
Original line number Diff line number Diff line
@@ -40,7 +40,9 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.ArraySet;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
@@ -74,6 +76,8 @@ import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowActivityManager;
import org.robolectric.util.ReflectionHelpers;

import java.util.Set;

@RunWith(RobolectricTestRunner.class)
@Config(shadows = {
        ShadowUserManager.class,
@@ -249,7 +253,7 @@ public class SettingsHomepageActivityTest {
                spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get());
        doReturn(true).when(activity).isTaskRoot();

        activity.onCreate(/* savedInstanceState */ null);
        activity.onCreate(/* savedInstanceState= */ null);

        verify(activity, never()).finish();
    }
@@ -260,7 +264,7 @@ public class SettingsHomepageActivityTest {
                spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get());
        doReturn(false).when(activity).isTaskRoot();

        activity.onCreate(/* savedInstanceState */ null);
        activity.onCreate(/* savedInstanceState= */ null);

        verify(activity).finish();
        verify(activity).startActivity(any(Intent.class));
@@ -269,26 +273,75 @@ public class SettingsHomepageActivityTest {
    @Test
    public void onCreate_notTaskRoot_flagNewTask_shouldOnlyFinish() {
        SettingsHomepageActivity activity =
                spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get());
                spy(Robolectric.buildActivity(SettingsHomepageActivity.class,
                        new Intent().addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)).get());
        doReturn(false).when(activity).isTaskRoot();
        activity.setIntent(new Intent().addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));

        activity.onCreate(/* savedInstanceState */ null);
        activity.onCreate(/* savedInstanceState= */ null);

        verify(activity).finish();
        verify(activity, never()).startActivity(any(Intent.class));
    }

    @Test
    @Config(shadows = ShadowActivityEmbeddingUtils.class)
    public void onCreate_eligibleProfile_shouldNotRestartActivity() {
        ShadowActivityEmbeddingUtils.setIsEmbeddingActivityEnabled(true);
        SettingsHomepageActivity activity =
                spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get());
        doReturn(0).when(activity).getUserId();
        doReturn(true).when(activity).isTaskRoot();

        activity.onCreate(/* savedInstanceState= */ null);

        verify(activity, never()).finish();
        verify(activity, never()).startActivityAsUser(any(Intent.class), any(UserHandle.class));
    }

    @Test
    @Config(shadows = ShadowActivityEmbeddingUtils.class)
    public void onCreate_managedProfile_shouldRestartActivity() {
        ShadowActivityEmbeddingUtils.setIsEmbeddingActivityEnabled(true);
        SettingsHomepageActivity activity =
                spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get());
        final Set<Integer> profileIds = new ArraySet<>();
        profileIds.add(10);
        ShadowUserManager.getShadow().setManagedProfiles(profileIds);
        doReturn(10).when(activity).getUserId();
        doReturn(true).when(activity).isTaskRoot();

        activity.onCreate(/* savedInstanceState= */ null);

        verify(activity).finish();
        verify(activity).startActivityAsUser(any(Intent.class), any(UserHandle.class));
    }

    @Test
    @Config(shadows = ShadowActivityEmbeddingUtils.class)
    public void onCreate_privateProfile_shouldRestartActivity() {
        ShadowActivityEmbeddingUtils.setIsEmbeddingActivityEnabled(true);
        SettingsHomepageActivity activity =
                spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get());
        ShadowUserManager.getShadow().setPrivateProfile(11, "private", 0);
        doReturn(11).when(activity).getUserId();
        doReturn(true).when(activity).isTaskRoot();

        activity.onCreate(/* savedInstanceState= */ null);

        verify(activity).finish();
        verify(activity).startActivityAsUser(any(Intent.class), any(UserHandle.class));
    }

    /** This test is for large screen devices Activity embedding. */
    @Test
    @Config(shadows = ShadowActivityEmbeddingUtils.class)
    public void onCreate_flagClearTop_shouldInitRules() {
        ShadowActivityEmbeddingUtils.setIsEmbeddingActivityEnabled(true);
        SettingsHomepageActivity activity =
                spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get());
        doReturn(new Intent().setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).when(activity).getIntent();
                spy(Robolectric.buildActivity(SettingsHomepageActivity.class,
                        new Intent().setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).get());

        activity.onCreate(/* savedInstanceState */ null);
        activity.onCreate(/* savedInstanceState= */ null);

        verify(activity).initSplitPairRules();
    }
@@ -315,12 +368,12 @@ public class SettingsHomepageActivityTest {

    @Test
    public void getInitialReferrer_hasReferrerExtra_returnGivenReferrer() {
        String referrer = "com.abc";
        SettingsHomepageActivity activity =
                spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get());
                spy(Robolectric.buildActivity(SettingsHomepageActivity.class,
                        new Intent().putExtra(SettingsHomepageActivity.EXTRA_INITIAL_REFERRER,
                                referrer)).get());
        doReturn(activity.getPackageName()).when(activity).getCurrentReferrer();
        String referrer = "com.abc";
        activity.setIntent(new Intent().putExtra(SettingsHomepageActivity.EXTRA_INITIAL_REFERRER,
                referrer));

        assertEquals(activity.getInitialReferrer(), referrer);
    }
@@ -330,8 +383,8 @@ public class SettingsHomepageActivityTest {
        String referrer = "com.abc";
        Uri uri = new Uri.Builder().scheme("android-app").authority(referrer).build();
        SettingsHomepageActivity activity =
                spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get());
        activity.setIntent(new Intent().putExtra(Intent.EXTRA_REFERRER, uri));
                spy(Robolectric.buildActivity(SettingsHomepageActivity.class,
                        new Intent().putExtra(Intent.EXTRA_REFERRER, uri)).get());

        assertNotEquals(activity.getCurrentReferrer(), referrer);
    }
@@ -340,8 +393,8 @@ public class SettingsHomepageActivityTest {
    public void getCurrentReferrer_hasReferrerNameExtra_shouldNotEqual() {
        String referrer = "com.abc";
        SettingsHomepageActivity activity =
                spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get());
        activity.setIntent(new Intent().putExtra(Intent.EXTRA_REFERRER_NAME, referrer));
                spy(Robolectric.buildActivity(SettingsHomepageActivity.class,
                        new Intent().putExtra(Intent.EXTRA_REFERRER_NAME, referrer)).get());

        assertNotEquals(activity.getCurrentReferrer(), referrer);
    }
+18 −5
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.settings.testutils.shadow;

import static android.os.Build.VERSION_CODES.LOLLIPOP;
import static android.os.UserManager.USER_TYPE_PROFILE_MANAGED;
import static android.os.UserManager.USER_TYPE_PROFILE_PRIVATE;

import android.annotation.UserIdInt;
@@ -76,6 +77,7 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager

    public void addProfile(UserInfo userInfo) {
        mUserProfileInfos.add(userInfo);
        mUserInfoMap.put(userInfo.id, userInfo);
    }

    @Resetter
@@ -100,8 +102,7 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager
    public void addProfile(
            int userHandle, int profileUserHandle, String profileName, int profileFlags) {
        UserInfo profileUserInfo = new UserInfo(profileUserHandle, profileName, profileFlags);
        mUserProfileInfos.add(profileUserInfo);
        mUserInfoMap.put(profileUserHandle, profileUserInfo);
        addProfile(profileUserInfo);
        mProfileToParent.put(profileUserHandle, userHandle);
        if (profileFlags == UserInfo.FLAG_MANAGED_PROFILE) {
            setManagedProfiles(new HashSet<>(Arrays.asList(profileUserHandle)));
@@ -179,8 +180,7 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager
    }

    public static ShadowUserManager getShadow() {
        return (ShadowUserManager) Shadow.extract(
                RuntimeEnvironment.application.getSystemService(UserManager.class));
        return Shadow.extract(RuntimeEnvironment.application.getSystemService(UserManager.class));
    }

    @Implementation
@@ -229,10 +229,23 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager
    public void setManagedProfiles(Set<Integer> profileIds) {
        mManagedProfiles.clear();
        mManagedProfiles.addAll(profileIds);
        profileIds.forEach(id -> {
            addProfile(new UserInfo(id, "managed" + id, null, 0, USER_TYPE_PROFILE_MANAGED));
            mProfileToParent.put(id, PRIMARY_USER_ID);
        });
        addPrimaryUser();
    }

    public void setPrivateProfile(int id, String name, int flags) {
        mUserProfileInfos.add(new UserInfo(id, name, null, flags, USER_TYPE_PROFILE_PRIVATE));
        addProfile(new UserInfo(id, name, null, flags, USER_TYPE_PROFILE_PRIVATE));
        mProfileToParent.put(id, PRIMARY_USER_ID);
        addPrimaryUser();
    }

    private void addPrimaryUser() {
        if (mUserInfoMap.get(PRIMARY_USER_ID) == null) {
            addProfile(getPrimaryUser());
        }
    }

    public void setUserSwitcherEnabled(boolean userSwitchEnabled) {