Merge "Make the order of tabs same as profile creation" into main
diff --git a/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java b/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java
index a70d7d8..3321d50 100644
--- a/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java
+++ b/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java
@@ -57,6 +57,7 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Base fragment class for profile settings.
@@ -295,8 +296,7 @@
                 personalFragmentConstructor,
                 workFragmentConstructor,
                 privateFragmentConstructor,
-                new PrivateSpaceInfoProvider() {},
-                new ManagedProfileInfoProvider() {});
+                new PrivateSpaceInfoProvider() {});
     }
 
     /**
@@ -309,36 +309,35 @@
             FragmentConstructor personalFragmentConstructor,
             FragmentConstructor workFragmentConstructor,
             FragmentConstructor privateFragmentConstructor,
-            PrivateSpaceInfoProvider privateSpaceInfoProvider,
-            ManagedProfileInfoProvider managedProfileInfoProvider) {
+            PrivateSpaceInfoProvider privateSpaceInfoProvider) {
         Fragment[] result = new Fragment[0];
         ArrayList<Fragment> fragments = new ArrayList<>();
 
         try {
-            final Bundle personalOnly = bundle != null ? bundle : new Bundle();
-            personalOnly.putInt(EXTRA_PROFILE, ProfileType.PERSONAL);
-            final Fragment personalFragment =
-                    personalFragmentConstructor.constructAndGetFragment();
-            personalFragment.setArguments(personalOnly);
-            fragments.add(personalFragment);
+            UserManager userManager = context.getSystemService(UserManager.class);
+            List<UserInfo> userInfos = userManager.getProfiles(UserHandle.myUserId());
 
-            if (managedProfileInfoProvider.isManagedProfilePresent(context)) {
-                final Bundle workOnly = bundle != null ? bundle.deepCopy() : new Bundle();
-                workOnly.putInt(EXTRA_PROFILE, ProfileType.WORK);
-                final Fragment workFragment =
-                        workFragmentConstructor.constructAndGetFragment();
-                workFragment.setArguments(workOnly);
-                fragments.add(workFragment);
-            }
-
-            if (Flags.allowPrivateProfile()
-                    && !privateSpaceInfoProvider.isPrivateSpaceLocked(context)) {
-                final Bundle privateOnly = bundle != null ? bundle.deepCopy() : new Bundle();
-                privateOnly.putInt(EXTRA_PROFILE, ProfileType.PRIVATE);
-                final Fragment privateFragment =
-                        privateFragmentConstructor.constructAndGetFragment();
-                privateFragment.setArguments(privateOnly);
-                fragments.add(privateFragment);
+            for (UserInfo userInfo : userInfos) {
+                if (userInfo.getUserHandle().isSystem()) {
+                    fragments.add(createAndGetFragment(
+                            ProfileType.PERSONAL,
+                            bundle != null ? bundle : new Bundle(),
+                            personalFragmentConstructor));
+                } else if (userInfo.isManagedProfile()) {
+                    fragments.add(createAndGetFragment(
+                            ProfileType.WORK,
+                            bundle != null ? bundle.deepCopy() : new Bundle(),
+                            workFragmentConstructor));
+                } else if (Flags.allowPrivateProfile() && userInfo.isPrivateProfile()) {
+                    if (!privateSpaceInfoProvider.isPrivateSpaceLocked(context)) {
+                        fragments.add(createAndGetFragment(
+                                ProfileType.PRIVATE,
+                                bundle != null ? bundle.deepCopy() : new Bundle(),
+                                privateFragmentConstructor));
+                    }
+                } else {
+                    Log.d(TAG, "Not showing tab for unsupported user");
+                }
             }
 
             result = new Fragment[fragments.size()];
@@ -350,6 +349,14 @@
         return result;
     }
 
+    private static Fragment createAndGetFragment(
+            @ProfileType int profileType, Bundle bundle, FragmentConstructor fragmentConstructor) {
+        bundle.putInt(EXTRA_PROFILE, profileType);
+        final Fragment fragment = fragmentConstructor.constructAndGetFragment();
+        fragment.setArguments(bundle);
+        return fragment;
+    }
+
     interface FragmentConstructor {
         Fragment constructAndGetFragment();
     }
@@ -360,13 +367,6 @@
         }
     }
 
-    interface ManagedProfileInfoProvider {
-        default boolean isManagedProfilePresent(Context context) {
-            return Utils.doesProfileOfTypeExists(
-                    context.getSystemService(UserManager.class), ProfileType.WORK);
-        }
-    }
-
     static class ViewPagerAdapter extends FragmentStateAdapter {
 
         private final Fragment[] mChildFragments;
diff --git a/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectFragmentTest.java
index 302c8f3..3df6449 100644
--- a/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectFragmentTest.java
@@ -17,6 +17,9 @@
 package com.android.settings.dashboard.profileselector;
 
 import static android.content.Intent.EXTRA_USER_ID;
+import static android.os.UserManager.USER_TYPE_FULL_SYSTEM;
+import static android.os.UserManager.USER_TYPE_PROFILE_MANAGED;
+import static android.os.UserManager.USER_TYPE_PROFILE_PRIVATE;
 
 import static com.android.settings.dashboard.profileselector.ProfileSelectFragment.EXTRA_PROFILE;
 import static com.android.settings.dashboard.profileselector.ProfileSelectFragment.PERSONAL_TAB;
@@ -30,9 +33,11 @@
 
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.UserInfo;
 import android.os.Bundle;
 import android.os.Flags;
 import android.platform.test.flag.junit.SetFlagsRule;
+import android.util.ArraySet;
 
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentActivity;
@@ -51,7 +56,9 @@
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
+import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 @RunWith(RobolectricTestRunner.class)
@@ -60,6 +67,9 @@
         com.android.settings.testutils.shadow.ShadowFragment.class,
 })
 public class ProfileSelectFragmentTest {
+    private static final String PRIMARY_USER_NAME = "primary";
+    private static final String MANAGED_USER_NAME = "managed";
+    private static final String PRIVATE_USER_NAME = "private";
 
     private Context mContext;
     private TestProfileSelectFragment mFragment;
@@ -151,6 +161,8 @@
     @Test
     public void testGetFragments_whenOnlyPersonal_returnsOneFragment() {
         mSetFlagsRule.disableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+        mUserManager.addProfile(
+                new UserInfo(0, PRIMARY_USER_NAME, null, 0, USER_TYPE_FULL_SYSTEM));
         Fragment[] fragments = ProfileSelectFragment.getFragments(
                 mContext,
                 null /* bundle */,
