summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/users/UserSettings.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/users/UserSettings.java')
-rw-r--r--src/com/android/settings/users/UserSettings.java411
1 files changed, 297 insertions, 114 deletions
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index bbae37d..b95c397 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -16,16 +16,13 @@
package com.android.settings.users;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.Activity;
import android.app.ActivityManagerNative;
import android.app.AlertDialog;
import android.app.Dialog;
+import android.app.Fragment;
import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -36,7 +33,6 @@ import android.content.SharedPreferences;
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
@@ -47,10 +43,8 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
-import android.preference.PreferenceActivity;
import android.preference.PreferenceGroup;
-import android.provider.ContactsContract;
-import android.provider.ContactsContract.Contacts;
+import android.provider.Settings;
import android.provider.Settings.Secure;
import android.util.Log;
import android.util.SparseArray;
@@ -61,17 +55,33 @@ import android.view.View;
import android.view.View.OnClickListener;
import android.widget.SimpleAdapter;
+import com.android.internal.util.UserIcons;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.ChooseLockGeneric;
import com.android.settings.OwnerInfoSettings;
import com.android.settings.R;
-import com.android.settings.RestrictedSettingsFragment;
import com.android.settings.SelectableEditTextPreference;
+import com.android.settings.SettingsActivity;
+import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
+import com.android.settings.drawable.CircleFramedDrawable;
-public class UserSettings extends RestrictedSettingsFragment
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Screen that manages the list of users on the device.
+ * Guest user is an always visible entry, even if the guest is not currently
+ * active/created. It is meant for controlling properties of a guest user.
+ *
+ * The first one is always the current user.
+ * Owner is the primary user.
+ */
+public class UserSettings extends SettingsPreferenceFragment
implements OnPreferenceClickListener, OnClickListener, DialogInterface.OnDismissListener,
- Preference.OnPreferenceChangeListener {
+ Preference.OnPreferenceChangeListener,
+ EditUserInfoController.OnContentChangedCallback {
private static final String TAG = "UserSettings";
@@ -85,6 +95,7 @@ public class UserSettings extends RestrictedSettingsFragment
private static final String KEY_ADD_USER = "user_add";
private static final int MENU_REMOVE_USER = Menu.FIRST;
+ private static final int MENU_ADD_ON_LOCKSCREEN = Menu.FIRST + 1;
private static final int DIALOG_CONFIRM_REMOVE = 1;
private static final int DIALOG_ADD_USER = 2;
@@ -93,6 +104,8 @@ public class UserSettings extends RestrictedSettingsFragment
private static final int DIALOG_USER_CANNOT_MANAGE = 5;
private static final int DIALOG_CHOOSE_USER_TYPE = 6;
private static final int DIALOG_NEED_LOCKSCREEN = 7;
+ private static final int DIALOG_CONFIRM_EXIT_GUEST = 8;
+ private static final int DIALOG_USER_PROFILE_EDITOR = 9;
private static final int MESSAGE_UPDATE_LIST = 1;
private static final int MESSAGE_SETUP_USER = 2;
@@ -106,17 +119,6 @@ public class UserSettings extends RestrictedSettingsFragment
private static final String KEY_ADD_USER_LONG_MESSAGE_DISPLAYED =
"key_add_user_long_message_displayed";
- static final int[] USER_DRAWABLES = {
- R.drawable.avatar_default_1,
- R.drawable.avatar_default_2,
- R.drawable.avatar_default_3,
- R.drawable.avatar_default_4,
- R.drawable.avatar_default_5,
- R.drawable.avatar_default_6,
- R.drawable.avatar_default_7,
- R.drawable.avatar_default_8
- };
-
private static final String KEY_TITLE = "title";
private static final String KEY_SUMMARY = "summary";
@@ -127,16 +129,20 @@ public class UserSettings extends RestrictedSettingsFragment
private int mRemovingUserId = -1;
private int mAddedUserId = 0;
private boolean mAddingUser;
- private boolean mProfileExists;
+ private boolean mEnabled = true;
+ private boolean mCanAddRestrictedProfile = true;
private final Object mUserLock = new Object();
private UserManager mUserManager;
private SparseArray<Bitmap> mUserIcons = new SparseArray<Bitmap>();
private boolean mIsOwner = UserHandle.myUserId() == UserHandle.USER_OWNER;
+ private boolean mIsGuest;
- public UserSettings() {
- super(RestrictedSettingsFragment.RESTRICTIONS_PIN_SET);
- }
+ private EditUserInfoController mEditUserInfoController =
+ new EditUserInfoController();
+
+ // A place to cache the generated default avatar
+ private Drawable mDefaultIconDrawable;
private Handler mHandler = new Handler() {
@Override
@@ -181,34 +187,59 @@ public class UserSettings extends RestrictedSettingsFragment
if (icicle.containsKey(SAVE_REMOVING_USER)) {
mRemovingUserId = icicle.getInt(SAVE_REMOVING_USER);
}
+ mEditUserInfoController.onRestoreInstanceState(icicle);
+ }
+ final Context context = getActivity();
+ mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
+ boolean hasMultipleUsers = mUserManager.getUserCount() > 1;
+ if ((!UserManager.supportsMultipleUsers() && !hasMultipleUsers)
+ || Utils.isMonkeyRunning()) {
+ mEnabled = false;
+ return;
}
- mUserManager = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
+ final int myUserId = UserHandle.myUserId();
+ mIsGuest = mUserManager.getUserInfo(myUserId).isGuest();
+
addPreferencesFromResource(R.xml.user_settings);
mUserListCategory = (PreferenceGroup) findPreference(KEY_USER_LIST);
- mMePreference = new UserPreference(getActivity(), null, UserHandle.myUserId(),
- mUserManager.isLinkedUser() ? null : this, null);
+ mMePreference = new UserPreference(context, null /* attrs */, myUserId,
+ null /* settings icon handler */,
+ null /* delete icon handler */);
mMePreference.setKey(KEY_USER_ME);
mMePreference.setOnPreferenceClickListener(this);
if (mIsOwner) {
mMePreference.setSummary(R.string.user_owner);
}
mAddUser = findPreference(KEY_ADD_USER);
- mAddUser.setOnPreferenceClickListener(this);
- if (!mIsOwner || UserManager.getMaxSupportedUsers() < 2) {
+ 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;
+ mAddUser.setTitle(R.string.user_add_user_menu);
+ }
}
loadProfile();
setHasOptionsMenu(true);
IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED);
filter.addAction(Intent.ACTION_USER_INFO_CHANGED);
- getActivity().registerReceiverAsUser(mUserChangeReceiver, UserHandle.ALL, filter, null,
+ context.registerReceiverAsUser(mUserChangeReceiver, UserHandle.ALL, filter, null,
mHandler);
}
@Override
public void onResume() {
super.onResume();
+
+ if (!mEnabled) return;
+
loadProfile();
updateUserList();
}
@@ -216,26 +247,43 @@ public class UserSettings extends RestrictedSettingsFragment
@Override
public void onDestroy() {
super.onDestroy();
+
+ if (!mEnabled) return;
+
getActivity().unregisterReceiver(mUserChangeReceiver);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
-
+ mEditUserInfoController.onSaveInstanceState(outState);
outState.putInt(SAVE_ADDING_USER, mAddedUserId);
outState.putInt(SAVE_REMOVING_USER, mRemovingUserId);
}
@Override
+ public void startActivityForResult(Intent intent, int requestCode) {
+ mEditUserInfoController.startingActivityForResult();
+ super.startActivityForResult(intent, requestCode);
+ }
+
+ @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ int pos = 0;
UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
if (!mIsOwner && !um.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)) {
String nickname = mUserManager.getUserName();
- MenuItem removeThisUser = menu.add(0, MENU_REMOVE_USER, 0,
+ MenuItem removeThisUser = menu.add(0, MENU_REMOVE_USER, pos++,
getResources().getString(R.string.user_remove_user_menu, nickname));
removeThisUser.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
}
+ if (mIsOwner && !um.hasUserRestriction(UserManager.DISALLOW_ADD_USER)) {
+ MenuItem allowAddOnLockscreen = menu.add(0, MENU_ADD_ON_LOCKSCREEN, pos++,
+ R.string.user_add_on_lockscreen_menu);
+ allowAddOnLockscreen.setCheckable(true);
+ allowAddOnLockscreen.setChecked(Settings.Global.getInt(getContentResolver(),
+ Settings.Global.ADD_USERS_WHEN_LOCKED, 0) == 1);
+ }
super.onCreateOptionsMenu(menu, inflater);
}
@@ -245,13 +293,28 @@ public class UserSettings extends RestrictedSettingsFragment
if (itemId == MENU_REMOVE_USER) {
onRemoveUserClicked(UserHandle.myUserId());
return true;
+ } else if (itemId == MENU_ADD_ON_LOCKSCREEN) {
+ final boolean isChecked = item.isChecked();
+ Settings.Global.putInt(getContentResolver(), Settings.Global.ADD_USERS_WHEN_LOCKED,
+ isChecked ? 0 : 1);
+ item.setChecked(!isChecked);
+ return true;
} else {
return super.onOptionsItemSelected(item);
}
}
+ /**
+ * Loads profile information for the current user.
+ */
private void loadProfile() {
- mProfileExists = false;
+ if (mIsGuest) {
+ // No need to load profile information
+ mMePreference.setIcon(getEncircledDefaultIcon());
+ mMePreference.setTitle(R.string.user_exit_guest_title);
+ return;
+ }
+
new AsyncTask<Void, Void, String>() {
@Override
protected void onPostExecute(String result) {
@@ -264,11 +327,7 @@ public class UserSettings extends RestrictedSettingsFragment
if (user.iconPath == null || user.iconPath.equals("")) {
assignProfilePhoto(user);
}
- String profileName = getProfileName();
- if (profileName == null) {
- profileName = user.name;
- }
- return profileName;
+ return user.name;
}
}.execute();
}
@@ -303,9 +362,9 @@ public class UserSettings extends RestrictedSettingsFragment
if (requestCode == REQUEST_CHOOSE_LOCK) {
if (resultCode != Activity.RESULT_CANCELED && hasLockscreenSecurity()) {
addUserNow(USER_TYPE_RESTRICTED_PROFILE);
- } else {
- showDialog(DIALOG_NEED_LOCKSCREEN);
}
+ } else {
+ mEditUserInfoController.onActivityResult(requestCode, resultCode, data);
}
}
@@ -338,19 +397,18 @@ public class UserSettings extends RestrictedSettingsFragment
}
private UserInfo createLimitedUser() {
- UserInfo newUserInfo = mUserManager.createUser(
+ UserInfo newUserInfo = mUserManager.createSecondaryUser(
getResources().getString(R.string.user_new_profile_name),
UserInfo.FLAG_RESTRICTED);
int userId = newUserInfo.id;
UserHandle user = new UserHandle(userId);
mUserManager.setUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS, true, user);
+ // Change the setting before applying the DISALLOW_SHARE_LOCATION restriction, otherwise
+ // the putIntForUser() will fail.
+ Secure.putIntForUser(getContentResolver(),
+ Secure.LOCATION_MODE, Secure.LOCATION_MODE_OFF, userId);
mUserManager.setUserRestriction(UserManager.DISALLOW_SHARE_LOCATION, true, user);
- Secure.putStringForUser(getContentResolver(),
- Secure.LOCATION_PROVIDERS_ALLOWED, "", userId);
- Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
- UserSettings.USER_DRAWABLES[
- userId % UserSettings.USER_DRAWABLES.length]);
- mUserManager.setUserIcon(userId, bitmap);
+ assignDefaultPhoto(newUserInfo);
// Add shared accounts
AccountManager am = AccountManager.get(getActivity());
Account [] accounts = am.getAccounts();
@@ -363,7 +421,7 @@ public class UserSettings extends RestrictedSettingsFragment
}
private UserInfo createTrustedUser() {
- UserInfo newUserInfo = mUserManager.createUser(
+ UserInfo newUserInfo = mUserManager.createSecondaryUser(
getResources().getString(R.string.user_new_user_name), 0);
if (newUserInfo != null) {
assignDefaultPhoto(newUserInfo);
@@ -372,12 +430,20 @@ public class UserSettings extends RestrictedSettingsFragment
}
private void onManageUserClicked(int userId, boolean newUser) {
+ if (userId == UserPreference.USERID_GUEST_DEFAULTS) {
+ Bundle extras = new Bundle();
+ extras.putBoolean(UserDetailsSettings.EXTRA_USER_GUEST, true);
+ ((SettingsActivity) getActivity()).startPreferencePanel(
+ UserDetailsSettings.class.getName(),
+ extras, R.string.user_guest, null, null, 0);
+ return;
+ }
UserInfo info = mUserManager.getUserInfo(userId);
if (info.isRestricted() && mIsOwner) {
Bundle extras = new Bundle();
extras.putInt(RestrictedProfileSettings.EXTRA_USER_ID, userId);
extras.putBoolean(RestrictedProfileSettings.EXTRA_NEW_USER, newUser);
- ((PreferenceActivity) getActivity()).startPreferencePanel(
+ ((SettingsActivity) getActivity()).startPreferencePanel(
RestrictedProfileSettings.class.getName(),
extras, R.string.user_restrictions_title, null,
null, 0);
@@ -390,9 +456,19 @@ public class UserSettings extends RestrictedSettingsFragment
int titleResId = info.id == UserHandle.USER_OWNER ? R.string.owner_info_settings_title
: (info.isRestricted() ? R.string.profile_info_settings_title
: R.string.user_info_settings_title);
- ((PreferenceActivity) getActivity()).startPreferencePanel(
+ ((SettingsActivity) getActivity()).startPreferencePanel(
OwnerInfoSettings.class.getName(),
extras, titleResId, null, null, 0);
+ } else if (mIsOwner) {
+ Bundle extras = new Bundle();
+ extras.putInt(UserDetailsSettings.EXTRA_USER_ID, userId);
+ ((SettingsActivity) getActivity()).startPreferencePanel(
+ UserDetailsSettings.class.getName(),
+ extras,
+ -1, /* No title res id */
+ info.name, /* title */
+ null, /* resultTo */
+ 0 /* resultRequestCode */);
}
}
@@ -418,25 +494,14 @@ public class UserSettings extends RestrictedSettingsFragment
if (context == null) return null;
switch (dialogId) {
case DIALOG_CONFIRM_REMOVE: {
- Dialog dlg = new AlertDialog.Builder(getActivity())
- .setTitle(UserHandle.myUserId() == mRemovingUserId
- ? R.string.user_confirm_remove_self_title
- : (mUserManager.getUserInfo(mRemovingUserId).isRestricted()
- ? R.string.user_profile_confirm_remove_title
- : R.string.user_confirm_remove_title))
- .setMessage(UserHandle.myUserId() == mRemovingUserId
- ? R.string.user_confirm_remove_self_message
- : (mUserManager.getUserInfo(mRemovingUserId).isRestricted()
- ? R.string.user_profile_confirm_remove_message
- : R.string.user_confirm_remove_message))
- .setPositiveButton(R.string.user_delete_button,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- removeUserNow();
- }
- })
- .setNegativeButton(android.R.string.cancel, null)
- .create();
+ Dialog dlg =
+ Utils.createRemoveConfirmationDialog(getActivity(), mRemovingUserId,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ removeUserNow();
+ }
+ }
+ );
return dlg;
}
case DIALOG_USER_CANNOT_MANAGE:
@@ -537,6 +602,31 @@ public class UserSettings extends RestrictedSettingsFragment
.create();
return dlg;
}
+ case DIALOG_CONFIRM_EXIT_GUEST: {
+ Dialog dlg = new AlertDialog.Builder(context)
+ .setTitle(R.string.user_exit_guest_confirm_title)
+ .setMessage(R.string.user_exit_guest_confirm_message)
+ .setPositiveButton(R.string.user_exit_guest_dialog_remove,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ exitGuest();
+ }
+ })
+ .setNegativeButton(android.R.string.cancel, null)
+ .create();
+ return dlg;
+ }
+ case DIALOG_USER_PROFILE_EDITOR: {
+ Dialog dlg = mEditUserInfoController.createDialog(
+ (Fragment) this,
+ mMePreference.getIcon(),
+ mMePreference.getTitle(),
+ R.string.profile_info_settings_title,
+ this /* callback */,
+ android.os.Process.myUserHandle());
+ return dlg;
+ }
default:
return null;
}
@@ -604,23 +694,54 @@ public class UserSettings extends RestrictedSettingsFragment
}
}
+ /**
+ * Erase the current user (guest) and switch to another user.
+ */
+ private void exitGuest() {
+ // Just to be safe
+ if (!mIsGuest) {
+ return;
+ }
+ removeThisUser();
+ }
+
private void updateUserList() {
if (getActivity() == null) return;
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>();
for (UserInfo user : users) {
+ if (user.isManagedProfile()) {
+ // Managed profiles appear under Accounts Settings instead
+ continue;
+ }
Preference pref;
if (user.id == UserHandle.myUserId()) {
pref = mMePreference;
+ } else if (user.isGuest()) {
+ // Skip over Guest. We add generic Guest settings after this loop
+ continue;
} else {
- pref = new UserPreference(getActivity(), null, user.id,
- mIsOwner && user.isRestricted() ? this : null,
- mIsOwner ? this : null);
+ // With Telephony:
+ // Secondary user: Settings
+ // Guest: Settings
+ // Restricted Profile: There is no Restricted Profile
+ // Without Telephony:
+ // Secondary user: Delete
+ // Guest: Nothing
+ // Restricted Profile: Settings
+ final boolean showSettings = mIsOwner && (voiceCapable || user.isRestricted());
+ final boolean showDelete = mIsOwner
+ && (!voiceCapable && !user.isRestricted() && !user.isGuest());
+ pref = new UserPreference(context, null, user.id,
+ showSettings ? this : null,
+ showDelete ? this : null);
pref.setOnPreferenceClickListener(this);
pref.setKey("id=" + user.id);
mUserListCategory.addPreference(pref);
@@ -630,37 +751,69 @@ public class UserSettings extends RestrictedSettingsFragment
pref.setTitle(user.name);
}
if (!isInitialized(user)) {
- pref.setSummary(user.isRestricted()
- ? R.string.user_summary_restricted_not_set_up
- : R.string.user_summary_not_set_up);
+ if (user.isRestricted()) {
+ pref.setSummary(R.string.user_summary_restricted_not_set_up);
+ } else {
+ pref.setSummary(R.string.user_summary_not_set_up);
+ }
} else if (user.isRestricted()) {
pref.setSummary(R.string.user_summary_restricted_profile);
}
if (user.iconPath != null) {
if (mUserIcons.get(user.id) == null) {
+ // Icon not loaded yet, print a placeholder
missingIcons.add(user.id);
- pref.setIcon(encircle(R.drawable.avatar_default_1));
+ pref.setIcon(getEncircledDefaultIcon());
} else {
setPhotoId(pref, user);
}
+ } else {
+ // Icon not available yet, print a placeholder
+ pref.setIcon(getEncircledDefaultIcon());
}
}
+
// Add a temporary entry for the user being created
if (mAddingUser) {
Preference pref = new UserPreference(getActivity(), null, UserPreference.USERID_UNKNOWN,
null, null);
pref.setEnabled(false);
pref.setTitle(R.string.user_new_user_name);
- pref.setIcon(encircle(R.drawable.avatar_default_1));
+ pref.setIcon(getEncircledDefaultIcon());
+ mUserListCategory.addPreference(pref);
+ }
+
+ boolean showGuestPreference = !mIsGuest;
+ // If user has DISALLOW_ADD_USER don't allow creating a guest either.
+ if (showGuestPreference && mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)) {
+ showGuestPreference = false;
+ // If guest already exists, no user creation needed.
+ for (UserInfo user : users) {
+ if (user.isGuest()) {
+ showGuestPreference = true;
+ break;
+ }
+ }
+ }
+ 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.getMaxSupportedUsers() > users.size();
+ boolean moreUsers = mUserManager.canAddMoreUsers();
mAddUser.setEnabled(moreUsers);
}
@@ -676,6 +829,10 @@ public class UserSettings extends RestrictedSettingsFragment
protected Void doInBackground(List<Integer>... values) {
for (int userId : values[0]) {
Bitmap bitmap = mUserManager.getUserIcon(userId);
+ if (bitmap == null) {
+ bitmap = UserIcons.convertToBitmap(UserIcons.getDefaultUserIcon(userId,
+ /* light= */ false));
+ }
mUserIcons.append(userId, bitmap);
}
return null;
@@ -689,20 +846,20 @@ public class UserSettings extends RestrictedSettingsFragment
}
}
- private String getProfileName() {
- String name = Utils.getMeProfileName(getActivity(), true);
- if (name != null) {
- mProfileExists = true;
- }
- return name;
- }
-
private void assignDefaultPhoto(UserInfo user) {
- Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
- USER_DRAWABLES[user.id % USER_DRAWABLES.length]);
+ Bitmap bitmap = UserIcons.convertToBitmap(UserIcons.getDefaultUserIcon(user.id,
+ /* light= */ false));
mUserManager.setUserIcon(user.id, bitmap);
}
+ private Drawable getEncircledDefaultIcon() {
+ if (mDefaultIconDrawable == null) {
+ mDefaultIconDrawable = encircle(UserIcons.convertToBitmap(
+ UserIcons.getDefaultUserIcon(UserHandle.USER_NULL, /* light= */ false)));
+ }
+ return mDefaultIconDrawable;
+ }
+
private void setPhotoId(Preference pref, UserInfo user) {
Bitmap bitmap = mUserIcons.get(user.id);
if (bitmap != null) {
@@ -719,51 +876,67 @@ public class UserSettings extends RestrictedSettingsFragment
@Override
public boolean onPreferenceClick(Preference pref) {
if (pref == mMePreference) {
- Intent editProfile;
- if (!mProfileExists) {
- editProfile = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
- // TODO: Make this a proper API
- editProfile.putExtra("newLocalProfile", true);
- } else {
- editProfile = new Intent(Intent.ACTION_EDIT, ContactsContract.Profile.CONTENT_URI);
+ if (mIsGuest) {
+ showDialog(DIALOG_CONFIRM_EXIT_GUEST);
+ return true;
}
- // To make sure that it returns back here when done
- // TODO: Make this a proper API
- editProfile.putExtra("finishActivityOnSaveCompleted", true);
-
// If this is a limited user, launch the user info settings instead of profile editor
if (mUserManager.isLinkedUser()) {
onManageUserClicked(UserHandle.myUserId(), false);
} else {
- startActivity(editProfile);
+ showDialog(DIALOG_USER_PROFILE_EDITOR);
}
} else if (pref instanceof UserPreference) {
int userId = ((UserPreference) pref).getUserId();
- // Get the latest status of the user
- UserInfo user = mUserManager.getUserInfo(userId);
- if (UserHandle.myUserId() != UserHandle.USER_OWNER) {
- showDialog(DIALOG_USER_CANNOT_MANAGE);
+ if (userId == UserPreference.USERID_GUEST_DEFAULTS) {
+ createAndSwitchToGuestUser();
} else {
+ // Get the latest status of the user
+ UserInfo user = mUserManager.getUserInfo(userId);
if (!isInitialized(user)) {
mHandler.sendMessage(mHandler.obtainMessage(
MESSAGE_SETUP_USER, user.id, user.serialNumber));
- } else if (user.isRestricted()) {
- onManageUserClicked(user.id, false);
+ } else {
+ switchUserNow(userId);
}
}
} else if (pref == mAddUser) {
- showDialog(DIALOG_CHOOSE_USER_TYPE);
+ // If we allow both types, show a picker, otherwise directly go to
+ // flow for full user.
+ if (mCanAddRestrictedProfile) {
+ showDialog(DIALOG_CHOOSE_USER_TYPE);
+ } else {
+ onAddUserClicked(USER_TYPE_USER);
+ }
}
return false;
}
- private boolean isInitialized(UserInfo user) {
- return (user.flags & UserInfo.FLAG_INITIALIZED) != 0;
+ private void createAndSwitchToGuestUser() {
+ List<UserInfo> users = mUserManager.getUsers();
+ for (UserInfo user : users) {
+ if (user.isGuest()) {
+ switchUserNow(user.id);
+ return;
+ }
+ }
+ // No guest user. Create one, if there's no restriction.
+ // If it is not the primary user, then adding users from lockscreen must be enabled
+ if (mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)
+ || (!mIsOwner && Settings.Global.getInt(getContentResolver(),
+ Settings.Global.ADD_USERS_WHEN_LOCKED, 0) != 1)) {
+ Log.i(TAG, "Blocking guest creation because it is restricted");
+ return;
+ }
+ UserInfo guestUser = mUserManager.createGuest(getActivity(),
+ getResources().getString(R.string.user_guest));
+ if (guestUser != null) {
+ switchUserNow(guestUser.id);
+ }
}
- private Drawable encircle(int iconResId) {
- Bitmap icon = BitmapFactory.decodeResource(getResources(), iconResId);
- return encircle(icon);
+ private boolean isInitialized(UserInfo user) {
+ return (user.flags & UserInfo.FLAG_INITIALIZED) != 0;
}
private Drawable encircle(Bitmap icon) {
@@ -812,4 +985,14 @@ public class UserSettings extends RestrictedSettingsFragment
public int getHelpResource() {
return R.string.help_url_users;
}
+
+ @Override
+ public void onPhotoChanged(Drawable photo) {
+ mMePreference.setIcon(photo);
+ }
+
+ @Override
+ public void onLabelChanged(CharSequence label) {
+ mMePreference.setTitle(label);
+ }
}