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
diff --git a/res/layout/ownerinfo.xml b/res/layout/ownerinfo.xml
index d33f156..35f04d8 100644
--- a/res/layout/ownerinfo.xml
+++ b/res/layout/ownerinfo.xml
@@ -37,10 +37,20 @@
                 android:background="#ff404040"
                 />
 
+            <EditText android:id="@+id/owner_info_nickname"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="8dip"
+                android:gravity="top"
+                android:hint="@string/user_nickname"
+                android:inputType="textCapWords"
+            />
+
             <CheckBox android:id="@+id/show_owner_info_on_lockscreen_checkbox"
                 android:layout_width="match_parent"
                 android:layout_height="64dip"
                 android:gravity="center_vertical"
+                android:layout_marginTop="8dip"
                 android:text="@string/show_owner_info_on_lockscreen_label"
                 android:textAppearance="?android:attr/textAppearanceMedium"
                 android:textColor="?android:attr/textColorSecondary"
diff --git a/res/layout/preference_user_delete_widget.xml b/res/layout/preference_user_delete_widget.xml
index 57c240f..6dc6a79 100644
--- a/res/layout/preference_user_delete_widget.xml
+++ b/res/layout/preference_user_delete_widget.xml
@@ -20,6 +20,13 @@
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
         android:orientation="horizontal">
+    <View
+        android:id="@+id/divider_manage"
+        android:layout_width="2dip"
+        android:layout_height="match_parent"
+        android:layout_marginTop="5dip"
+        android:layout_marginBottom="5dip"
+        android:background="@android:drawable/divider_horizontal_dark" />
     <ImageView
         android:id="@+id/manage_user"
         android:layout_width="wrap_content"
@@ -31,6 +38,7 @@
         android:layout_gravity="center"
         android:background="?android:attr/selectableItemBackground" />
     <View
+        android:id="@+id/divider_delete"
         android:layout_width="2dip"
         android:layout_height="match_parent"
         android:layout_marginTop="5dip"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6f43881..665959a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4324,20 +4324,20 @@
     <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=30] -->
-    <string name="user_trusted_list_title">Trusted users</string>
-    <!-- User settings limited user list section header [CHAR LIMIT=30] -->
+    <!-- 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 add user menu [CHAR LIMIT=20] -->
+    <!-- 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=20] -->
+    <!-- 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=20] -->
-    <string name="user_add_trusted">Add trusted user</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">Trusted users have no restrictions</string>
+    <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>
diff --git a/res/xml/user_settings.xml b/res/xml/user_settings.xml
index 2e73e9e..6c6ad92 100644
--- a/res/xml/user_settings.xml
+++ b/res/xml/user_settings.xml
@@ -19,20 +19,15 @@
         android:title="@string/user_settings_title">
 
     <PreferenceCategory
-            android:key="user_you"
-            android:title="@string/user_you_section"/>
+            android:key="trusted_user_list"
+            android:title="@string/user_trusted_list_title">
+    </PreferenceCategory>
+
     <Preference
-            android:key="user_me"
-            android:summary="@string/user_owner" />
-    <com.android.settings.SelectableEditTextPreference
-            android:key="user_nickname"
-            android:title="@string/user_nickname"
-            android:icon="@drawable/empty_icon" />
-    <Preference
-            android:key="user_owner_info"
-            android:title="@string/owner_info_settings_title"
-            android:icon="@drawable/empty_icon"
-            android:fragment="com.android.settings.OwnerInfoSettings" />
+            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"
@@ -45,14 +40,4 @@
             android:summary="@string/user_add_restricted_summary"
             android:icon="@drawable/ic_menu_add" />
 
-    <PreferenceCategory
-            android:key="trusted_user_list"
-            android:title="@string/user_trusted_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" />
 </PreferenceScreen>
diff --git a/src/com/android/settings/OwnerInfoSettings.java b/src/com/android/settings/OwnerInfoSettings.java
index 0a83f1a..51d166c 100644
--- a/src/com/android/settings/OwnerInfoSettings.java
+++ b/src/com/android/settings/OwnerInfoSettings.java
@@ -20,6 +20,9 @@
 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 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 @@
         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 @@
         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 @@
     @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 2894bf9..9f53aa5 100644
--- a/src/com/android/settings/users/UserPreference.java
+++ b/src/com/android/settings/users/UserPreference.java
@@ -36,50 +36,58 @@
     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 a0e4c35..1f1815e 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -31,8 +31,6 @@
 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.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.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 @@
     /** 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 @@
         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 @@
                     assignProfilePhoto(user);
                 }
                 String profileName = getProfileName();
+                if (profileName == null) {
+                    profileName = user.name;
+                }
                 return profileName;
             }
         }.execute();
@@ -341,17 +331,28 @@
     }
 
     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 @@
         mLimitedUserListCategory.removeAll();
         mLimitedUserListCategory.setOrderingAsAdded(false);
 
+        mTrustedUserListCategory.addPreference(mMePreference);
+
         final ArrayList<Integer> missingIcons = new ArrayList<Integer>();
         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 @@
         // 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 @@
     }
 
     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 @@
             // 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 @@
                 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) {