diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index d746745d98491..6860683679fd4 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -66,6 +66,7 @@ import android.view.Display; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.Preconditions; +import com.android.internal.util.UserIcons; import dalvik.system.VMRuntime; @@ -1660,7 +1661,11 @@ final class ApplicationPackageManager extends PackageManager { */ public Drawable loadItemIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo) { if (itemInfo.showUserIcon != UserHandle.USER_NULL) { - return new BitmapDrawable(getUserManager().getUserIcon(itemInfo.showUserIcon)); + Bitmap bitmap = getUserManager().getUserIcon(itemInfo.showUserIcon); + if (bitmap == null) { + return UserIcons.getDefaultUserIcon(itemInfo.showUserIcon, /* light= */ false); + } + return new BitmapDrawable(bitmap); } Drawable dr = null; if (itemInfo.packageName != null) { diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index c76ff1163d847..c25278f19d9be 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -998,6 +998,7 @@ public class UserManager { * Returns a file descriptor for the user's photo. PNG data can be read from this file. * @param userHandle the user whose photo we want to read. * @return a {@link Bitmap} of the user's photo, or null if there's no photo. + * @see com.android.internal.util.UserIcons#getDefaultUserIcon for a default. * @hide */ public Bitmap getUserIcon(int userHandle) { diff --git a/core/java/com/android/internal/util/UserIcons.java b/core/java/com/android/internal/util/UserIcons.java new file mode 100644 index 0000000000000..e1e9d5e18c053 --- /dev/null +++ b/core/java/com/android/internal/util/UserIcons.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.util; + +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.PorterDuff.Mode; +import android.graphics.drawable.Drawable; +import android.os.UserHandle; + +import com.android.internal.R; + +/** + * Helper class that generates default user icons. + */ +public class UserIcons { + + private static final int[] USER_ICON_COLORS = { + R.color.user_icon_1, + R.color.user_icon_2, + R.color.user_icon_3, + R.color.user_icon_4, + R.color.user_icon_5, + R.color.user_icon_6, + R.color.user_icon_7, + R.color.user_icon_8 + }; + + /** + * Converts a given drawable to a bitmap. + */ + public static Bitmap convertToBitmap(Drawable icon) { + if (icon == null) { + return null; + } + Bitmap bitmap = Bitmap.createBitmap(icon.getIntrinsicWidth(), icon.getIntrinsicHeight(), + Bitmap.Config.ARGB_8888); + icon.draw(new Canvas(bitmap)); + return bitmap; + } + + /** + * Returns a default user icon for the given user. + * + * Note that for guest users, you should pass in {@code UserHandle.USER_NULL}. + * @param userId the user id or {@code UserHandle.USER_NULL} for a non-user specific icon + * @param light whether we want a light icon (suitable for a dark background) + */ + public static Drawable getDefaultUserIcon(int userId, boolean light) { + int colorResId = light ? R.color.user_icon_default_white : R.color.user_icon_default_gray; + if (userId != UserHandle.USER_NULL) { + // Return colored icon instead + colorResId = USER_ICON_COLORS[userId % USER_ICON_COLORS.length]; + } + Drawable icon = Resources.getSystem().getDrawable(R.drawable.ic_account_circle).mutate(); + icon.setColorFilter(Resources.getSystem().getColor(colorResId), Mode.SRC_IN); + icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon.getIntrinsicHeight()); + return icon; + } +} diff --git a/packages/SystemUI/res/drawable/ic_account_circle.xml b/core/res/res/drawable/ic_account_circle.xml similarity index 50% rename from packages/SystemUI/res/drawable/ic_account_circle.xml rename to core/res/res/drawable/ic_account_circle.xml index d8649e598e28e..a8c5b8c6c3d73 100644 --- a/packages/SystemUI/res/drawable/ic_account_circle.xml +++ b/core/res/res/drawable/ic_account_circle.xml @@ -14,18 +14,11 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> - - + android:width="48.0dp" + android:height="48.0dp" + android:viewportWidth="48.0" + android:viewportHeight="48.0"> - + android:pathData="M24,0C10.8,0 0,10.8 0,24s10.8,24 24,24s24,-10.8 24,-24S37.200001,0 24,0zM24,7.2c3.96,0 7.2,3.24 7.2,7.2s-3.24,7.2 -7.2,7.2s-7.2,-3.24 -7.2,-7.2S20.040001,7.2 24,7.2zM24,41.279999c-6,0 -11.28,-3.12 -14.4,-7.68c0.12,-4.8 9.6,-7.44 14.4,-7.44s14.28,2.64 14.4,7.44C35.279999,38.16 30,41.279999 24,41.279999z" + android:fillColor="#FFFFFFFF"/> diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml index c42683b5bc02e..5a7e168c536e4 100644 --- a/core/res/res/values/colors.xml +++ b/core/res/res/values/colors.xml @@ -147,5 +147,16 @@ #ff607D8B #fff4511e + + #ffe91e63 + #ff3f51b5 + #ff4285f4 + #ff00bcd4 + #ff0f9d58 + #ff8bc34a + #ffff9800 + #ffff5722 + #ff9e9e9e + #ffffffff diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 7fc522f49fb4c..117e23576c1c4 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1170,6 +1170,18 @@ + + + + + + + + + + + + diff --git a/packages/SystemUI/res/drawable/ic_account_circle_qs.xml b/packages/SystemUI/res/drawable/ic_account_circle_qs.xml deleted file mode 100644 index d10a96d25e1d3..0000000000000 --- a/packages/SystemUI/res/drawable/ic_account_circle_qs.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java index 23f027b301c6c..20eed3fd2fe06 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java @@ -376,7 +376,8 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL return; } // TODO: Real icon for facelock. - int iconRes = mUnlockMethodCache.isFaceUnlockRunning() ? R.drawable.ic_account_circle + int iconRes = mUnlockMethodCache.isFaceUnlockRunning() + ? com.android.internal.R.drawable.ic_account_circle : mUnlockMethodCache.isMethodInsecure() ? R.drawable.ic_lock_open_24dp : R.drawable.ic_lock_24dp; mLockIcon.setImageResource(iconRes); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserInfoController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserInfoController.java index 8cbe27280dda6..d50e39fcbb1c5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserInfoController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserInfoController.java @@ -17,7 +17,6 @@ package com.android.systemui.statusbar.policy; import android.app.ActivityManagerNative; -import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -26,33 +25,21 @@ import android.content.pm.PackageManager; import android.content.pm.UserInfo; import android.database.Cursor; import android.graphics.Bitmap; -import android.graphics.BitmapShader; -import android.graphics.Canvas; -import android.graphics.Matrix; -import android.graphics.Paint; -import android.graphics.PorterDuff; -import android.graphics.PorterDuffXfermode; -import android.graphics.Rect; -import android.graphics.RectF; -import android.graphics.Shader; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; -import android.hardware.display.DisplayManager; import android.os.AsyncTask; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; import android.provider.ContactsContract; -import android.security.KeyChain; import android.util.Log; import android.util.Pair; -import com.android.internal.view.RotationPolicy; import com.android.systemui.BitmapHelper; import com.android.systemui.R; +import com.android.internal.util.UserIcons; import java.util.ArrayList; -import java.util.concurrent.CopyOnWriteArrayList; public final class UserInfoController { @@ -142,6 +129,7 @@ public final class UserInfoController { throw new RuntimeException(e); } final int userId = userInfo.id; + final boolean isGuest = userInfo.isGuest(); final String userName = userInfo.name; final int avatarSize = mContext.getResources().getDimensionPixelSize(R.dimen.max_avatar_size); @@ -161,7 +149,8 @@ public final class UserInfoController { avatar = new BitmapDrawable(mContext.getResources(), BitmapHelper.createCircularClip(rawAvatar, avatarSize, avatarSize)); } else { - avatar = mContext.getResources().getDrawable(R.drawable.ic_account_circle); + avatar = UserIcons.getDefaultUserIcon(isGuest? UserHandle.USER_NULL : userId, + /* light= */ true); mUseDefaultAvatar = true; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java index d02826ffdaa8a..e8f35fd77bf93 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java @@ -16,13 +16,6 @@ package com.android.systemui.statusbar.policy; -import com.android.systemui.BitmapHelper; -import com.android.systemui.GuestResumeSessionReceiver; -import com.android.systemui.R; -import com.android.systemui.qs.QSTile; -import com.android.systemui.qs.tiles.UserDetailView; -import com.android.systemui.statusbar.phone.SystemUIDialog; - import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.Dialog; @@ -45,9 +38,16 @@ import android.util.Log; import android.util.SparseArray; import android.view.View; import android.view.ViewGroup; -import android.view.WindowManagerGlobal; import android.widget.BaseAdapter; +import com.android.internal.util.UserIcons; +import com.android.systemui.BitmapHelper; +import com.android.systemui.GuestResumeSessionReceiver; +import com.android.systemui.R; +import com.android.systemui.qs.QSTile; +import com.android.systemui.qs.tiles.UserDetailView; +import com.android.systemui.statusbar.phone.SystemUIDialog; + import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.ref.WeakReference; @@ -425,7 +425,8 @@ public class UserSwitcherController { if (item.isAddUser) { return context.getDrawable(R.drawable.ic_add_circle_qs); } - return context.getDrawable(R.drawable.ic_account_circle_qs); + return UserIcons.getDefaultUserIcon(item.isGuest ? UserHandle.USER_NULL : item.info.id, + /* light= */ true); } } @@ -565,6 +566,9 @@ public class UserSwitcherController { dismiss(); int id = mUserManager.createUser( mContext.getString(R.string.user_new_user_name), 0 /* flags */).id; + Bitmap icon = UserIcons.convertToBitmap(UserIcons.getDefaultUserIcon( + id, /* light= */ false)); + mUserManager.setUserIcon(id, icon); switchToUserId(id); } }