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
This commit is contained in:
Jason Chiu
2024-04-29 18:16:51 +08:00
parent dade97f27c
commit bd74caeb99
4 changed files with 100 additions and 24 deletions

View File

@@ -20,6 +20,7 @@ import android.app.Activity
import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.UserInfo
import android.provider.Settings import android.provider.Settings
import android.util.Log import android.util.Log
import com.android.settings.SettingsActivity 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 { private fun Context.startTrampolineIntent(trampolineIntent: Intent): Boolean = try {
val userInfo = userManager.getUserInfo(user.identifier) val userInfo = userManager.getUserInfo(user.identifier)
if (userInfo.isManagedProfile) { if (isSubProfile(userInfo)) {
trampolineIntent.setClass(this, DeepLinkHomepageActivityInternal::class.java) trampolineIntent.setClass(this, DeepLinkHomepageActivityInternal::class.java)
.putExtra(SettingsActivity.EXTRA_USER_HANDLE, user) .putExtra(SettingsActivity.EXTRA_USER_HANDLE, user)
startActivityAsUser( startActivityAsUser(

View File

@@ -70,6 +70,7 @@ import com.android.settings.SettingsApplication;
import com.android.settings.accounts.AvatarViewMixin; import com.android.settings.accounts.AvatarViewMixin;
import com.android.settings.activityembedding.ActivityEmbeddingRulesController; import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
import com.android.settings.activityembedding.ActivityEmbeddingUtils; import com.android.settings.activityembedding.ActivityEmbeddingUtils;
import com.android.settings.activityembedding.EmbeddedDeepLinkUtils;
import com.android.settings.core.CategoryMixin; import com.android.settings.core.CategoryMixin;
import com.android.settings.core.FeatureFlags; import com.android.settings.core.FeatureFlags;
import com.android.settings.homepage.contextualcards.ContextualCardsFragment; import com.android.settings.homepage.contextualcards.ContextualCardsFragment;
@@ -204,7 +205,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements
if (mIsEmbeddingActivityEnabled) { if (mIsEmbeddingActivityEnabled) {
final UserManager um = getSystemService(UserManager.class); final UserManager um = getSystemService(UserManager.class);
final UserInfo userInfo = um.getUserInfo(getUserId()); final UserInfo userInfo = um.getUserInfo(getUserId());
if (userInfo.isManagedProfile()) { if (EmbeddedDeepLinkUtils.isSubProfile(userInfo)) {
final Intent intent = new Intent(getIntent()) final Intent intent = new Intent(getIntent())
.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT) .addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT)
.putExtra(EXTRA_USER_HANDLE, getUser()) .putExtra(EXTRA_USER_HANDLE, getUser())

View File

@@ -40,7 +40,9 @@ import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.util.ArraySet;
import android.view.View; import android.view.View;
import android.view.Window; import android.view.Window;
import android.view.WindowManager; import android.view.WindowManager;
@@ -74,6 +76,8 @@ import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowActivityManager; import org.robolectric.shadows.ShadowActivityManager;
import org.robolectric.util.ReflectionHelpers; import org.robolectric.util.ReflectionHelpers;
import java.util.Set;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = { @Config(shadows = {
ShadowUserManager.class, ShadowUserManager.class,
@@ -249,7 +253,7 @@ public class SettingsHomepageActivityTest {
spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get()); spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get());
doReturn(true).when(activity).isTaskRoot(); doReturn(true).when(activity).isTaskRoot();
activity.onCreate(/* savedInstanceState */ null); activity.onCreate(/* savedInstanceState= */ null);
verify(activity, never()).finish(); verify(activity, never()).finish();
} }
@@ -260,7 +264,7 @@ public class SettingsHomepageActivityTest {
spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get()); spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get());
doReturn(false).when(activity).isTaskRoot(); doReturn(false).when(activity).isTaskRoot();
activity.onCreate(/* savedInstanceState */ null); activity.onCreate(/* savedInstanceState= */ null);
verify(activity).finish(); verify(activity).finish();
verify(activity).startActivity(any(Intent.class)); verify(activity).startActivity(any(Intent.class));
@@ -269,26 +273,75 @@ public class SettingsHomepageActivityTest {
@Test @Test
public void onCreate_notTaskRoot_flagNewTask_shouldOnlyFinish() { public void onCreate_notTaskRoot_flagNewTask_shouldOnlyFinish() {
SettingsHomepageActivity activity = 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(); 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).finish();
verify(activity, never()).startActivity(any(Intent.class)); 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. */ /** This test is for large screen devices Activity embedding. */
@Test @Test
@Config(shadows = ShadowActivityEmbeddingUtils.class) @Config(shadows = ShadowActivityEmbeddingUtils.class)
public void onCreate_flagClearTop_shouldInitRules() { public void onCreate_flagClearTop_shouldInitRules() {
ShadowActivityEmbeddingUtils.setIsEmbeddingActivityEnabled(true); ShadowActivityEmbeddingUtils.setIsEmbeddingActivityEnabled(true);
SettingsHomepageActivity activity = SettingsHomepageActivity activity =
spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get()); spy(Robolectric.buildActivity(SettingsHomepageActivity.class,
doReturn(new Intent().setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).when(activity).getIntent(); new Intent().setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).get());
activity.onCreate(/* savedInstanceState */ null); activity.onCreate(/* savedInstanceState= */ null);
verify(activity).initSplitPairRules(); verify(activity).initSplitPairRules();
} }
@@ -315,12 +368,12 @@ public class SettingsHomepageActivityTest {
@Test @Test
public void getInitialReferrer_hasReferrerExtra_returnGivenReferrer() { public void getInitialReferrer_hasReferrerExtra_returnGivenReferrer() {
SettingsHomepageActivity activity =
spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get());
doReturn(activity.getPackageName()).when(activity).getCurrentReferrer();
String referrer = "com.abc"; String referrer = "com.abc";
activity.setIntent(new Intent().putExtra(SettingsHomepageActivity.EXTRA_INITIAL_REFERRER, SettingsHomepageActivity activity =
referrer)); spy(Robolectric.buildActivity(SettingsHomepageActivity.class,
new Intent().putExtra(SettingsHomepageActivity.EXTRA_INITIAL_REFERRER,
referrer)).get());
doReturn(activity.getPackageName()).when(activity).getCurrentReferrer();
assertEquals(activity.getInitialReferrer(), referrer); assertEquals(activity.getInitialReferrer(), referrer);
} }
@@ -330,8 +383,8 @@ public class SettingsHomepageActivityTest {
String referrer = "com.abc"; String referrer = "com.abc";
Uri uri = new Uri.Builder().scheme("android-app").authority(referrer).build(); Uri uri = new Uri.Builder().scheme("android-app").authority(referrer).build();
SettingsHomepageActivity activity = SettingsHomepageActivity activity =
spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get()); spy(Robolectric.buildActivity(SettingsHomepageActivity.class,
activity.setIntent(new Intent().putExtra(Intent.EXTRA_REFERRER, uri)); new Intent().putExtra(Intent.EXTRA_REFERRER, uri)).get());
assertNotEquals(activity.getCurrentReferrer(), referrer); assertNotEquals(activity.getCurrentReferrer(), referrer);
} }
@@ -340,8 +393,8 @@ public class SettingsHomepageActivityTest {
public void getCurrentReferrer_hasReferrerNameExtra_shouldNotEqual() { public void getCurrentReferrer_hasReferrerNameExtra_shouldNotEqual() {
String referrer = "com.abc"; String referrer = "com.abc";
SettingsHomepageActivity activity = SettingsHomepageActivity activity =
spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get()); spy(Robolectric.buildActivity(SettingsHomepageActivity.class,
activity.setIntent(new Intent().putExtra(Intent.EXTRA_REFERRER_NAME, referrer)); new Intent().putExtra(Intent.EXTRA_REFERRER_NAME, referrer)).get());
assertNotEquals(activity.getCurrentReferrer(), referrer); assertNotEquals(activity.getCurrentReferrer(), referrer);
} }

View File

@@ -17,6 +17,7 @@
package com.android.settings.testutils.shadow; package com.android.settings.testutils.shadow;
import static android.os.Build.VERSION_CODES.LOLLIPOP; 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 static android.os.UserManager.USER_TYPE_PROFILE_PRIVATE;
import android.annotation.UserIdInt; import android.annotation.UserIdInt;
@@ -76,6 +77,7 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager
public void addProfile(UserInfo userInfo) { public void addProfile(UserInfo userInfo) {
mUserProfileInfos.add(userInfo); mUserProfileInfos.add(userInfo);
mUserInfoMap.put(userInfo.id, userInfo);
} }
@Resetter @Resetter
@@ -100,8 +102,7 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager
public void addProfile( public void addProfile(
int userHandle, int profileUserHandle, String profileName, int profileFlags) { int userHandle, int profileUserHandle, String profileName, int profileFlags) {
UserInfo profileUserInfo = new UserInfo(profileUserHandle, profileName, profileFlags); UserInfo profileUserInfo = new UserInfo(profileUserHandle, profileName, profileFlags);
mUserProfileInfos.add(profileUserInfo); addProfile(profileUserInfo);
mUserInfoMap.put(profileUserHandle, profileUserInfo);
mProfileToParent.put(profileUserHandle, userHandle); mProfileToParent.put(profileUserHandle, userHandle);
if (profileFlags == UserInfo.FLAG_MANAGED_PROFILE) { if (profileFlags == UserInfo.FLAG_MANAGED_PROFILE) {
setManagedProfiles(new HashSet<>(Arrays.asList(profileUserHandle))); setManagedProfiles(new HashSet<>(Arrays.asList(profileUserHandle)));
@@ -179,8 +180,7 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager
} }
public static ShadowUserManager getShadow() { public static ShadowUserManager getShadow() {
return (ShadowUserManager) Shadow.extract( return Shadow.extract(RuntimeEnvironment.application.getSystemService(UserManager.class));
RuntimeEnvironment.application.getSystemService(UserManager.class));
} }
@Implementation @Implementation
@@ -229,10 +229,23 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager
public void setManagedProfiles(Set<Integer> profileIds) { public void setManagedProfiles(Set<Integer> profileIds) {
mManagedProfiles.clear(); mManagedProfiles.clear();
mManagedProfiles.addAll(profileIds); 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) { 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) { public void setUserSwitcherEnabled(boolean userSwitchEnabled) {