More user management ui work
Show setup dialog after adding user.
Write user profile to nickname on setup.
Remove self.
Correct dialog text for user creation.
Bug: 7104261
Bug: 7174751
Bug: 7174685
Change-Id: I0ecd688f3edaef61332f974012454ceb87762e9f
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 777a712..ee1bfee 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -23,25 +23,41 @@
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
+import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.content.res.Resources.NotFoundException;
+import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.net.ConnectivityManager;
import android.net.LinkProperties;
+import android.net.Uri;
import android.os.BatteryManager;
import android.os.Bundle;
+import android.os.ParcelFileDescriptor;
+import android.os.ParcelFileDescriptor.AutoCloseOutputStream;
import android.os.SystemProperties;
+import android.os.UserHandle;
+import android.os.UserManager;
import android.preference.Preference;
import android.preference.PreferenceActivity.Header;
import android.preference.PreferenceFrameLayout;
import android.preference.PreferenceGroup;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Profile;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
+import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TabWidget;
+import com.android.settings.users.ProfileUpdateReceiver;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
import java.net.InetAddress;
import java.util.Iterator;
import java.util.List;
@@ -445,4 +461,55 @@
return R.string.tether_settings_title_bluetooth;
}
}
+
+ /* Used by UserSettings as well. Call this on a non-ui thread. */
+ public static boolean copyMeProfilePhoto(Context context, UserInfo user) {
+ Uri contactUri = Profile.CONTENT_URI;
+
+ InputStream avatarDataStream = Contacts.openContactPhotoInputStream(
+ context.getContentResolver(),
+ contactUri, true);
+ // If there's no profile photo, assign a default avatar
+ if (avatarDataStream == null) {
+ return false;
+ }
+ int userId = user != null ? user.id : UserHandle.myUserId();
+ UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
+ ParcelFileDescriptor fd = um.setUserIcon(userId);
+ FileOutputStream os = new ParcelFileDescriptor.AutoCloseOutputStream(fd);
+ byte[] buffer = new byte[4096];
+ int readSize;
+ try {
+ while ((readSize = avatarDataStream.read(buffer)) > 0) {
+ os.write(buffer, 0, readSize);
+ }
+ return true;
+ } catch (IOException ioe) {
+ Log.e("copyProfilePhoto", "Error copying profile photo " + ioe);
+ } finally {
+ try {
+ os.close();
+ avatarDataStream.close();
+ } catch (IOException ioe) { }
+ }
+ return false;
+ }
+
+ public static String getMeProfileName(Context context) {
+ Cursor cursor = context.getContentResolver().query(
+ Profile.CONTENT_URI, new String[] {Phone._ID, Phone.DISPLAY_NAME},
+ null, null, null);
+ if (cursor == null) {
+ return null;
+ }
+
+ try {
+ if (cursor.moveToFirst()) {
+ return cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME));
+ }
+ } finally {
+ cursor.close();
+ }
+ return null;
+ }
}
diff --git a/src/com/android/settings/users/ProfileUpdateReceiver.java b/src/com/android/settings/users/ProfileUpdateReceiver.java
index 5513608..88daa58 100644
--- a/src/com/android/settings/users/ProfileUpdateReceiver.java
+++ b/src/com/android/settings/users/ProfileUpdateReceiver.java
@@ -19,64 +19,45 @@
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.UserInfo;
-import android.net.Uri;
-import android.os.ParcelFileDescriptor;
+import android.content.SharedPreferences;
import android.os.UserHandle;
import android.os.UserManager;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Profile;
-import android.util.Log;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import com.android.settings.Utils;
+
/**
* Watches for changes to Me Profile in Contacts and writes the photo to the User Manager.
*/
public class ProfileUpdateReceiver extends BroadcastReceiver {
+ private static final String KEY_PROFILE_NAME_COPIED_ONCE = "name_copied_once";
+
@Override
public void onReceive(final Context context, Intent intent) {
// Profile changed, lets get the photo and write to user manager
new Thread() {
public void run() {
- copyProfilePhoto(context, null);
+ Utils.copyMeProfilePhoto(context, null);
+ copyProfileName(context);
}
}.start();
}
- /* Used by UserSettings as well. Call this on a non-ui thread. */
- static boolean copyProfilePhoto(Context context, UserInfo user) {
- Uri contactUri = Profile.CONTENT_URI;
+ static void copyProfileName(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences("profile", Context.MODE_PRIVATE);
+ if (prefs.contains(KEY_PROFILE_NAME_COPIED_ONCE)) {
+ return;
+ }
- InputStream avatarDataStream = Contacts.openContactPhotoInputStream(
- context.getContentResolver(),
- contactUri, true);
- // If there's no profile photo, assign a default avatar
- if (avatarDataStream == null) {
- return false;
- }
- int userId = user != null ? user.id : UserHandle.myUserId();
+ int userId = UserHandle.myUserId();
UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
- ParcelFileDescriptor fd = um.setUserIcon(userId);
- FileOutputStream os = new ParcelFileDescriptor.AutoCloseOutputStream(fd);
- byte[] buffer = new byte[4096];
- int readSize;
- try {
- while ((readSize = avatarDataStream.read(buffer)) > 0) {
- os.write(buffer, 0, readSize);
- }
- return true;
- } catch (IOException ioe) {
- Log.e("copyProfilePhoto", "Error copying profile photo " + ioe);
- } finally {
- try {
- os.close();
- avatarDataStream.close();
- } catch (IOException ioe) { }
+ String profileName = Utils.getMeProfileName(context);
+ if (profileName != null && profileName.length() > 0) {
+ um.setUserName(userId, profileName);
+ // Flag that we've written the profile one time at least. No need to do it in the future.
+ prefs.edit().putBoolean(KEY_PROFILE_NAME_COPIED_ONCE, true).commit();
}
- return false;
}
}
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 28fe4c1..11948b4 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -16,6 +16,7 @@
package com.android.settings.users;
+import android.app.ActivityManagerNative;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver;
@@ -36,6 +37,7 @@
import android.os.Handler;
import android.os.Message;
import android.os.ParcelFileDescriptor;
+import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
import android.preference.EditTextPreference;
@@ -46,6 +48,7 @@
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Profile;
import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.text.InputType;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
@@ -54,8 +57,10 @@
import android.view.View.OnClickListener;
import android.widget.Toast;
+import com.android.internal.telephony.MccTable;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.Utils;
import java.io.FileOutputStream;
import java.io.IOException;
@@ -77,8 +82,10 @@
private static final int DIALOG_CONFIRM_REMOVE = 1;
private static final int DIALOG_ADD_USER = 2;
+ private static final int DIALOG_SETUP_USER = 3;
private static final int MESSAGE_UPDATE_LIST = 1;
+ private static final int MESSAGE_SETUP_USER = 2;
private static final int[] USER_DRAWABLES = {
R.drawable.ic_user,
@@ -98,6 +105,7 @@
private Preference mMePreference;
private EditTextPreference mNicknamePreference;
private int mRemovingUserId = -1;
+ private int mAddedUserId = 0;
private boolean mAddingUser;
private boolean mProfileExists;
@@ -111,6 +119,9 @@
case MESSAGE_UPDATE_LIST:
updateUserList();
break;
+ case MESSAGE_SETUP_USER:
+ onUserCreated(msg.arg1);
+ break;
}
}
};
@@ -136,7 +147,8 @@
}
mNicknamePreference = (EditTextPreference) findPreference(KEY_USER_NICKNAME);
mNicknamePreference.setOnPreferenceChangeListener(this);
- mNicknamePreference.setSummary(mUserManager.getUserInfo(UserHandle.myUserId()).name);
+ mNicknamePreference.getEditText().setInputType(
+ InputType.TYPE_TEXT_VARIATION_NORMAL | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
loadProfile();
setHasOptionsMenu(true);
getActivity().registerReceiver(mUserChangeReceiver,
@@ -229,13 +241,22 @@
}
}
+ private void onUserCreated(int userId) {
+ mAddedUserId = userId;
+ showDialog(DIALOG_SETUP_USER);
+ }
+
@Override
public Dialog onCreateDialog(int dialogId) {
switch (dialogId) {
case DIALOG_CONFIRM_REMOVE:
return new AlertDialog.Builder(getActivity())
- .setTitle(R.string.user_confirm_remove_title)
- .setMessage(R.string.user_confirm_remove_message)
+ .setTitle(UserHandle.myUserId() == mRemovingUserId
+ ? R.string.user_confirm_remove_self_title
+ : R.string.user_confirm_remove_title)
+ .setMessage(UserHandle.myUserId() == mRemovingUserId
+ ? R.string.user_confirm_remove_self_message
+ : R.string.user_confirm_remove_message)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
@@ -256,6 +277,19 @@
})
.setNegativeButton(android.R.string.cancel, null)
.create();
+ case DIALOG_SETUP_USER:
+ return 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();
+
default:
return null;
}
@@ -279,11 +313,12 @@
}
private void removeThisUser() {
- // TODO:
- Toast.makeText(getActivity(), "Not implemented yet!", Toast.LENGTH_SHORT).show();
-
- synchronized (mUserLock) {
- mRemovingUserId = -1;
+ try {
+ ActivityManagerNative.getDefault().switchUser(UserHandle.USER_OWNER);
+ ((UserManager) getActivity().getSystemService(Context.USER_SERVICE))
+ .removeUser(UserHandle.myUserId());
+ } catch (RemoteException re) {
+ Log.e(TAG, "Unable to remove self user");
}
}
@@ -302,12 +337,22 @@
synchronized (mUserLock) {
mAddingUser = false;
mHandler.sendEmptyMessage(MESSAGE_UPDATE_LIST);
+ mHandler.sendMessage(mHandler.obtainMessage(
+ MESSAGE_SETUP_USER, user.id, user.serialNumber));
}
}
}.start();
}
}
+ private void switchUserNow(int userId) {
+ try {
+ ActivityManagerNative.getDefault().switchUser(userId);
+ } catch (RemoteException re) {
+ // Nothing to do
+ }
+ }
+
private void updateUserList() {
List<UserInfo> users = mUserManager.getUsers();
@@ -318,6 +363,8 @@
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);
@@ -347,29 +394,17 @@
}
private void assignProfilePhoto(final UserInfo user) {
- if (!ProfileUpdateReceiver.copyProfilePhoto(getActivity(), user)) {
+ if (!Utils.copyMeProfilePhoto(getActivity(), user)) {
assignDefaultPhoto(user);
}
}
private String getProfileName() {
- Cursor cursor = getActivity().getContentResolver().query(
- Profile.CONTENT_URI, CONTACT_PROJECTION, null, null, null);
- if (cursor == null) {
- Log.w(TAG, "getProfileName() returned NULL cursor!"
- + " contact uri used " + Profile.CONTENT_URI);
- return null;
+ String name = Utils.getMeProfileName(getActivity());
+ if (name != null) {
+ mProfileExists = true;
}
-
- try {
- if (cursor.moveToFirst()) {
- mProfileExists = true;
- return cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME));
- }
- } finally {
- cursor.close();
- }
- return null;
+ return name;
}
private void assignDefaultPhoto(UserInfo user) {