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
This commit is contained in:
Fyodor Kupolov
2014-12-08 14:15:36 -08:00
parent a754c6ba05
commit 5514509963
2 changed files with 93 additions and 45 deletions

View File

@@ -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<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 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;
}
}
}

View File

@@ -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);
if (!mIsOwner || UserManager.getMaxSupportedUsers() < 2
|| !UserManager.supportsMultipleUsers()
|| mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)) {
removePreference(KEY_ADD_USER);
} 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;
}
// Determine if add user/profile button should be visible
if (!mIsOwner || UserManager.getMaxSupportedUsers() < 2
|| !UserManager.supportsMultipleUsers()
|| mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)) {
mCanAddUser = false;
} else {
mAddUser.setOnPreferenceClickListener(this);
// 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<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 @@ 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<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,27 +855,9 @@ 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);
return showGuestPreference;
}
getActivity().invalidateOptionsMenu();
// Load the icons
if (missingIcons.size() > 0) {
loadIconsAsync(missingIcons);
}
boolean moreUsers = mUserManager.canAddMoreUsers();
mAddUser.setEnabled(moreUsers);
}
private void loadIconsAsync(List<Integer> missingIcons) {
final Resources resources = getResources();