Merge "Remove Users & profiles header for phones"
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>() {