diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 191a69612a169..9a50a41b4f278 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -1206,7 +1206,8 @@ final class ApplicationPackageManager extends PackageManager { return mPM.getUsers(); } catch (RemoteException re) { ArrayList users = new ArrayList(); - UserInfo primary = new UserInfo(0, "Root!", UserInfo.FLAG_ADMIN | UserInfo.FLAG_PRIMARY); + UserInfo primary = new UserInfo(0, "Root!", null, + UserInfo.FLAG_ADMIN | UserInfo.FLAG_PRIMARY); users.add(primary); return users; } @@ -1240,9 +1241,9 @@ final class ApplicationPackageManager extends PackageManager { * @hide */ @Override - public void updateUserName(int id, String name) { + public void setUserName(int id, String name) { try { - mPM.updateUserName(id, name); + mPM.setUserName(id, name); } catch (RemoteException re) { } } diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 70c0c48afa1d6..6f00abdb17089 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -41,6 +41,7 @@ import android.content.pm.ServiceInfo; import android.content.pm.UserInfo; import android.content.pm.VerifierDeviceIdentity; import android.net.Uri; +import android.os.ParcelFileDescriptor; import android.content.IntentSender; /** @@ -359,7 +360,8 @@ interface IPackageManager { UserInfo createUser(in String name, int flags); boolean removeUser(int userId); - void updateUserName(int userId, String name); + void setUserName(int userId, String name); + ParcelFileDescriptor setUserIcon(int userId); void installPackageWithVerification(in Uri packageURI, in IPackageInstallObserver observer, int flags, in String installerPackageName, in Uri verificationURI, diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 6de69b034acf0..f9f7e2d423519 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -2646,7 +2646,7 @@ public abstract class PackageManager { * @param name the new name for the user * @hide */ - public abstract void updateUserName(int id, String name); + public abstract void setUserName(int id, String name); /** * Changes the user's properties specified by the flags. diff --git a/core/java/android/content/pm/UserInfo.java b/core/java/android/content/pm/UserInfo.java index ba5331c774877..68a7257012ebb 100644 --- a/core/java/android/content/pm/UserInfo.java +++ b/core/java/android/content/pm/UserInfo.java @@ -43,12 +43,18 @@ public class UserInfo implements Parcelable { public int id; public String name; + public String iconPath; public int flags; public UserInfo(int id, String name, int flags) { + this(id, name, null, flags); + } + + public UserInfo(int id, String name, String iconPath, int flags) { this.id = id; this.name = name; this.flags = flags; + this.iconPath = iconPath; } public boolean isPrimary() { @@ -68,6 +74,7 @@ public class UserInfo implements Parcelable { public UserInfo(UserInfo orig) { name = orig.name; + iconPath = orig.iconPath; id = orig.id; flags = orig.flags; } @@ -84,6 +91,7 @@ public class UserInfo implements Parcelable { public void writeToParcel(Parcel dest, int parcelableFlags) { dest.writeInt(id); dest.writeString(name); + dest.writeString(iconPath); dest.writeInt(flags); } @@ -100,6 +108,7 @@ public class UserInfo implements Parcelable { private UserInfo(Parcel source) { id = source.readInt(); name = source.readString(); + iconPath = source.readString(); flags = source.readInt(); } } diff --git a/core/res/res/layout/global_actions_item.xml b/core/res/res/layout/global_actions_item.xml index 694301ea590ae..009f37b7edb49 100644 --- a/core/res/res/layout/global_actions_item.xml +++ b/core/res/res/layout/global_actions_item.xml @@ -27,11 +27,11 @@ android:paddingBottom="6dip" > + android:scaleType="center"/> + android:scaleType="centerCrop" + android:layout_marginRight="@dimen/preference_item_padding_inner" + /> mUsers = new SparseArray(); @@ -114,7 +125,7 @@ public class UserManager { } } - public void updateUserName(int userId, String name) { + public void setUserName(int userId, String name) { synchronized (mUsers) { UserInfo info = mUsers.get(userId); if (name != null && !name.equals(info.name)) { @@ -124,6 +135,39 @@ public class UserManager { } } + public ParcelFileDescriptor setUserIcon(int userId) { + synchronized (mUsers) { + UserInfo info = mUsers.get(userId); + if (info == null) return null; + ParcelFileDescriptor fd = updateIconBitmapLocked(info); + if (fd != null) { + writeUserLocked(info); + } + return fd; + } + } + + private ParcelFileDescriptor updateIconBitmapLocked(UserInfo info) { + try { + File dir = new File(mUsersDir, Integer.toString(info.id)); + File file = new File(dir, USER_PHOTO_FILENAME); + if (!dir.exists()) { + dir.mkdir(); + FileUtils.setPermissions( + dir.getPath(), + FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, + -1, -1); + } + ParcelFileDescriptor fd = ParcelFileDescriptor.open(file, + MODE_CREATE|MODE_READ_WRITE); + info.iconPath = file.getAbsolutePath(); + return fd; + } catch (FileNotFoundException e) { + Slog.w(TAG, "Error setting photo for user ", e); + } + return null; + } + /** * Returns an array of user ids. This array is cached here for quick access, so do not modify or * cache it elsewhere. @@ -187,7 +231,7 @@ public class UserManager { private void fallbackToSingleUserLocked() { // Create the primary user - UserInfo primary = new UserInfo(0, "Primary", + UserInfo primary = new UserInfo(0, "Primary", null, UserInfo.FLAG_ADMIN | UserInfo.FLAG_PRIMARY); mUsers.put(0, primary); updateUserIdsLocked(); @@ -219,6 +263,9 @@ public class UserManager { serializer.startTag(null, TAG_USER); serializer.attribute(null, ATTR_ID, Integer.toString(userInfo.id)); serializer.attribute(null, ATTR_FLAGS, Integer.toString(userInfo.flags)); + if (userInfo.iconPath != null) { + serializer.attribute(null, ATTR_ICON_PATH, userInfo.iconPath); + } serializer.startTag(null, TAG_NAME); serializer.text(userInfo.name); @@ -286,6 +333,7 @@ public class UserManager { private UserInfo readUser(int id) { int flags = 0; String name = null; + String iconPath = null; FileInputStream fis = null; try { @@ -312,6 +360,7 @@ public class UserManager { } String flagString = parser.getAttributeValue(null, ATTR_FLAGS); flags = Integer.parseInt(flagString); + iconPath = parser.getAttributeValue(null, ATTR_ICON_PATH); while ((type = parser.next()) != XmlPullParser.START_TAG && type != XmlPullParser.END_DOCUMENT) { @@ -324,7 +373,7 @@ public class UserManager { } } - UserInfo userInfo = new UserInfo(id, name, flags); + UserInfo userInfo = new UserInfo(id, name, iconPath, flags); return userInfo; } catch (IOException ioe) { @@ -342,7 +391,7 @@ public class UserManager { public UserInfo createUser(String name, int flags) { int userId = getNextAvailableId(); - UserInfo userInfo = new UserInfo(userId, name, flags); + UserInfo userInfo = new UserInfo(userId, name, null, flags); File userPath = new File(mBaseUserPath, Integer.toString(userId)); if (!createPackageFolders(userId, userPath)) { return null; diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java index c23e868c31236..416900f87140a 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java @@ -179,7 +179,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { @Override public List getUsers() { final ArrayList users = new ArrayList(); - users.add(new UserInfo(USER_ID, "Primary", UserInfo.FLAG_PRIMARY)); + users.add(new UserInfo(USER_ID, "Primary", null, UserInfo.FLAG_PRIMARY)); users.add(new UserInfo(USER_ID_GUEST, "Guest", 0)); return users; } diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java index 86689f3560f39..0399b3be232c4 100644 --- a/test-runner/src/android/test/mock/MockPackageManager.java +++ b/test-runner/src/android/test/mock/MockPackageManager.java @@ -545,7 +545,7 @@ public class MockPackageManager extends PackageManager { * @hide */ @Override - public void updateUserName(int id, String name) { + public void setUserName(int id, String name) { throw new UnsupportedOperationException(); }