diff --git a/src/com/android/settings/users/UserPreference.java b/src/com/android/settings/users/UserPreference.java index 23359ecc219..5079dd2eec8 100644 --- a/src/com/android/settings/users/UserPreference.java +++ b/src/com/android/settings/users/UserPreference.java @@ -26,10 +26,26 @@ import android.util.AttributeSet; 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 SERIAL_NUMBER_COMPARATOR = + new Comparator() { + @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 class UserPreference extends Preference { 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 d7923ee1e1c..4ee5cf49af5 100644 --- a/src/com/android/settings/users/UserSettings.java +++ b/src/com/android/settings/users/UserSettings.java @@ -44,6 +44,7 @@ import android.os.UserManager; 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.Utils; 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 @@ public class UserSettings extends SettingsPreferenceFragment 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 @@ public class UserSettings extends SettingsPreferenceFragment 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 @@ public class UserSettings extends SettingsPreferenceFragment List users = mUserManager.getUsers(true); final Context context = getActivity(); - mUserListCategory.removeAll(); - mUserListCategory.setOrderingAsAdded(false); - mUserListCategory.addPreference(mMePreference); - final boolean voiceCapable = Utils.isVoiceCapable(context); - final ArrayList missingIcons = new ArrayList(); + final ArrayList missingIcons = new ArrayList<>(); + final ArrayList 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 @@ public class UserSettings extends SettingsPreferenceFragment 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 @@ public class UserSettings extends SettingsPreferenceFragment // 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 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 @@ public class UserSettings extends SettingsPreferenceFragment } } } - 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 missingIcons) { final Resources resources = getResources(); new AsyncTask, Void, Void>() {