From 5514509963b7d09cbb7d893d110afbc91814a7e4 Mon Sep 17 00:00:00 2001 From: Fyodor Kupolov Date: Mon, 8 Dec 2014 14:15:36 -0800 Subject: [PATCH] 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 --- .../settings/users/UserPreference.java | 24 ++-- .../android/settings/users/UserSettings.java | 114 ++++++++++++------ 2 files changed, 93 insertions(+), 45 deletions(-) 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>() {