am ed0cf41d: am 99bde108: Merge "Final refactoring of the user/profile settings screen." into jb-mr2-dev

* commit 'ed0cf41d3a36769b0f7b539e0456aff9d1795339':
  Final refactoring of the user/profile settings screen.
This commit is contained in:
Amith Yamasani
2013-04-23 18:53:26 -07:00
committed by Android Git Automerger
5 changed files with 191 additions and 132 deletions

View File

@@ -31,8 +31,8 @@
android:id="@+id/manage_user"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:paddingStart="12dip"
android:paddingEnd="12dip"
android:paddingStart="16dip"
android:paddingEnd="16dip"
android:src="@drawable/ic_sysbar_quicksettings"
android:contentDescription="@string/user_delete_user_description"
android:layout_gravity="center"
@@ -48,8 +48,8 @@
android:id="@+id/trash_user"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:paddingStart="12dip"
android:paddingEnd="12dip"
android:paddingStart="16dip"
android:paddingEnd="16dip"
android:src="@drawable/ic_menu_delete_holo_dark"
android:contentDescription="@string/user_delete_user_description"
android:layout_gravity="center"

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2013 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:paddingStart="16dip"
android:paddingEnd="16dip"
android:paddingTop="8dip"
android:paddingBottom="8dip">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceMedium"
android:ellipsize="marquee"
android:fadingEdge="horizontal"/>
<TextView
android:id="@+id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/title"
android:layout_alignStart="@id/title"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary"
android:maxLines="4" />
</RelativeLayout>

View File

@@ -4327,37 +4327,32 @@
<!-- User settings screen title [CHAR LIMIT=25] -->
<string name="user_settings_title">Users</string>
<!-- User settings section title for details about you [CHAR LIMIT=25] -->
<string name="user_you_section">You</string>
<!-- User settings trusted user list section header [CHAR LIMIT=40] -->
<string name="user_trusted_list_title">Users</string>
<!-- User settings limited user list section header [CHAR LIMIT=40] -->
<string name="user_limited_list_title">Limited users</string>
<!-- User settings header for list of users and profiles [CHAR LIMIT=40] -->
<string name="user_list_title">Users &amp; profiles</string>
<!-- User settings add user menu [CHAR LIMIT=35] -->
<string name="user_add_user_menu">Add user</string>
<!-- User settings add restricted user label [CHAR LIMIT=35] -->
<string name="user_add_restricted">Add limited user</string>
<!-- User settings summary for add restricted user [CHAR LIMIT=100] -->
<string name="user_add_restricted_summary">Limited users can only access the apps and content you select</string>
<!-- User settings add user label [CHAR LIMIT=35] -->
<string name="user_add_trusted">Add standard user</string>
<!-- User settings summary for add trusted user [CHAR LIMIT=100] -->
<string name="user_add_trusted_summary">Standard users have their own apps and content</string>
<!-- User summary to indicate that user is currently active in the background [CHAR LIMIT=100] -->
<string name="user_summary_active">Active</string>
<!-- User summary to indicate that user is currently inactive in the background [CHAR LIMIT=100] -->
<string name="user_summary_inactive">Not active</string>
<string name="user_add_user_menu">Add user or profile</string>
<!-- User settings summary for a restricted profile [CHAR LIMIT=50] -->
<string name="user_summary_restricted_profile">Restricted profile</string>
<!-- User summary to indicate that user is currently not set up [CHAR LIMIT=100] -->
<string name="user_summary_not_set_up">Not set up</string>
<!-- Summary text for a trusted user [CHAR LIMIT=50] -->
<string name="user_trusted">Trusted</string>
<!-- Summary text for a limited user [CHAR LIMIT=50] -->
<string name="user_limited">Limited</string>
<!-- User summary to indicate that restricted profile is currently not set up [CHAR LIMIT=100] -->
<string name="user_summary_restricted_not_set_up">Not set up - Restricted profile</string>
<!-- User information string to represent the owner of the device [CHAR LIMIT=25] -->
<string name="user_owner">Owner</string>
<!-- User settings title for current user entry "You" user. [CHAR LIMIT=30] -->
<string name="user_you">You (<xliff:g id="name" example="Name">%s</xliff:g>)</string>
<!-- Title for the preference to enter the nickname of the userto display in the user switcher [CHAR LIMIT=25]-->
<string name="user_nickname">Nickname</string>
<!-- Title for add user type dialog [CHAR LIMIT=45] -->
<string name="user_add_user_type_title">Add</string>
<!-- Summary for add user entry in the choice dialog [CHAR LIMIT=none] -->
<string name="user_add_user_item_summary">Users have their own apps and content</string>
<!-- Summary for add restricted profile entry in the choice dialog [CHAR LIMIT=none] -->
<string name="user_add_profile_item_summary">Restricted profiles can only access the apps and content from your accounts</string>
<!-- Button text for adding a regular user [CHAR LIMIT=25] -->
<string name="user_add_user_item_title">User</string>
<!-- Button text for adding a restricted profile [CHAR LIMIT=25] -->
<string name="user_add_profile_item_title">Restricted profile</string>
<!-- Title for add user confirmation dialog [CHAR LIMIT=30] -->
<string name="user_add_user_title">Add new user</string>
<!-- Message for add user confirmation dialog - long version. [CHAR LIMIT=none] -->
@@ -4368,6 +4363,8 @@
<string name="user_setup_dialog_title">Set up user now?</string>
<!-- Message in dialog to setup a new user after creation [CHAR LIMIT=none] -->
<string name="user_setup_dialog_message">Make sure the person is available to take the tablet and set up their space</string>
<!-- Message in dialog to setup a new restricted profile after creation [CHAR LIMIT=none] -->
<string name="user_setup_profile_dialog_message">Set up profile now?</string>
<!-- Button text to setup the new user now [CHAR LIMIT=25] -->
<string name="user_setup_button_setup_now">Set up now</string>
<!-- Button text to setup the new user later [CHAR LIMIT=25] -->
@@ -4383,6 +4380,8 @@
<string name="user_remove_user_menu">Delete <xliff:g id="user_name">%1$s</xliff:g> from this device</string>
<!-- User details new user name [CHAR LIMIT=30] -->
<string name="user_new_user_name">New user</string>
<!-- User details new restricted profile name [CHAR LIMIT=30] -->
<string name="user_new_profile_name">New profile</string>
<!-- User (self) removal confirmation title [CHAR LIMIT=30] -->
<string name="user_confirm_remove_self_title">Delete yourself?</string>
<!-- User removal confirmation title [CHAR LIMIT=25] -->

