blob: 0a5e49606327bcb1d50794c94118edd0783ca0b8 [file] [log] [blame]
Amith Yamasanib810a0d2012-03-25 10:12:26 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.settings.users;
18
Amith Yamasaniae47ef42012-09-16 17:53:35 -070019import android.app.ActivityManagerNative;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -070020import android.app.AlertDialog;
21import android.app.Dialog;
22import android.content.BroadcastReceiver;
Amith Yamasani32630392012-08-10 19:31:39 -070023import android.content.Context;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -070024import android.content.DialogInterface;
25import android.content.Intent;
26import android.content.IntentFilter;
Svetoslav Ganov263f7442012-09-25 16:11:16 -070027import android.content.SharedPreferences;
Amith Yamasanib810a0d2012-03-25 10:12:26 -070028import android.content.pm.UserInfo;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -070029import android.graphics.Bitmap;
30import android.graphics.BitmapFactory;
Amith Yamasanif34a85d2012-09-17 18:31:45 -070031import android.graphics.drawable.BitmapDrawable;
Amith Yamasani48fa8572012-04-17 17:12:01 -070032import android.graphics.drawable.Drawable;
Amith Yamasani32dccbc2012-09-13 18:06:49 -070033import android.os.AsyncTask;
Amith Yamasanib810a0d2012-03-25 10:12:26 -070034import android.os.Bundle;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -070035import android.os.Handler;
36import android.os.Message;
Amith Yamasaniae47ef42012-09-16 17:53:35 -070037import android.os.RemoteException;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -070038import android.os.UserHandle;
Amith Yamasani32630392012-08-10 19:31:39 -070039import android.os.UserManager;
Amith Yamasanib810a0d2012-03-25 10:12:26 -070040import android.preference.Preference;
Amith Yamasani1a634d32012-09-27 23:01:35 -070041import android.preference.PreferenceScreen;
Amith Yamasanib810a0d2012-03-25 10:12:26 -070042import android.preference.Preference.OnPreferenceClickListener;
Amith Yamasanib810a0d2012-03-25 10:12:26 -070043import android.preference.PreferenceGroup;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -070044import android.provider.ContactsContract;
45import android.provider.ContactsContract.Contacts;
Amith Yamasaniae47ef42012-09-16 17:53:35 -070046import android.text.InputType;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -070047import android.util.Log;
Amith Yamasanif34a85d2012-09-17 18:31:45 -070048import android.util.SparseArray;
Amith Yamasanib810a0d2012-03-25 10:12:26 -070049import android.view.Menu;
50import android.view.MenuInflater;
51import android.view.MenuItem;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -070052import android.view.View;
53import android.view.View.OnClickListener;
Amith Yamasanib810a0d2012-03-25 10:12:26 -070054
55import com.android.settings.R;
Amith Yamasani9627a8e2012-09-23 12:54:14 -070056import com.android.settings.SelectableEditTextPreference;
Amith Yamasanib810a0d2012-03-25 10:12:26 -070057import com.android.settings.SettingsPreferenceFragment;
Amith Yamasaniae47ef42012-09-16 17:53:35 -070058import com.android.settings.Utils;
Amith Yamasanib810a0d2012-03-25 10:12:26 -070059
Amith Yamasanif34a85d2012-09-17 18:31:45 -070060import java.util.ArrayList;
Amith Yamasanib810a0d2012-03-25 10:12:26 -070061import java.util.List;
62
63public class UserSettings extends SettingsPreferenceFragment
Amith Yamasanidc6bfa62012-09-06 18:04:06 -070064 implements OnPreferenceClickListener, OnClickListener, DialogInterface.OnDismissListener,
65 Preference.OnPreferenceChangeListener {
Amith Yamasanib810a0d2012-03-25 10:12:26 -070066
Amith Yamasanidc6bfa62012-09-06 18:04:06 -070067 private static final String TAG = "UserSettings";
68
69 private static final String KEY_USER_NICKNAME = "user_nickname";
Amith Yamasanib810a0d2012-03-25 10:12:26 -070070 private static final String KEY_USER_LIST = "user_list";
Amith Yamasanidc6bfa62012-09-06 18:04:06 -070071 private static final String KEY_USER_ME = "user_me";
72
Amith Yamasanib810a0d2012-03-25 10:12:26 -070073 private static final int MENU_ADD_USER = Menu.FIRST;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -070074 private static final int MENU_REMOVE_USER = Menu.FIRST+1;
75
76 private static final int DIALOG_CONFIRM_REMOVE = 1;
77 private static final int DIALOG_ADD_USER = 2;
Amith Yamasaniae47ef42012-09-16 17:53:35 -070078 private static final int DIALOG_SETUP_USER = 3;
Amith Yamasani1a634d32012-09-27 23:01:35 -070079 private static final int DIALOG_USER_CANNOT_MANAGE = 4;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -070080
81 private static final int MESSAGE_UPDATE_LIST = 1;
Amith Yamasaniae47ef42012-09-16 17:53:35 -070082 private static final int MESSAGE_SETUP_USER = 2;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -070083
Svetoslav Ganov263f7442012-09-25 16:11:16 -070084 private static final String KEY_ADD_USER_LONG_MESSAGE_DISPLAYED =
85 "key_add_user_long_message_displayed";
86
Amith Yamasanidc6bfa62012-09-06 18:04:06 -070087 private static final int[] USER_DRAWABLES = {
88 R.drawable.ic_user,
89 R.drawable.ic_user_cyan,
90 R.drawable.ic_user_green,
91 R.drawable.ic_user_purple,
92 R.drawable.ic_user_red,
93 R.drawable.ic_user_yellow
94 };
95
Amith Yamasanib810a0d2012-03-25 10:12:26 -070096 private PreferenceGroup mUserListCategory;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -070097 private Preference mMePreference;
Amith Yamasani9627a8e2012-09-23 12:54:14 -070098 private SelectableEditTextPreference mNicknamePreference;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -070099 private int mRemovingUserId = -1;
Amith Yamasaniae47ef42012-09-16 17:53:35 -0700100 private int mAddedUserId = 0;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700101 private boolean mAddingUser;
Amith Yamasani32dccbc2012-09-13 18:06:49 -0700102 private boolean mProfileExists;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700103
104 private final Object mUserLock = new Object();
105 private UserManager mUserManager;
Amith Yamasanif34a85d2012-09-17 18:31:45 -0700106 private SparseArray<Drawable> mUserIcons = new SparseArray<Drawable>();
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700107
108 private Handler mHandler = new Handler() {
109 @Override
110 public void handleMessage(Message msg) {
111 switch (msg.what) {
112 case MESSAGE_UPDATE_LIST:
113 updateUserList();
114 break;
Amith Yamasaniae47ef42012-09-16 17:53:35 -0700115 case MESSAGE_SETUP_USER:
116 onUserCreated(msg.arg1);
117 break;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700118 }
119 }
120 };
121
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700122 private BroadcastReceiver mUserChangeReceiver = new BroadcastReceiver() {
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700123 @Override
124 public void onReceive(Context context, Intent intent) {
Amith Yamasanif34a85d2012-09-17 18:31:45 -0700125 if (intent.getAction().equals(Intent.ACTION_USER_REMOVED)) {
126 mRemovingUserId = -1;
127 } else if (intent.getAction().equals(Intent.ACTION_USER_INFO_CHANGED)) {
128 int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
129 if (userHandle != -1) {
130 mUserIcons.remove(userHandle);
131 }
132 }
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700133 mHandler.sendEmptyMessage(MESSAGE_UPDATE_LIST);
134 }
135 };
Amith Yamasanib810a0d2012-03-25 10:12:26 -0700136
137 @Override
138 public void onCreate(Bundle icicle) {
139 super.onCreate(icicle);
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700140 mUserManager = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
Amith Yamasanib810a0d2012-03-25 10:12:26 -0700141 addPreferencesFromResource(R.xml.user_settings);
142 mUserListCategory = (PreferenceGroup) findPreference(KEY_USER_LIST);
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700143 mMePreference = (Preference) findPreference(KEY_USER_ME);
144 mMePreference.setOnPreferenceClickListener(this);
145 if (UserHandle.myUserId() != UserHandle.USER_OWNER) {
146 mMePreference.setSummary(null);
147 }
Amith Yamasani9627a8e2012-09-23 12:54:14 -0700148 mNicknamePreference = (SelectableEditTextPreference) findPreference(KEY_USER_NICKNAME);
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700149 mNicknamePreference.setOnPreferenceChangeListener(this);
Amith Yamasaniae47ef42012-09-16 17:53:35 -0700150 mNicknamePreference.getEditText().setInputType(
151 InputType.TYPE_TEXT_VARIATION_NORMAL | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
Amith Yamasani9627a8e2012-09-23 12:54:14 -0700152 mNicknamePreference.setInitialSelectionMode(
153 SelectableEditTextPreference.SELECTION_SELECT_ALL);
Amith Yamasani32dccbc2012-09-13 18:06:49 -0700154 loadProfile();
Amith Yamasanib810a0d2012-03-25 10:12:26 -0700155 setHasOptionsMenu(true);
Amith Yamasanif34a85d2012-09-17 18:31:45 -0700156 IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED);
157 filter.addAction(Intent.ACTION_USER_INFO_CHANGED);
158 getActivity().registerReceiverAsUser(mUserChangeReceiver, UserHandle.ALL, filter, null,
159 mHandler);
Amith Yamasanib810a0d2012-03-25 10:12:26 -0700160 }
161
162 @Override
163 public void onResume() {
164 super.onResume();
Amith Yamasani32dccbc2012-09-13 18:06:49 -0700165 loadProfile();
Amith Yamasanib810a0d2012-03-25 10:12:26 -0700166 updateUserList();
167 }
168
169 @Override
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700170 public void onDestroy() {
171 super.onDestroy();
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700172 getActivity().unregisterReceiver(mUserChangeReceiver);
173 }
174
175 @Override
Amith Yamasanib810a0d2012-03-25 10:12:26 -0700176 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700177 if (UserHandle.myUserId() == UserHandle.USER_OWNER) {
Svetoslav Ganov263f7442012-09-25 16:11:16 -0700178 if (UserManager.getMaxSupportedUsers() > mUserManager.getUsers(false).size()) {
Amith Yamasani6be075d2012-09-11 11:01:35 -0700179 MenuItem addUserItem = menu.add(0, MENU_ADD_USER, 0, R.string.user_add_user_menu);
180 addUserItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM
181 | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
182 }
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700183 } else {
Amith Yamasani1a634d32012-09-27 23:01:35 -0700184 String nickname = mUserManager.getUserName();
185 MenuItem removeThisUser = menu.add(0, MENU_REMOVE_USER, 0,
186 getResources().getString(R.string.user_remove_user_menu, nickname));
187 removeThisUser.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700188 }
Amith Yamasani38223dc2012-09-18 09:51:07 -0700189 super.onCreateOptionsMenu(menu, inflater);
Amith Yamasanib810a0d2012-03-25 10:12:26 -0700190 }
191
192 @Override
193 public boolean onOptionsItemSelected(MenuItem item) {
194 final int itemId = item.getItemId();
195 if (itemId == MENU_ADD_USER) {
196 onAddUserClicked();
197 return true;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700198 } else if (itemId == MENU_REMOVE_USER) {
199 onRemoveUserClicked(UserHandle.myUserId());
200 return true;
Amith Yamasanib810a0d2012-03-25 10:12:26 -0700201 } else {
202 return super.onOptionsItemSelected(item);
203 }
204 }
205
Amith Yamasani32dccbc2012-09-13 18:06:49 -0700206 private void loadProfile() {
207 mProfileExists = false;
208 new AsyncTask<Void, Void, String>() {
209 @Override
210 protected void onPostExecute(String result) {
211 finishLoadProfile(result);
212 }
213
214 @Override
215 protected String doInBackground(Void... values) {
216 UserInfo user = mUserManager.getUserInfo(UserHandle.myUserId());
217 if (user.iconPath == null || user.iconPath.equals("")) {
218 assignProfilePhoto(user);
219 }
220 String profileName = getProfileName();
221 return profileName;
222 }
223 }.execute();
224 }
225
226 private void finishLoadProfile(String profileName) {
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700227 mMePreference.setTitle(profileName);
Amith Yamasanif34a85d2012-09-17 18:31:45 -0700228 int myUserId = UserHandle.myUserId();
229 Bitmap b = mUserManager.getUserIcon(myUserId);
230 if (b != null) {
231 Drawable d = new BitmapDrawable(b);
232 mMePreference.setIcon(d);
233 mUserIcons.put(myUserId, d);
234 }
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700235 }
236
Amith Yamasanib810a0d2012-03-25 10:12:26 -0700237 private void onAddUserClicked() {
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700238 synchronized (mUserLock) {
239 if (mRemovingUserId == -1 && !mAddingUser) {
240 showDialog(DIALOG_ADD_USER);
241 setOnDismissListener(this);
242 }
243 }
244 }
245
246 private void onRemoveUserClicked(int userId) {
247 synchronized (mUserLock) {
248 if (mRemovingUserId == -1 && !mAddingUser) {
249 mRemovingUserId = userId;
250 showDialog(DIALOG_CONFIRM_REMOVE);
251 setOnDismissListener(this);
252 }
253 }
254 }
255
Amith Yamasaniae47ef42012-09-16 17:53:35 -0700256 private void onUserCreated(int userId) {
257 mAddedUserId = userId;
258 showDialog(DIALOG_SETUP_USER);
259 }
260
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700261 @Override
262 public Dialog onCreateDialog(int dialogId) {
263 switch (dialogId) {
264 case DIALOG_CONFIRM_REMOVE:
265 return new AlertDialog.Builder(getActivity())
Amith Yamasaniae47ef42012-09-16 17:53:35 -0700266 .setTitle(UserHandle.myUserId() == mRemovingUserId
267 ? R.string.user_confirm_remove_self_title
268 : R.string.user_confirm_remove_title)
269 .setMessage(UserHandle.myUserId() == mRemovingUserId
270 ? R.string.user_confirm_remove_self_message
271 : R.string.user_confirm_remove_message)
Amith Yamasani1a634d32012-09-27 23:01:35 -0700272 .setPositiveButton(R.string.user_delete_button,
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700273 new DialogInterface.OnClickListener() {
274 public void onClick(DialogInterface dialog, int which) {
275 removeUserNow();
276 }
277 })
278 .setNegativeButton(android.R.string.cancel, null)
279 .create();
Amith Yamasani1a634d32012-09-27 23:01:35 -0700280 case DIALOG_USER_CANNOT_MANAGE:
281 return new AlertDialog.Builder(getActivity())
282 .setMessage(R.string.user_cannot_manage_message)
283 .setPositiveButton(android.R.string.ok, null)
284 .create();
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700285 case DIALOG_ADD_USER:
Svetoslav Ganov263f7442012-09-25 16:11:16 -0700286 final SharedPreferences preferences = getActivity().getPreferences(
287 Context.MODE_PRIVATE);
288 final boolean longMessageDisplayed = preferences.getBoolean(
289 KEY_ADD_USER_LONG_MESSAGE_DISPLAYED, false);
290 final int messageResId = longMessageDisplayed
291 ? R.string.user_add_user_message_short
292 : R.string.user_add_user_message_long;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700293 return new AlertDialog.Builder(getActivity())
294 .setTitle(R.string.user_add_user_title)
Svetoslav Ganov263f7442012-09-25 16:11:16 -0700295 .setMessage(messageResId)
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700296 .setPositiveButton(android.R.string.ok,
297 new DialogInterface.OnClickListener() {
298 public void onClick(DialogInterface dialog, int which) {
299 addUserNow();
Svetoslav Ganov263f7442012-09-25 16:11:16 -0700300 if (!longMessageDisplayed) {
301 preferences.edit().putBoolean(KEY_ADD_USER_LONG_MESSAGE_DISPLAYED,
302 true).commit();
303 }
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700304 }
305 })
306 .setNegativeButton(android.R.string.cancel, null)
307 .create();
Amith Yamasaniae47ef42012-09-16 17:53:35 -0700308 case DIALOG_SETUP_USER:
309 return new AlertDialog.Builder(getActivity())
310 .setTitle(R.string.user_setup_dialog_title)
311 .setMessage(R.string.user_setup_dialog_message)
312 .setPositiveButton(R.string.user_setup_button_setup_now,
313 new DialogInterface.OnClickListener() {
314 public void onClick(DialogInterface dialog, int which) {
315 switchUserNow(mAddedUserId);
316 }
317 })
318 .setNegativeButton(R.string.user_setup_button_setup_later, null)
319 .create();
320
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700321 default:
322 return null;
323 }
324 }
325
326 private void removeUserNow() {
327 if (mRemovingUserId == UserHandle.myUserId()) {
328 removeThisUser();
329 } else {
330 new Thread() {
331 public void run() {
332 synchronized (mUserLock) {
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700333 mUserManager.removeUser(mRemovingUserId);
334 mHandler.sendEmptyMessage(MESSAGE_UPDATE_LIST);
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700335 }
336 }
337 }.start();
338 }
339 }
340
341 private void removeThisUser() {
Amith Yamasaniae47ef42012-09-16 17:53:35 -0700342 try {
343 ActivityManagerNative.getDefault().switchUser(UserHandle.USER_OWNER);
344 ((UserManager) getActivity().getSystemService(Context.USER_SERVICE))
345 .removeUser(UserHandle.myUserId());
346 } catch (RemoteException re) {
347 Log.e(TAG, "Unable to remove self user");
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700348 }
349 }
350
351 private void addUserNow() {
352 synchronized (mUserLock) {
353 mAddingUser = true;
354 updateUserList();
355 new Thread() {
356 public void run() {
357 // Could take a few seconds
358 UserInfo user = mUserManager.createUser(
359 getActivity().getResources().getString(R.string.user_new_user_name), 0);
360 if (user != null) {
361 assignDefaultPhoto(user);
362 }
363 synchronized (mUserLock) {
364 mAddingUser = false;
365 mHandler.sendEmptyMessage(MESSAGE_UPDATE_LIST);
Amith Yamasaniae47ef42012-09-16 17:53:35 -0700366 mHandler.sendMessage(mHandler.obtainMessage(
367 MESSAGE_SETUP_USER, user.id, user.serialNumber));
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700368 }
369 }
370 }.start();
371 }
Amith Yamasanib810a0d2012-03-25 10:12:26 -0700372 }
373
Amith Yamasaniae47ef42012-09-16 17:53:35 -0700374 private void switchUserNow(int userId) {
375 try {
376 ActivityManagerNative.getDefault().switchUser(userId);
377 } catch (RemoteException re) {
378 // Nothing to do
379 }
380 }
381
Amith Yamasanib810a0d2012-03-25 10:12:26 -0700382 private void updateUserList() {
Amith Yamasanif34a85d2012-09-17 18:31:45 -0700383 if (getActivity() == null) return;
Amith Yamasanie278eda2012-09-20 22:44:48 -0700384 List<UserInfo> users = mUserManager.getUsers(true);
Amith Yamasanib810a0d2012-03-25 10:12:26 -0700385
386 mUserListCategory.removeAll();
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700387 mUserListCategory.setOrderingAsAdded(false);
388
Amith Yamasanif34a85d2012-09-17 18:31:45 -0700389 final ArrayList<Integer> missingIcons = new ArrayList<Integer>();
Amith Yamasanib810a0d2012-03-25 10:12:26 -0700390 for (UserInfo user : users) {
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700391 Preference pref;
Amith Yamasanif34a85d2012-09-17 18:31:45 -0700392 if (user.id == mRemovingUserId) {
393 continue;
394 } else if (user.id == UserHandle.myUserId()) {
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700395 pref = mMePreference;
Amith Yamasani1a634d32012-09-27 23:01:35 -0700396 mNicknamePreference.setText(user.name);
Amith Yamasaniae47ef42012-09-16 17:53:35 -0700397 mNicknamePreference.setSummary(user.name);
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700398 } else {
399 pref = new UserPreference(getActivity(), null, user.id,
400 UserHandle.myUserId() == UserHandle.USER_OWNER, this);
401 pref.setOnPreferenceClickListener(this);
402 pref.setKey("id=" + user.id);
403 mUserListCategory.addPreference(pref);
404 if (user.id == UserHandle.USER_OWNER) {
405 pref.setSummary(R.string.user_owner);
406 }
407 pref.setTitle(user.name);
Amith Yamasani1a634d32012-09-27 23:01:35 -0700408 if (!isInitialized(user)) {
409 pref.setSummary(R.string.user_summary_not_set_up);
410 }
Amith Yamasani48fa8572012-04-17 17:12:01 -0700411 }
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700412 if (user.iconPath != null) {
Amith Yamasanif34a85d2012-09-17 18:31:45 -0700413 if (mUserIcons.get(user.id) == null) {
414 missingIcons.add(user.id);
415 pref.setIcon(R.drawable.ic_user);
416 } else {
417 setPhotoId(pref, user);
418 }
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700419 }
420 }
421 // Add a temporary entry for the user being created
422 if (mAddingUser) {
423 Preference pref = new UserPreference(getActivity(), null, UserPreference.USERID_UNKNOWN,
424 false, null);
425 pref.setEnabled(false);
426 pref.setTitle(R.string.user_new_user_name);
427 pref.setSummary(R.string.user_adding_new_user);
428 pref.setIcon(R.drawable.ic_user);
Amith Yamasanib810a0d2012-03-25 10:12:26 -0700429 mUserListCategory.addPreference(pref);
430 }
Amith Yamasani6be075d2012-09-11 11:01:35 -0700431 getActivity().invalidateOptionsMenu();
Amith Yamasanif34a85d2012-09-17 18:31:45 -0700432
433 // Load the icons
434 if (missingIcons.size() > 0) {
435 loadIconsAsync(missingIcons);
436 }
Amith Yamasanib810a0d2012-03-25 10:12:26 -0700437 }
438
Amith Yamasanif34a85d2012-09-17 18:31:45 -0700439 private void loadIconsAsync(List<Integer> missingIcons) {
440 new AsyncTask<List<Integer>, Void, Void>() {
441 @Override
442 protected void onPostExecute(Void result) {
443 updateUserList();
444 }
445
446 @Override
447 protected Void doInBackground(List<Integer>... values) {
448 if (getActivity() == null) return null;
449 for (int userId : values[0]) {
450 Bitmap bitmap = mUserManager.getUserIcon(userId);
451 Drawable d = new BitmapDrawable(getResources(), bitmap);
452 mUserIcons.append(userId, d);
453 }
454 return null;
455 }
456 }.execute(missingIcons);
457
458 }
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700459 private void assignProfilePhoto(final UserInfo user) {
Amith Yamasaniae47ef42012-09-16 17:53:35 -0700460 if (!Utils.copyMeProfilePhoto(getActivity(), user)) {
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700461 assignDefaultPhoto(user);
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700462 }
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700463 }
464
465 private String getProfileName() {
Amith Yamasaniae47ef42012-09-16 17:53:35 -0700466 String name = Utils.getMeProfileName(getActivity());
467 if (name != null) {
468 mProfileExists = true;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700469 }
Amith Yamasaniae47ef42012-09-16 17:53:35 -0700470 return name;
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700471 }
472
473 private void assignDefaultPhoto(UserInfo user) {
474 Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
475 USER_DRAWABLES[user.id % USER_DRAWABLES.length]);
Amith Yamasanif34a85d2012-09-17 18:31:45 -0700476 mUserManager.setUserIcon(user.id, bitmap);
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700477 }
478
479 private void setPhotoId(Preference pref, UserInfo user) {
Amith Yamasanif34a85d2012-09-17 18:31:45 -0700480 Drawable d = mUserIcons.get(user.id); // UserUtils.getUserIcon(mUserManager, user);
481 if (d != null) {
482 pref.setIcon(d);
Amith Yamasanie940dac2012-09-17 10:21:27 -0700483 }
Amith Yamasani48fa8572012-04-17 17:12:01 -0700484 }
485
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700486 private void setUserName(String name) {
487 mUserManager.setUserName(UserHandle.myUserId(), name);
488 mNicknamePreference.setSummary(name);
Amith Yamasani1a634d32012-09-27 23:01:35 -0700489 getActivity().invalidateOptionsMenu();
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700490 }
491
Amith Yamasanib810a0d2012-03-25 10:12:26 -0700492 @Override
493 public boolean onPreferenceClick(Preference pref) {
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700494 if (pref == mMePreference) {
Amith Yamasani32dccbc2012-09-13 18:06:49 -0700495 Intent editProfile;
496 if (!mProfileExists) {
497 editProfile = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
498 // TODO: Make this a proper API
499 editProfile.putExtra("newLocalProfile", true);
500 } else {
501 editProfile = new Intent(Intent.ACTION_EDIT, ContactsContract.Profile.CONTENT_URI);
502 }
Amith Yamasani43db5262012-09-11 17:04:10 -0700503 // To make sure that it returns back here when done
504 // TODO: Make this a proper API
505 editProfile.putExtra("finishActivityOnSaveCompleted", true);
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700506 startActivity(editProfile);
Amith Yamasani1a634d32012-09-27 23:01:35 -0700507 } else if (pref instanceof UserPreference) {
508 int userId = ((UserPreference) pref).getUserId();
509 // Get the latest status of the user
510 UserInfo user = mUserManager.getUserInfo(userId);
511 if (UserHandle.myUserId() != UserHandle.USER_OWNER) {
512 showDialog(DIALOG_USER_CANNOT_MANAGE);
513 } else {
514 if (!isInitialized(user)) {
515 mHandler.sendMessage(mHandler.obtainMessage(
516 MESSAGE_SETUP_USER, user.id, user.serialNumber));
517 }
518 }
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700519 }
520 return false;
521 }
522
Amith Yamasani1a634d32012-09-27 23:01:35 -0700523 private boolean isInitialized(UserInfo user) {
524 return (user.flags & UserInfo.FLAG_INITIALIZED) != 0;
525 }
526
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700527 @Override
528 public void onClick(View v) {
529 if (v.getTag() instanceof UserPreference) {
530 int userId = ((UserPreference) v.getTag()).getUserId();
531 onRemoveUserClicked(userId);
532 }
533 }
534
535 @Override
536 public void onDismiss(DialogInterface dialog) {
537 synchronized (mUserLock) {
538 mAddingUser = false;
539 mRemovingUserId = -1;
540 }
541 }
542
543 @Override
544 public boolean onPreferenceChange(Preference preference, Object newValue) {
545 if (preference == mNicknamePreference) {
546 String value = (String) newValue;
547 if (preference == mNicknamePreference && value != null
548 && value.length() > 0) {
549 setUserName(value);
550 }
Amith Yamasanib810a0d2012-03-25 10:12:26 -0700551 return true;
552 }
553 return false;
554 }
Amith Yamasanidc6bfa62012-09-06 18:04:06 -0700555
Amith Yamasani38223dc2012-09-18 09:51:07 -0700556 @Override
557 public int getHelpResource() {
558 return R.string.help_url_users;
559 }
Amith Yamasanib810a0d2012-03-25 10:12:26 -0700560}