From d4abdd27adac36e7243bcaae37a7a2c69ac73db7 Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Wed, 17 Apr 2013 18:27:01 -0700 Subject: [PATCH] Reorganize users screen As per product/ux feedback, move around and rename the users. Settings button for some users. Fix crash in limited user when clicking on the user: Bug: 8494377 Change-Id: I346d12646d32608b01f2c2c2c866b6da51408618 --- res/layout/ownerinfo.xml | 10 +++ res/layout/preference_user_delete_widget.xml | 8 ++ res/values/strings.xml | 16 ++-- res/xml/user_settings.xml | 31 ++----- .../android/settings/OwnerInfoSettings.java | 49 ++++++++++-- .../settings/users/UserPreference.java | 50 +++++++----- .../android/settings/users/UserSettings.java | 80 +++++++++++-------- 7 files changed, 149 insertions(+), 95 deletions(-) diff --git a/res/layout/ownerinfo.xml b/res/layout/ownerinfo.xml index d33f156ba5f..35f04d83717 100644 --- a/res/layout/ownerinfo.xml +++ b/res/layout/ownerinfo.xml @@ -37,10 +37,20 @@ android:background="#ff404040" /> + + + Users You - - Trusted users - + + Users + Limited users - + Add user - + Add limited user Limited users can only access the apps and content you select - - Add trusted user + + Add standard user - Trusted users have no restrictions + Standard users have their own apps and content Active diff --git a/res/xml/user_settings.xml b/res/xml/user_settings.xml index 2e73e9e328d..6c6ad926056 100644 --- a/res/xml/user_settings.xml +++ b/res/xml/user_settings.xml @@ -19,20 +19,15 @@ android:title="@string/user_settings_title"> + android:key="trusted_user_list" + android:title="@string/user_trusted_list_title"> + + - - + android:key="user_add_trusted" + android:title="@string/user_add_trusted" + android:summary="@string/user_add_trusted_summary" + android:icon="@drawable/ic_menu_add" /> - - - - diff --git a/src/com/android/settings/OwnerInfoSettings.java b/src/com/android/settings/OwnerInfoSettings.java index 0a83f1a9600..51d166c2b75 100644 --- a/src/com/android/settings/OwnerInfoSettings.java +++ b/src/com/android/settings/OwnerInfoSettings.java @@ -20,6 +20,9 @@ import android.app.Fragment; import android.content.ContentResolver; import android.os.Bundle; import android.os.UserHandle; +import android.os.UserManager; +import android.provider.Settings; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -31,11 +34,25 @@ import android.widget.CompoundButton.OnCheckedChangeListener; import com.android.internal.widget.LockPatternUtils; public class OwnerInfoSettings extends Fragment { + + public static final String EXTRA_SHOW_NICKNAME = "show_nickname"; + private View mView; private CheckBox mCheckbox; - private EditText mEditText; private int mUserId; private LockPatternUtils mLockPatternUtils; + private EditText mOwnerInfo; + private EditText mNickname; + private boolean mShowNickname; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Bundle args = getArguments(); + if (args != null && args.containsKey(EXTRA_SHOW_NICKNAME)) { + mShowNickname = args.getBoolean(EXTRA_SHOW_NICKNAME); + } + } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -52,9 +69,16 @@ public class OwnerInfoSettings extends Fragment { String info = mLockPatternUtils.getOwnerInfo(mUserId); boolean enabled = mLockPatternUtils.isOwnerInfoEnabled(); mCheckbox = (CheckBox) mView.findViewById(R.id.show_owner_info_on_lockscreen_checkbox); - mEditText = (EditText) mView.findViewById(R.id.owner_info_edit_text); - mEditText.setText(info); - mEditText.setEnabled(enabled); + mOwnerInfo = (EditText) mView.findViewById(R.id.owner_info_edit_text); + mOwnerInfo.setText(info); + mOwnerInfo.setEnabled(enabled); + mNickname = (EditText) mView.findViewById(R.id.owner_info_nickname); + if (!mShowNickname) { + mNickname.setVisibility(View.GONE); + } else { + mNickname.setText(UserManager.get(getActivity()).getUserName()); + mNickname.setSelected(true); + } mCheckbox.setChecked(enabled); if (UserHandle.myUserId() != UserHandle.USER_OWNER) { mCheckbox.setText(R.string.show_user_info_on_lockscreen_label); @@ -62,7 +86,7 @@ public class OwnerInfoSettings extends Fragment { mCheckbox.setOnCheckedChangeListener(new OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { mLockPatternUtils.setOwnerInfoEnabled(isChecked); - mEditText.setEnabled(isChecked); // disable text field if not enabled + mOwnerInfo.setEnabled(isChecked); // disable text field if not enabled } }); } @@ -70,12 +94,21 @@ public class OwnerInfoSettings extends Fragment { @Override public void onPause() { super.onPause(); - saveToDb(); + saveChanges(); } - void saveToDb() { - String info = mEditText.getText().toString(); + void saveChanges() { + ContentResolver res = getActivity().getContentResolver(); + String info = mOwnerInfo.getText().toString(); mLockPatternUtils.setOwnerInfo(info, mUserId); + if (mShowNickname) { + String oldName = UserManager.get(getActivity()).getUserName(); + CharSequence newName = mNickname.getText(); + if (!TextUtils.isEmpty(newName) && !newName.equals(oldName)) { + UserManager.get(getActivity()).setUserName(UserHandle.myUserId(), + newName.toString()); + } + } } } diff --git a/src/com/android/settings/users/UserPreference.java b/src/com/android/settings/users/UserPreference.java index 2894bf9e255..9f53aa5999b 100644 --- a/src/com/android/settings/users/UserPreference.java +++ b/src/com/android/settings/users/UserPreference.java @@ -36,50 +36,58 @@ public class UserPreference extends Preference { private int mSerialNumber = -1; private int mUserId = USERID_UNKNOWN; private boolean mRestricted; + private boolean mSelf; static final int SETTINGS_ID = R.id.manage_user; static final int DELETE_ID = R.id.trash_user; public UserPreference(Context context, AttributeSet attrs) { - this(context, attrs, USERID_UNKNOWN, false, null, null); + this(context, attrs, USERID_UNKNOWN, null, null); } UserPreference(Context context, AttributeSet attrs, int userId, - boolean showOptions, OnClickListener deleteListener, - OnClickListener settingsListener) { + OnClickListener settingsListener, + OnClickListener deleteListener) { super(context, attrs); - if (showOptions) { + if (deleteListener != null || settingsListener != null) { setWidgetLayoutResource(R.layout.preference_user_delete_widget); - mDeleteClickListener = deleteListener; - mSettingsClickListener = settingsListener; } + mDeleteClickListener = deleteListener; + mSettingsClickListener = settingsListener; mUserId = userId; - if (mUserId > UserHandle.USER_OWNER) { - mRestricted = ((UserManager) getContext().getSystemService(Context.USER_SERVICE)) - .getUserInfo(mUserId).isRestricted(); - } - //setSummary(mRestricted ? R.string.user_limited : R.string.user_trusted); } @Override protected void onBindView(View view) { + View deleteDividerView = view.findViewById(R.id.divider_delete); + View manageDividerView = view.findViewById(R.id.divider_manage); View deleteView = view.findViewById(R.id.trash_user); if (deleteView != null) { - deleteView.setOnClickListener(mDeleteClickListener); - deleteView.setTag(this); - } - View settingsView = view.findViewById(R.id.manage_user); - if (settingsView != null) { - if (mRestricted) { - settingsView.setOnClickListener(mSettingsClickListener); - settingsView.setTag(this); + if (mDeleteClickListener != null) { + deleteView.setOnClickListener(mDeleteClickListener); + deleteView.setTag(this); } else { - settingsView.setVisibility(View.INVISIBLE); + deleteView.setVisibility(View.GONE); + deleteDividerView.setVisibility(View.GONE); + } + } + View manageView = view.findViewById(R.id.manage_user); + if (manageView != null) { + if (mSettingsClickListener != null) { + manageView.setOnClickListener(mSettingsClickListener); + manageView.setTag(this); + if (mDeleteClickListener != null) { + manageDividerView.setVisibility(View.GONE); + } + } else { + manageView.setVisibility(View.GONE); + manageDividerView.setVisibility(View.GONE); } } super.onBindView(view); } - public int getSerialNumber() { + private int getSerialNumber() { + if (mUserId == UserHandle.myUserId()) return Integer.MIN_VALUE; if (mSerialNumber < 0) { // If the userId is unknown if (mUserId == USERID_UNKNOWN) return Integer.MAX_VALUE; diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java index a0e4c35ebd6..1f1815e8ce4 100644 --- a/src/com/android/settings/users/UserSettings.java +++ b/src/com/android/settings/users/UserSettings.java @@ -31,8 +31,6 @@ import android.content.pm.UserInfo; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.Color; -import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Bundle; @@ -43,12 +41,10 @@ import android.os.UserHandle; import android.os.UserManager; import android.preference.Preference; import android.preference.PreferenceActivity; -import android.preference.PreferenceScreen; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceGroup; import android.provider.ContactsContract; import android.provider.ContactsContract.Contacts; -import android.text.InputType; import android.util.Log; import android.util.SparseArray; import android.view.Menu; @@ -57,11 +53,11 @@ import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; +import com.android.settings.OwnerInfoSettings; import com.android.settings.R; import com.android.settings.SelectableEditTextPreference; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.Utils; -import com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment; import java.util.ArrayList; import java.util.List; @@ -77,7 +73,6 @@ public class UserSettings extends SettingsPreferenceFragment /** UserId of the user that was just added */ private static final String SAVE_ADDING_USER = "adding_user"; - private static final String KEY_USER_NICKNAME = "user_nickname"; private static final String KEY_TRUSTED_USER_LIST = "trusted_user_list"; private static final String KEY_LIMITED_USER_LIST = "limited_user_list"; private static final String KEY_USER_ME = "user_me"; @@ -179,21 +174,13 @@ public class UserSettings extends SettingsPreferenceFragment addPreferencesFromResource(R.xml.user_settings); mTrustedUserListCategory = (PreferenceGroup) findPreference(KEY_TRUSTED_USER_LIST); mLimitedUserListCategory = (PreferenceGroup) findPreference(KEY_LIMITED_USER_LIST); - mMePreference = (Preference) findPreference(KEY_USER_ME); + mMePreference = new UserPreference(getActivity(), null, UserHandle.myUserId(), + mUserManager.isLinkedUser() ? null : this, null); + mMePreference.setKey(KEY_USER_ME); mMePreference.setOnPreferenceClickListener(this); - if (!mIsOwner) { - mMePreference.setSummary(null); + if (mIsOwner) { + mMePreference.setSummary(R.string.user_owner); } - Preference ownerInfo = findPreference("user_owner_info"); - if (ownerInfo != null && !mIsOwner) { - ownerInfo.setTitle(R.string.user_info_settings_title); - } - mNicknamePreference = (SelectableEditTextPreference) findPreference(KEY_USER_NICKNAME); - mNicknamePreference.setOnPreferenceChangeListener(this); - mNicknamePreference.getEditText().setInputType( - InputType.TYPE_TEXT_VARIATION_NORMAL | InputType.TYPE_TEXT_FLAG_CAP_WORDS); - mNicknamePreference.setInitialSelectionMode( - SelectableEditTextPreference.SELECTION_SELECT_ALL); mAddRestrictedUser = findPreference(KEY_ADD_RESTRICTED_USER); mAddTrustedUser = findPreference(KEY_ADD_TRUSTED_USER); mAddRestrictedUser.setOnPreferenceClickListener(this); @@ -269,6 +256,9 @@ public class UserSettings extends SettingsPreferenceFragment assignProfilePhoto(user); } String profileName = getProfileName(); + if (profileName == null) { + profileName = user.name; + } return profileName; } }.execute(); @@ -341,17 +331,28 @@ public class UserSettings extends SettingsPreferenceFragment } private void onManageUserClicked(int userId, boolean newUser) { - Bundle extras = new Bundle(); - extras.putInt(AppRestrictionsFragment.EXTRA_USER_ID, userId); - extras.putBoolean(AppRestrictionsFragment.EXTRA_NEW_USER, newUser); - String title = getResources().getString(R.string.user_new_user_name); - if (userId > UserHandle.USER_OWNER) { - title = mUserManager.getUserInfo(userId).name; + UserInfo info = mUserManager.getUserInfo(userId); + if (info.isRestricted() && mIsOwner) { + Bundle extras = new Bundle(); + extras.putInt(AppRestrictionsFragment.EXTRA_USER_ID, userId); + extras.putBoolean(AppRestrictionsFragment.EXTRA_NEW_USER, newUser); + String title = getResources().getString(R.string.user_new_user_name); + if (userId > UserHandle.USER_OWNER) { + title = mUserManager.getUserInfo(userId).name; + } + ((PreferenceActivity) getActivity()).startPreferencePanel( + AppRestrictionsFragment.class.getName(), + extras, 0, title, + null, 0); + } else if (info.id == UserHandle.myUserId()) { + // Jump to owner info panel + Bundle extras = new Bundle(); + extras.putBoolean(OwnerInfoSettings.EXTRA_SHOW_NICKNAME, true); + ((PreferenceActivity) getActivity()).startPreferencePanel( + OwnerInfoSettings.class.getName(), + extras, R.string.user_info_settings_title, null, + null, 0); } - ((PreferenceActivity) getActivity()).startPreferencePanel( - AppRestrictionsFragment.class.getName(), - extras, 0, title, - null, 0); } private void onUserCreated(int userId) { @@ -510,16 +511,17 @@ public class UserSettings extends SettingsPreferenceFragment mLimitedUserListCategory.removeAll(); mLimitedUserListCategory.setOrderingAsAdded(false); + mTrustedUserListCategory.addPreference(mMePreference); + final ArrayList missingIcons = new ArrayList(); for (UserInfo user : users) { Preference pref; if (user.id == UserHandle.myUserId()) { pref = mMePreference; - mNicknamePreference.setText(user.name); - mNicknamePreference.setSummary(user.name); } else { pref = new UserPreference(getActivity(), null, user.id, - UserHandle.myUserId() == UserHandle.USER_OWNER, this, this); + mIsOwner && user.isRestricted() ? this : null, + mIsOwner ? this : null); pref.setOnPreferenceClickListener(this); pref.setKey("id=" + user.id); if (user.isRestricted()) { @@ -547,7 +549,7 @@ 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, - false, null, null); + null, null); pref.setEnabled(false); pref.setTitle(R.string.user_new_user_name); pref.setIcon(encircle(R.drawable.avatar_default_1)); @@ -610,7 +612,7 @@ public class UserSettings extends SettingsPreferenceFragment } private void setPhotoId(Preference pref, UserInfo user) { - Bitmap bitmap = mUserIcons.get(user.id); // UserUtils.getUserIcon(mUserManager, user); + Bitmap bitmap = mUserIcons.get(user.id); if (bitmap != null) { pref.setIcon(encircle(bitmap)); } @@ -636,7 +638,13 @@ public class UserSettings extends SettingsPreferenceFragment // To make sure that it returns back here when done // TODO: Make this a proper API editProfile.putExtra("finishActivityOnSaveCompleted", true); - startActivity(editProfile); + + // 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); + } } else if (pref instanceof UserPreference) { int userId = ((UserPreference) pref).getUserId(); // Get the latest status of the user @@ -647,6 +655,8 @@ public class UserSettings extends SettingsPreferenceFragment if (!isInitialized(user)) { mHandler.sendMessage(mHandler.obtainMessage( MESSAGE_SETUP_USER, user.id, user.serialNumber)); + } else if (user.isRestricted()) { + onManageUserClicked(user.id, false); } } } else if (pref == mAddTrustedUser) {