View File

@@ -19,25 +19,13 @@
android:title="@string/user_settings_title">
<PreferenceCategory
android:key="trusted_user_list"
android:title="@string/user_trusted_list_title">
android:key="user_list"
android:title="@string/user_list_title">
</PreferenceCategory>
<Preference
android:key="user_add_trusted"
android:title="@string/user_add_trusted"
android:summary="@string/user_add_trusted_summary"
android:icon="@drawable/ic_menu_add" />
<PreferenceCategory
android:key="limited_user_list"
android:title="@string/user_limited_list_title">
</PreferenceCategory>
<Preference
android:key="user_add_restricted"
android:title="@string/user_add_restricted"
android:summary="@string/user_add_restricted_summary"
android:key="user_add"
android:title="@string/user_add_user_menu"
android:icon="@drawable/ic_menu_add" />
</PreferenceScreen>

View File

@@ -53,6 +53,7 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.SimpleAdapter;
import com.android.settings.OwnerInfoSettings;
import com.android.settings.R;
@@ -61,7 +62,9 @@ import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class UserSettings extends SettingsPreferenceFragment
implements OnPreferenceClickListener, OnClickListener, DialogInterface.OnDismissListener,
@@ -74,26 +77,25 @@ 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_TRUSTED_USER_LIST = "trusted_user_list";
private static final String KEY_LIMITED_USER_LIST = "limited_user_list";
private static final String KEY_USER_LIST = "user_list";
private static final String KEY_USER_ME = "user_me";
private static final String KEY_ADD_RESTRICTED_USER = "user_add_restricted";
private static final String KEY_ADD_TRUSTED_USER = "user_add_trusted";
private static final String KEY_ADD_USER = "user_add";
private static final int MENU_REMOVE_USER = Menu.FIRST;
private static final int DIALOG_CONFIRM_REMOVE = 1;
private static final int DIALOG_ADD_USER_TRUSTED = 2;
private static final int DIALOG_ADD_USER_LIMITED = 3;
private static final int DIALOG_SETUP_USER = 4;
private static final int DIALOG_ADD_USER = 2;
private static final int DIALOG_SETUP_USER = 3;
private static final int DIALOG_SETUP_PROFILE = 4;
private static final int DIALOG_USER_CANNOT_MANAGE = 5;
private static final int DIALOG_CHOOSE_USER_TYPE = 6;
private static final int MESSAGE_UPDATE_LIST = 1;
private static final int MESSAGE_SETUP_USER = 2;
private static final int MESSAGE_CONFIG_USER = 3;
private static final int USER_TYPE_TRUSTED = 1;
private static final int USER_TYPE_LIMITED = 2;
private static final int USER_TYPE_USER = 1;
private static final int USER_TYPE_RESTRICTED_PROFILE = 2;
private static final String KEY_ADD_USER_LONG_MESSAGE_DISPLAYED =
"key_add_user_long_message_displayed";
@@ -109,12 +111,13 @@ public class UserSettings extends SettingsPreferenceFragment
R.drawable.avatar_default_8
};
private PreferenceGroup mTrustedUserListCategory;
private PreferenceGroup mLimitedUserListCategory;
private static final String KEY_TITLE = "title";
private static final String KEY_SUMMARY = "summary";
private PreferenceGroup mUserListCategory;
private Preference mMePreference;
private SelectableEditTextPreference mNicknamePreference;
private Preference mAddRestrictedUser;
private Preference mAddTrustedUser;
private Preference mAddUser;
private int mRemovingUserId = -1;
private int mAddedUserId = 0;
private boolean mAddingUser;
@@ -173,8 +176,7 @@ public class UserSettings extends SettingsPreferenceFragment
mUserManager = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
addPreferencesFromResource(R.xml.user_settings);
mTrustedUserListCategory = (PreferenceGroup) findPreference(KEY_TRUSTED_USER_LIST);
mLimitedUserListCategory = (PreferenceGroup) findPreference(KEY_LIMITED_USER_LIST);
mUserListCategory = (PreferenceGroup) findPreference(KEY_USER_LIST);
mMePreference = new UserPreference(getActivity(), null, UserHandle.myUserId(),
mUserManager.isLinkedUser() ? null : this, null);
mMePreference.setKey(KEY_USER_ME);
@@ -182,13 +184,10 @@ public class UserSettings extends SettingsPreferenceFragment
if (mIsOwner) {
mMePreference.setSummary(R.string.user_owner);
}
mAddRestrictedUser = findPreference(KEY_ADD_RESTRICTED_USER);
mAddTrustedUser = findPreference(KEY_ADD_TRUSTED_USER);
mAddRestrictedUser.setOnPreferenceClickListener(this);
mAddTrustedUser.setOnPreferenceClickListener(this);
mAddUser = findPreference(KEY_ADD_USER);
mAddUser.setOnPreferenceClickListener(this);
if (!mIsOwner || UserManager.getMaxSupportedUsers() < 2) {
removePreference(KEY_ADD_RESTRICTED_USER);
removePreference(KEY_ADD_TRUSTED_USER);
removePreference(KEY_ADD_USER);
}
loadProfile();
setHasOptionsMenu(true);
@@ -266,7 +265,8 @@ public class UserSettings extends SettingsPreferenceFragment
}
private void finishLoadProfile(String profileName) {
mMePreference.setTitle(profileName);
if (getActivity() == null) return;
mMePreference.setTitle(getString(R.string.user_you, profileName));
int myUserId = UserHandle.myUserId();
Bitmap b = mUserManager.getUserIcon(myUserId);
if (b != null) {
@@ -279,11 +279,11 @@ public class UserSettings extends SettingsPreferenceFragment
synchronized (mUserLock) {
if (mRemovingUserId == -1 && !mAddingUser) {
switch (userType) {
case USER_TYPE_TRUSTED:
showDialog(DIALOG_ADD_USER_TRUSTED);
case USER_TYPE_USER:
showDialog(DIALOG_ADD_USER);
break;
case USER_TYPE_LIMITED:
showDialog(DIALOG_ADD_USER_LIMITED);
case USER_TYPE_RESTRICTED_PROFILE:
addUserNow(USER_TYPE_RESTRICTED_PROFILE);
break;
}
}
@@ -301,7 +301,7 @@ public class UserSettings extends SettingsPreferenceFragment
private UserInfo createLimitedUser() {
UserInfo newUserInfo = mUserManager.createUser(
getResources().getString(R.string.user_new_user_name),
getResources().getString(R.string.user_new_profile_name),
UserInfo.FLAG_RESTRICTED);
int userId = newUserInfo.id;
UserHandle user = new UserHandle(userId);
@@ -326,7 +326,7 @@ public class UserSettings extends SettingsPreferenceFragment
private UserInfo createTrustedUser() {
UserInfo newUserInfo = mUserManager.createUser(
getActivity().getResources().getString(R.string.user_new_user_name), 0);
getResources().getString(R.string.user_new_user_name), 0);
if (newUserInfo != null) {
assignDefaultPhoto(newUserInfo);
}
@@ -360,7 +360,11 @@ public class UserSettings extends SettingsPreferenceFragment
private void onUserCreated(int userId) {
mAddedUserId = userId;
showDialog(DIALOG_SETUP_USER);
if (mUserManager.getUserInfo(userId).isRestricted()) {
showDialog(DIALOG_SETUP_PROFILE);
} else {
showDialog(DIALOG_SETUP_USER);
}
}
@Override
@@ -372,6 +376,8 @@ public class UserSettings extends SettingsPreferenceFragment
@Override
public Dialog onCreateDialog(int dialogId) {
Context context = getActivity();
if (context == null) return null;
switch (dialogId) {
case DIALOG_CONFIRM_REMOVE: {
Dialog dlg = new AlertDialog.Builder(getActivity())
@@ -392,12 +398,11 @@ public class UserSettings extends SettingsPreferenceFragment
return dlg;
}
case DIALOG_USER_CANNOT_MANAGE:
return new AlertDialog.Builder(getActivity())
return new AlertDialog.Builder(context)
.setMessage(R.string.user_cannot_manage_message)
.setPositiveButton(android.R.string.ok, null)
.create();
case DIALOG_ADD_USER_TRUSTED:
case DIALOG_ADD_USER_LIMITED: {
case DIALOG_ADD_USER: {
final SharedPreferences preferences = getActivity().getPreferences(
Context.MODE_PRIVATE);
final boolean longMessageDisplayed = preferences.getBoolean(
@@ -405,37 +410,75 @@ public class UserSettings extends SettingsPreferenceFragment
final int messageResId = longMessageDisplayed
? R.string.user_add_user_message_short
: R.string.user_add_user_message_long;
final int userType = dialogId == DIALOG_ADD_USER_TRUSTED
? USER_TYPE_TRUSTED : USER_TYPE_LIMITED;
Dialog dlg = new AlertDialog.Builder(getActivity())
.setTitle(R.string.user_add_user_title)
.setMessage(messageResId)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
addUserNow(userType);
if (!longMessageDisplayed) {
preferences.edit().putBoolean(KEY_ADD_USER_LONG_MESSAGE_DISPLAYED,
true).commit();
final int userType = dialogId == DIALOG_ADD_USER
? USER_TYPE_USER : USER_TYPE_RESTRICTED_PROFILE;
Dialog dlg = new AlertDialog.Builder(context)
.setTitle(R.string.user_add_user_title)
.setMessage(messageResId)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
addUserNow(userType);
if (!longMessageDisplayed) {
preferences.edit().putBoolean(
KEY_ADD_USER_LONG_MESSAGE_DISPLAYED, true).apply();
}
}
}
})
.setNegativeButton(android.R.string.cancel, null)
.create();
})
.setNegativeButton(android.R.string.cancel, null)
.create();
return dlg;
}
case DIALOG_SETUP_USER: {
Dialog dlg = new AlertDialog.Builder(getActivity())
.setTitle(R.string.user_setup_dialog_title)
.setMessage(R.string.user_setup_dialog_message)
.setPositiveButton(R.string.user_setup_button_setup_now,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
switchUserNow(mAddedUserId);
}
})
.setNegativeButton(R.string.user_setup_button_setup_later, null)
.create();
Dialog dlg = new AlertDialog.Builder(context)
.setTitle(R.string.user_setup_dialog_title)
.setMessage(R.string.user_setup_dialog_message)
.setPositiveButton(R.string.user_setup_button_setup_now,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
switchUserNow(mAddedUserId);
}
})
.setNegativeButton(R.string.user_setup_button_setup_later, null)
.create();
return dlg;
}
case DIALOG_SETUP_PROFILE: {
Dialog dlg = new AlertDialog.Builder(context)
.setMessage(R.string.user_setup_profile_dialog_message)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
switchUserNow(mAddedUserId);
}
})
.setNegativeButton(android.R.string.cancel, null)
.create();
return dlg;
}
case DIALOG_CHOOSE_USER_TYPE: {
List<HashMap<String, String>> data = new ArrayList<HashMap<String,String>>();
HashMap<String,String> addUserItem = new HashMap<String,String>();
addUserItem.put(KEY_TITLE, getString(R.string.user_add_user_item_title));
addUserItem.put(KEY_SUMMARY, getString(R.string.user_add_user_item_summary));
HashMap<String,String> addProfileItem = new HashMap<String,String>();
addProfileItem.put(KEY_TITLE, getString(R.string.user_add_profile_item_title));
addProfileItem.put(KEY_SUMMARY, getString(R.string.user_add_profile_item_summary));
data.add(addUserItem);
data.add(addProfileItem);
Dialog dlg = new AlertDialog.Builder(context)
.setTitle(R.string.user_add_user_type_title)
.setAdapter(new SimpleAdapter(context, data, R.layout.two_line_list_item,
new String[] {KEY_TITLE, KEY_SUMMARY},
new int[] {R.id.title, R.id.summary}),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
onAddUserClicked(which == 0
? USER_TYPE_USER
: USER_TYPE_RESTRICTED_PROFILE);
}
})
.create();
return dlg;
}
default:
@@ -476,14 +519,14 @@ public class UserSettings extends SettingsPreferenceFragment
public void run() {
UserInfo user = null;
// Could take a few seconds
if (userType == USER_TYPE_TRUSTED) {
if (userType == USER_TYPE_USER) {
user = createTrustedUser();
} else {
user = createLimitedUser();
}
synchronized (mUserLock) {
mAddingUser = false;
if (userType == USER_TYPE_TRUSTED) {
if (userType == USER_TYPE_USER) {
mHandler.sendEmptyMessage(MESSAGE_UPDATE_LIST);
mHandler.sendMessage(mHandler.obtainMessage(
MESSAGE_SETUP_USER, user.id, user.serialNumber));
@@ -509,12 +552,9 @@ public class UserSettings extends SettingsPreferenceFragment
if (getActivity() == null) return;
List<UserInfo> users = mUserManager.getUsers(true);
mTrustedUserListCategory.removeAll();
mTrustedUserListCategory.setOrderingAsAdded(false);
mLimitedUserListCategory.removeAll();
mLimitedUserListCategory.setOrderingAsAdded(false);
mTrustedUserListCategory.addPreference(mMePreference);
mUserListCategory.removeAll();
mUserListCategory.setOrderingAsAdded(false);
mUserListCategory.addPreference(mMePreference);
final ArrayList<Integer> missingIcons = new ArrayList<Integer>();
for (UserInfo user : users) {
@@ -527,18 +567,18 @@ public class UserSettings extends SettingsPreferenceFragment
mIsOwner ? this : null);
pref.setOnPreferenceClickListener(this);
pref.setKey("id=" + user.id);
if (user.isRestricted()) {
mLimitedUserListCategory.addPreference(pref);
} else {
mTrustedUserListCategory.addPreference(pref);
}
mUserListCategory.addPreference(pref);
if (user.id == UserHandle.USER_OWNER) {
pref.setSummary(R.string.user_owner);
}
pref.setTitle(user.name);
if (!isInitialized(user)) {
pref.setSummary(R.string.user_summary_not_set_up);
}
}
if (!isInitialized(user)) {
pref.setSummary(user.isRestricted()
? R.string.user_summary_restricted_not_set_up
: 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) {
@@ -556,7 +596,7 @@ public class UserSettings extends SettingsPreferenceFragment
pref.setEnabled(false);
pref.setTitle(R.string.user_new_user_name);
pref.setIcon(encircle(R.drawable.avatar_default_1));
mTrustedUserListCategory.addPreference(pref);
mUserListCategory.addPreference(pref);
}
getActivity().invalidateOptionsMenu();
@@ -565,14 +605,7 @@ public class UserSettings extends SettingsPreferenceFragment
loadIconsAsync(missingIcons);
}
boolean moreUsers = mUserManager.getMaxSupportedUsers() > users.size();
mAddRestrictedUser.setEnabled(moreUsers);
mAddTrustedUser.setEnabled(moreUsers);
// Remove the limited users category if there aren't other limited users.
if (!mIsOwner) {
if (mLimitedUserListCategory.getPreferenceCount() == 0) {
removePreference(KEY_LIMITED_USER_LIST);
}
}
mAddUser.setEnabled(moreUsers);
}
private void loadIconsAsync(List<Integer> missingIcons) {
@@ -662,10 +695,8 @@ public class UserSettings extends SettingsPreferenceFragment
onManageUserClicked(user.id, false);
}
}
} else if (pref == mAddTrustedUser) {
onAddUserClicked(USER_TYPE_TRUSTED);
} else if (pref == mAddRestrictedUser) {
onAddUserClicked(USER_TYPE_LIMITED);
} else if (pref == mAddUser) {
showDialog(DIALOG_CHOOSE_USER_TYPE);
}
return false;
}