diff --git a/src/com/android/settings/activityembedding/EmbeddedDeepLinkUtils.kt b/src/com/android/settings/activityembedding/EmbeddedDeepLinkUtils.kt index 2bc8cda14ed..ab32fc19e29 100644 --- a/src/com/android/settings/activityembedding/EmbeddedDeepLinkUtils.kt +++ b/src/com/android/settings/activityembedding/EmbeddedDeepLinkUtils.kt @@ -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( diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java index 48d918c0a0b..566136d887f 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -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()) diff --git a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java index 4c2d7455745..785313d83ab 100644 --- a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java +++ b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java @@ -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 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() { - SettingsHomepageActivity activity = - spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get()); - doReturn(activity.getPackageName()).when(activity).getCurrentReferrer(); String referrer = "com.abc"; - activity.setIntent(new Intent().putExtra(SettingsHomepageActivity.EXTRA_INITIAL_REFERRER, - referrer)); + SettingsHomepageActivity activity = + spy(Robolectric.buildActivity(SettingsHomepageActivity.class, + new Intent().putExtra(SettingsHomepageActivity.EXTRA_INITIAL_REFERRER, + referrer)).get()); + doReturn(activity.getPackageName()).when(activity).getCurrentReferrer(); 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); } diff --git a/tests/robotests/testutils/com/android/settings/testutils/shadow/ShadowUserManager.java b/tests/robotests/testutils/com/android/settings/testutils/shadow/ShadowUserManager.java index 23df4ca9218..dfcb7ee71aa 100644 --- a/tests/robotests/testutils/com/android/settings/testutils/shadow/ShadowUserManager.java +++ b/tests/robotests/testutils/com/android/settings/testutils/shadow/ShadowUserManager.java @@ -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 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) {