@@ -162,6 +174,10 @@
 
     @Test
     public void testGetFragments_whenPrivateDisabled_returnsOneFragment() {
+        mUserManager.addProfile(
+                new UserInfo(0, PRIMARY_USER_NAME, null, 0, USER_TYPE_FULL_SYSTEM));
+        mUserManager.addProfile(
+                new UserInfo(11, PRIVATE_USER_NAME, null, 0, USER_TYPE_PROFILE_PRIVATE));
         Fragment[] fragments = ProfileSelectFragment.getFragments(
                 mContext,
                 null /* bundle */,
@@ -173,12 +189,6 @@
                     public boolean isPrivateSpaceLocked(Context context) {
                         return true;
                     }
-                },
-                new ProfileSelectFragment.ManagedProfileInfoProvider() {
-                    @Override
-                    public boolean isManagedProfilePresent(Context context) {
-                        return false;
-                    }
                 });
         assertThat(fragments).hasLength(1);
     }
@@ -186,6 +196,10 @@
     @Test
     public void testGetFragments_whenPrivateEnabled_returnsTwoFragments() {
         mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+        mUserManager.addProfile(
+                new UserInfo(0, PRIMARY_USER_NAME, null, 0, USER_TYPE_FULL_SYSTEM));
+        mUserManager.addProfile(
+                new UserInfo(11, PRIVATE_USER_NAME, null, 0, USER_TYPE_PROFILE_PRIVATE));
         Fragment[] fragments = ProfileSelectFragment.getFragments(
                 mContext,
                 null /* bundle */,
@@ -197,12 +211,6 @@
                     public boolean isPrivateSpaceLocked(Context context) {
                         return false;
                     }
-                },
-                new ProfileSelectFragment.ManagedProfileInfoProvider() {
-                    @Override
-                    public boolean isManagedProfilePresent(Context context) {
-                        return false;
-                    }
                 });
         assertThat(fragments).hasLength(2);
     }
