Use Bitmap instead of ParcelFileDescriptor to get the user's icon.

Change-Id: I1dd7261b47ba98a2a0834dbfb8c22de369e6cc58
This commit is contained in:
Amith Yamasani
2012-09-17 18:31:45 -07:00
parent 64c6ee20ba
commit f34a85d5d5
3 changed files with 75 additions and 38 deletions

View File

@@ -27,6 +27,8 @@ import android.content.pm.UserInfo;
import android.content.res.Resources; import android.content.res.Resources;
import android.content.res.Resources.NotFoundException; import android.content.res.Resources.NotFoundException;
import android.database.Cursor; import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.LinkProperties; import android.net.LinkProperties;
@@ -473,24 +475,12 @@ public class Utils {
} }
int userId = user != null ? user.id : UserHandle.myUserId(); int userId = user != null ? user.id : UserHandle.myUserId();
UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE); UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
ParcelFileDescriptor fd = um.setUserIcon(userId); Bitmap icon = BitmapFactory.decodeStream(avatarDataStream);
FileOutputStream os = new ParcelFileDescriptor.AutoCloseOutputStream(fd); um.setUserIcon(userId, icon);
byte[] buffer = new byte[4096];
int readSize;
try { 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(); avatarDataStream.close();
} catch (IOException ioe) { } } catch (IOException ioe) { }
} return true;
return false;
} }
public static String getMeProfileName(Context context) { public static String getMeProfileName(Context context) {

View File

@@ -30,6 +30,7 @@ import android.database.Cursor;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.Bitmap.CompressFormat; import android.graphics.Bitmap.CompressFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.os.AsyncTask; import android.os.AsyncTask;
@@ -50,6 +51,7 @@ import android.provider.ContactsContract.Profile;
import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.text.InputType; import android.text.InputType;
import android.util.Log; import android.util.Log;
import android.util.SparseArray;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
@@ -65,6 +67,7 @@ import com.android.settings.Utils;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public class UserSettings extends SettingsPreferenceFragment public class UserSettings extends SettingsPreferenceFragment
@@ -111,6 +114,7 @@ public class UserSettings extends SettingsPreferenceFragment
private final Object mUserLock = new Object(); private final Object mUserLock = new Object();
private UserManager mUserManager; private UserManager mUserManager;
private SparseArray<Drawable> mUserIcons = new SparseArray<Drawable>();
private Handler mHandler = new Handler() { private Handler mHandler = new Handler() {
@Override @Override
@@ -127,9 +131,16 @@ public class UserSettings extends SettingsPreferenceFragment
}; };
private BroadcastReceiver mUserChangeReceiver = new BroadcastReceiver() { private BroadcastReceiver mUserChangeReceiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_USER_REMOVED)) {
mRemovingUserId = -1;
} else if (intent.getAction().equals(Intent.ACTION_USER_INFO_CHANGED)) {
int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
if (userHandle != -1) {
mUserIcons.remove(userHandle);
}
}
mHandler.sendEmptyMessage(MESSAGE_UPDATE_LIST); mHandler.sendEmptyMessage(MESSAGE_UPDATE_LIST);
} }
}; };
@@ -151,8 +162,10 @@ public class UserSettings extends SettingsPreferenceFragment
InputType.TYPE_TEXT_VARIATION_NORMAL | InputType.TYPE_TEXT_FLAG_CAP_WORDS); InputType.TYPE_TEXT_VARIATION_NORMAL | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
loadProfile(); loadProfile();
setHasOptionsMenu(true); setHasOptionsMenu(true);
getActivity().registerReceiver(mUserChangeReceiver, IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED);
new IntentFilter(Intent.ACTION_USER_REMOVED)); filter.addAction(Intent.ACTION_USER_INFO_CHANGED);
getActivity().registerReceiverAsUser(mUserChangeReceiver, UserHandle.ALL, filter, null,
mHandler);
} }
@Override @Override
@@ -219,7 +232,13 @@ public class UserSettings extends SettingsPreferenceFragment
private void finishLoadProfile(String profileName) { private void finishLoadProfile(String profileName) {
mMePreference.setTitle(profileName); mMePreference.setTitle(profileName);
setPhotoId(mMePreference, mUserManager.getUserInfo(UserHandle.myUserId())); int myUserId = UserHandle.myUserId();
Bitmap b = mUserManager.getUserIcon(myUserId);
if (b != null) {
Drawable d = new BitmapDrawable(b);
mMePreference.setIcon(d);
mUserIcons.put(myUserId, d);
}
} }
private void onAddUserClicked() { private void onAddUserClicked() {
@@ -302,10 +321,8 @@ public class UserSettings extends SettingsPreferenceFragment
new Thread() { new Thread() {
public void run() { public void run() {
synchronized (mUserLock) { synchronized (mUserLock) {
// TODO: Show some progress while removing the user
mUserManager.removeUser(mRemovingUserId); mUserManager.removeUser(mRemovingUserId);
mHandler.sendEmptyMessage(MESSAGE_UPDATE_LIST); mHandler.sendEmptyMessage(MESSAGE_UPDATE_LIST);
mRemovingUserId = -1;
} }
} }
}.start(); }.start();
@@ -354,14 +371,18 @@ public class UserSettings extends SettingsPreferenceFragment
} }
private void updateUserList() { private void updateUserList() {
if (getActivity() == null) return;
List<UserInfo> users = mUserManager.getUsers(); List<UserInfo> users = mUserManager.getUsers();
mUserListCategory.removeAll(); mUserListCategory.removeAll();
mUserListCategory.setOrderingAsAdded(false); mUserListCategory.setOrderingAsAdded(false);
final ArrayList<Integer> missingIcons = new ArrayList<Integer>();
for (UserInfo user : users) { for (UserInfo user : users) {
Preference pref; Preference pref;
if (user.id == UserHandle.myUserId()) { if (user.id == mRemovingUserId) {
continue;
} else if (user.id == UserHandle.myUserId()) {
pref = mMePreference; pref = mMePreference;
mNicknamePreference.setText(user.name); mNicknamePreference.setText(user.name);
mNicknamePreference.setSummary(user.name); mNicknamePreference.setSummary(user.name);
@@ -377,9 +398,14 @@ public class UserSettings extends SettingsPreferenceFragment
pref.setTitle(user.name); pref.setTitle(user.name);
} }
if (user.iconPath != null) { if (user.iconPath != null) {
if (mUserIcons.get(user.id) == null) {
missingIcons.add(user.id);
pref.setIcon(R.drawable.ic_user);
} else {
setPhotoId(pref, user); setPhotoId(pref, user);
} }
} }
}
// Add a temporary entry for the user being created // Add a temporary entry for the user being created
if (mAddingUser) { if (mAddingUser) {
Preference pref = new UserPreference(getActivity(), null, UserPreference.USERID_UNKNOWN, Preference pref = new UserPreference(getActivity(), null, UserPreference.USERID_UNKNOWN,
@@ -391,8 +417,33 @@ public class UserSettings extends SettingsPreferenceFragment
mUserListCategory.addPreference(pref); mUserListCategory.addPreference(pref);
} }
getActivity().invalidateOptionsMenu(); getActivity().invalidateOptionsMenu();
// Load the icons
if (missingIcons.size() > 0) {
loadIconsAsync(missingIcons);
}
} }
private void loadIconsAsync(List<Integer> missingIcons) {
new AsyncTask<List<Integer>, Void, Void>() {
@Override
protected void onPostExecute(Void result) {
updateUserList();
}
@Override
protected Void doInBackground(List<Integer>... values) {
if (getActivity() == null) return null;
for (int userId : values[0]) {
Bitmap bitmap = mUserManager.getUserIcon(userId);
Drawable d = new BitmapDrawable(getResources(), bitmap);
mUserIcons.append(userId, d);
}
return null;
}
}.execute(missingIcons);
}
private void assignProfilePhoto(final UserInfo user) { private void assignProfilePhoto(final UserInfo user) {
if (!Utils.copyMeProfilePhoto(getActivity(), user)) { if (!Utils.copyMeProfilePhoto(getActivity(), user)) {
assignDefaultPhoto(user); assignDefaultPhoto(user);
@@ -410,17 +461,13 @@ public class UserSettings extends SettingsPreferenceFragment
private void assignDefaultPhoto(UserInfo user) { private void assignDefaultPhoto(UserInfo user) {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
USER_DRAWABLES[user.id % USER_DRAWABLES.length]); USER_DRAWABLES[user.id % USER_DRAWABLES.length]);
ParcelFileDescriptor fd = mUserManager.setUserIcon(user.id); mUserManager.setUserIcon(user.id, bitmap);
if (fd != null) {
bitmap.compress(CompressFormat.PNG, 100,
new ParcelFileDescriptor.AutoCloseOutputStream(fd));
}
} }
private void setPhotoId(Preference pref, UserInfo user) { private void setPhotoId(Preference pref, UserInfo user) {
Drawable icon = UserUtils.getUserIcon(mUserManager, user); Drawable d = mUserIcons.get(user.id); // UserUtils.getUserIcon(mUserManager, user);
if (icon != null) { if (d != null) {
pref.setIcon(icon); pref.setIcon(d);
} }
} }

View File

@@ -17,6 +17,8 @@
package com.android.settings.users; package com.android.settings.users;
import android.content.pm.UserInfo; import android.content.pm.UserInfo;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.os.UserManager; import android.os.UserManager;
@@ -25,10 +27,8 @@ public class UserUtils {
public static Drawable getUserIcon(UserManager um, UserInfo user) { public static Drawable getUserIcon(UserManager um, UserInfo user) {
if (user.iconPath == null) return null; if (user.iconPath == null) return null;
ParcelFileDescriptor fd = um.getUserIcon(user.id); Bitmap icon = um.getUserIcon(user.id);
if (fd == null) return null; if (icon == null) return null;
Drawable d = Drawable.createFromStream(new ParcelFileDescriptor.AutoCloseInputStream(fd), return new BitmapDrawable(icon);
user.iconPath);
return d;
} }
} }