Remove Users & profiles header for phones

In Settings/Users, remove "Users & profiles" header is no longer displayed
for phones. List of UserPreference is now explicitly sorted. Before, it
was relying on an overridden compareTo method in UserPreference, which
behavior was difficult to predict when instances of UserPreference were
mixed with other instances in the same group.

Bug:17630523
Change-Id: Iba1ef863c2cd4e8ca307ae0aa0877c5cd9e0973d
diff --git a/src/com/android/settings/users/UserPreference.java b/src/com/android/settings/users/UserPreference.java
index 23359ec..5079dd2 100644
--- a/src/com/android/settings/users/UserPreference.java
+++ b/src/com/android/settings/users/UserPreference.java
@@ -26,10 +26,26 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 
+import java.util.Comparator;
+
 public class UserPreference extends Preference {
 
     public static final int USERID_UNKNOWN = -10;
     public static final int USERID_GUEST_DEFAULTS = -11;
+    public static final Comparator<UserPreference> SERIAL_NUMBER_COMPARATOR =
+            new Comparator<UserPreference>() {
+                @Override
+                public int compare(UserPreference p1, UserPreference p2) {
+                    int sn1 = p1.getSerialNumber();
+                    int sn2 = p2.getSerialNumber();
+                    if (sn1 < sn2) {
+                        return -1;
+                    } else if (sn1 > sn2) {
+                        return 1;
+                    }
+                    return 0;
+                }
+            };
 
     private OnClickListener mDeleteClickListener;
     private OnClickListener mSettingsClickListener;
@@ -105,12 +121,4 @@
     public int getUserId() {
         return mUserId;
     }
-
-    public int compareTo(Preference another) {
-        if (another instanceof UserPreference) {
-            return getSerialNumber() > ((UserPreference) another).getSerialNumber() ? 1 : -1;
-        } else {
-            return 1;
-        }
-    }
 }
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index d7923ee..4ee5cf4 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -44,6 +44,7 @@
 import android.preference.Preference;
 import android.preference.Preference.OnPreferenceClickListener;
 import android.preference.PreferenceGroup;
+import android.preference.PreferenceScreen;
 import android.provider.Settings;
 import android.provider.Settings.Secure;
 import android.util.Log;
@@ -67,6 +68,7 @@
 import com.android.settings.drawable.CircleFramedDrawable;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 
@@ -123,13 +125,14 @@
     private static final String KEY_SUMMARY = "summary";
 
     private PreferenceGroup mUserListCategory;
-    private Preference mMePreference;
+    private UserPreference mMePreference;
     private SelectableEditTextPreference mNicknamePreference;
     private Preference mAddUser;
     private int mRemovingUserId = -1;
     private int mAddedUserId = 0;
     private boolean mAddingUser;
     private boolean mEnabled = true;
+    private boolean mCanAddUser = true;
     private boolean mCanAddRestrictedProfile = true;
 
     private final Object mUserLock = new Object();
@@ -212,17 +215,21 @@
             mMePreference.setSummary(R.string.user_owner);
         }
         mAddUser = findPreference(KEY_ADD_USER);