@@ -210,6 +218,10 @@
     @Test
     public void testGetFragments_whenManagedProfile_returnsTwoFragments() {
         mSetFlagsRule.disableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+        mUserManager.addProfile(
+                new UserInfo(0, PRIMARY_USER_NAME, null, 0, USER_TYPE_FULL_SYSTEM));
+        mUserManager.addProfile(
+                new UserInfo(10, MANAGED_USER_NAME, null, 0, USER_TYPE_PROFILE_MANAGED));
         Fragment[] fragments = ProfileSelectFragment.getFragments(
                 mContext,
                 null /* bundle */,
@@ -221,12 +233,6 @@
                     public boolean isPrivateSpaceLocked(Context context) {
                         return false;
                     }
-                },
-                new ProfileSelectFragment.ManagedProfileInfoProvider() {
-                    @Override
-                    public boolean isManagedProfilePresent(Context context) {
-                        return true;
-                    }
                 });
         assertThat(fragments).hasLength(2);
     }
@@ -234,6 +240,12 @@
     @Test
     public void testGetFragments_whenAllProfiles_returnsThreeFragments() {
         mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+        mUserManager.addProfile(
+                new UserInfo(0, PRIMARY_USER_NAME, null, 0, USER_TYPE_FULL_SYSTEM));
+        mUserManager.addProfile(
+                new UserInfo(10, MANAGED_USER_NAME, null, 0, USER_TYPE_PROFILE_MANAGED));
+        mUserManager.addProfile(
+                new UserInfo(11, PRIVATE_USER_NAME, null, 0, USER_TYPE_PROFILE_PRIVATE));
         Fragment[] fragments = ProfileSelectFragment.getFragments(
                 mContext,
                 null /* bundle */,
@@ -245,12 +257,6 @@
                     public boolean isPrivateSpaceLocked(Context context) {
                         return false;
                     }
-                },
-                new ProfileSelectFragment.ManagedProfileInfoProvider() {
-                    @Override
-                    public boolean isManagedProfilePresent(Context context) {
-                        return true;
-                    }
                 });
         assertThat(fragments).hasLength(3);
     }
@@ -258,6 +264,12 @@
     @Test
     public void testGetFragments_whenAvailableBundle_returnsFragmentsWithCorrectBundles() {
         mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+        mUserManager.addProfile(
+                new UserInfo(0, PRIMARY_USER_NAME, null, 0, USER_TYPE_FULL_SYSTEM));
+        mUserManager.addProfile(
+                new UserInfo(10, MANAGED_USER_NAME, null, 0, USER_TYPE_PROFILE_MANAGED));
+        mUserManager.addProfile(
+                new UserInfo(11, PRIVATE_USER_NAME, null, 0, USER_TYPE_PROFILE_PRIVATE));
         Bundle bundle = new Bundle();
         Fragment[] fragments = ProfileSelectFragment.getFragments(
                 mContext,
@@ -270,20 +282,21 @@
                     public boolean isPrivateSpaceLocked(Context context) {
                         return false;
                     }
-                },
-                new ProfileSelectFragment.ManagedProfileInfoProvider() {
-                    @Override
-                    public boolean isManagedProfilePresent(Context context) {
-                        return true;
-                    }
                 });
         assertThat(fragments).hasLength(3);
-        assertThat(fragments[0].getArguments().getInt(EXTRA_PROFILE))
-                .isEqualTo(ProfileSelectFragment.ProfileType.PERSONAL);
-        assertThat(fragments[1].getArguments().getInt(EXTRA_PROFILE))
-                .isEqualTo(ProfileSelectFragment.ProfileType.WORK);
-        assertThat(fragments[2].getArguments().getInt(EXTRA_PROFILE))
-                .isEqualTo(ProfileSelectFragment.ProfileType.PRIVATE);
+
+        List<Integer> foundProfileTypesList = new ArrayList<>();
+        for (Fragment fragment : fragments) {
+            foundProfileTypesList.add(fragment.getArguments().getInt(EXTRA_PROFILE));
+        }
+
+        assertThat(foundProfileTypesList).hasSize(3);
+
+        Set<Integer> foundProfileTypes = new ArraySet<>(foundProfileTypesList);
+        assertThat(foundProfileTypes).containsExactly(
+                ProfileSelectFragment.ProfileType.PERSONAL,
+                ProfileSelectFragment.ProfileType.WORK,
+                ProfileSelectFragment.ProfileType.PRIVATE);
     }
 
     public static class TestProfileSelectFragment extends ProfileSelectFragment {