+        DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(
+                Context.DEVICE_POLICY_SERVICE);
+        // No restricted profiles for tablets with a device owner, or phones.
+        if (dpm.getDeviceOwner() != null || Utils.isVoiceCapable(context)) {
+            mCanAddRestrictedProfile = false;
+        }
+        // Determine if add user/profile button should be visible
         if (!mIsOwner || UserManager.getMaxSupportedUsers() < 2
                 || !UserManager.supportsMultipleUsers()
                 || mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)) {
-            removePreference(KEY_ADD_USER);
+            mCanAddUser = false;
         } else {
             mAddUser.setOnPreferenceClickListener(this);
-            DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(
-                    Context.DEVICE_POLICY_SERVICE);
-            // No restricted profiles for tablets with a device owner, or phones.
-            if (dpm.getDeviceOwner() != null || Utils.isVoiceCapable(context)) {
-                mCanAddRestrictedProfile = false;
+            // change label to only mention user, if restricted profiles are not supported
+            if (!mCanAddRestrictedProfile) {
                 mAddUser.setTitle(R.string.user_add_user_menu);
             }
         }
@@ -712,18 +719,17 @@
         List<UserInfo> users = mUserManager.getUsers(true);
         final Context context = getActivity();
 
-        mUserListCategory.removeAll();
-        mUserListCategory.setOrderingAsAdded(false);
-        mUserListCategory.addPreference(mMePreference);
-
         final boolean voiceCapable = Utils.isVoiceCapable(context);
-        final ArrayList<Integer> missingIcons = new ArrayList<Integer>();
+        final ArrayList<Integer> missingIcons = new ArrayList<>();
+        final ArrayList<UserPreference> userPreferences = new ArrayList<>();
+        userPreferences.add(mMePreference);
+
         for (UserInfo user : users) {
             if (user.isManagedProfile()) {
                 // Managed profiles appear under Accounts Settings instead
                 continue;
             }
-            Preference pref;
+            UserPreference pref;
             if (user.id == UserHandle.myUserId()) {
                 pref = mMePreference;
             } else if (user.isGuest()) {
@@ -746,7 +752,7 @@
                         showDelete ? this : null);
                 pref.setOnPreferenceClickListener(this);
                 pref.setKey("id=" + user.id);
-                mUserListCategory.addPreference(pref);
+                userPreferences.add(pref);
                 if (user.id == UserHandle.USER_OWNER) {
                     pref.setSummary(R.string.user_owner);
                 }
@@ -777,14 +783,66 @@
 
         // Add a temporary entry for the user being created
         if (mAddingUser) {
-            Preference pref = new UserPreference(getActivity(), null, UserPreference.USERID_UNKNOWN,
-                    null, null);
+            UserPreference pref = new UserPreference(getActivity(), null,
+                    UserPreference.USERID_UNKNOWN, null, null);
             pref.setEnabled(false);
             pref.setTitle(R.string.user_new_user_name);
             pref.setIcon(getEncircledDefaultIcon());
-            mUserListCategory.addPreference(pref);
+            userPreferences.add(pref);
         }
 
+        if (shouldShowGuestUserPreference(users)) {
+            // Add a virtual Guest user for guest defaults
+            UserPreference pref = new UserPreference(getActivity(), null,
+                    UserPreference.USERID_GUEST_DEFAULTS,
+                    mIsOwner && voiceCapable? this : null /* settings icon handler */,
+                    null /* delete icon handler */);
+            pref.setTitle(R.string.user_guest);
+            pref.setIcon(getEncircledDefaultIcon());
+            pref.setOnPreferenceClickListener(this);
+            userPreferences.add(pref);
+        }
+
+        // Sort list of users by serialNum
+        Collections.sort(userPreferences, UserPreference.SERIAL_NUMBER_COMPARATOR);
+
+        getActivity().invalidateOptionsMenu();
+
+        // Load the icons
+        if (missingIcons.size() > 0) {
+            loadIconsAsync(missingIcons);
+        }
+
+        PreferenceScreen preferenceScreen = getPreferenceScreen();
+        preferenceScreen.removeAll();
+
+        // If profiles are supported, userPreferences will be added to the category labeled
+        // "User & Profiles", otherwise the category is skipped and elements are added directly
+        // to preferenceScreen
+        PreferenceGroup groupToAddUsers;
+        if (mCanAddRestrictedProfile) {
+            mUserListCategory.removeAll();
+            mUserListCategory.setOrder(Preference.DEFAULT_ORDER);
+            preferenceScreen.addPreference(mUserListCategory);
+            groupToAddUsers = mUserListCategory;
+        } else {
+            groupToAddUsers = preferenceScreen;
+        }
+        for (UserPreference userPreference : userPreferences) {
+            userPreference.setOrder(Preference.DEFAULT_ORDER);
+            groupToAddUsers.addPreference(userPreference);
+        }
+
+        // Append Add user to the end of the list
+        if (mCanAddUser) {
+            boolean moreUsers = mUserManager.canAddMoreUsers();
+            mAddUser.setEnabled(moreUsers);
+            mAddUser.setOrder(Preference.DEFAULT_ORDER);
+            preferenceScreen.addPreference(mAddUser);
+        }
+    }
+
+    private boolean shouldShowGuestUserPreference(List<UserInfo> users) {
         boolean showGuestPreference = !mIsGuest;
         // If user has DISALLOW_ADD_USER don't allow creating a guest either.
         if (showGuestPreference && mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)) {
@@ -797,28 +855,10 @@
                 }
             }
         }
-        if (showGuestPreference) {
-            // Add a virtual Guest user for guest defaults
-            Preference pref = new UserPreference(getActivity(), null,
-                    UserPreference.USERID_GUEST_DEFAULTS,
-                    mIsOwner && voiceCapable? this : null /* settings icon handler */,
-                    null /* delete icon handler */);
-            pref.setTitle(R.string.user_guest);
-            pref.setIcon(getEncircledDefaultIcon());
-            pref.setOnPreferenceClickListener(this);
-            mUserListCategory.addPreference(pref);
-        }
-
-        getActivity().invalidateOptionsMenu();
-
-        // Load the icons
-        if (missingIcons.size() > 0) {
-            loadIconsAsync(missingIcons);
-        }
-        boolean moreUsers = mUserManager.canAddMoreUsers();
-        mAddUser.setEnabled(moreUsers);
+        return showGuestPreference;
     }
 
+
     private void loadIconsAsync(List<Integer> missingIcons) {
         final Resources resources = getResources();
         new AsyncTask<List<Integer>, Void, Void>() {