From 64d4dca63f65e4c7d4a829c85ff6670bdd34e2eb Mon Sep 17 00:00:00 2001 From: Alexandra Gherghina Date: Thu, 28 Aug 2014 18:26:56 +0100 Subject: [PATCH] Assign default icon to users at creation time and in SystemUI. Right now different code in System UI, Settings app and other places replace the user icon with their own default. This tries to make it consistent by moving the mechanism used in Settings in a helper class. Bug: 17311038 Change-Id: Ic858c65bf82a98b9806dbba029e7cdcf441f372e --- .../app/ApplicationPackageManager.java | 7 +- core/java/android/os/UserManager.java | 1 + .../com/android/internal/util/UserIcons.java | 75 +++++++++++++++++++ .../res}/res/drawable/ic_account_circle.xml | 19 ++--- core/res/res/values/colors.xml | 11 +++ core/res/res/values/symbols.xml | 12 +++ .../res/drawable/ic_account_circle_qs.xml | 34 --------- .../phone/KeyguardBottomAreaView.java | 3 +- .../statusbar/policy/UserInfoController.java | 19 +---- .../policy/UserSwitcherController.java | 22 +++--- 10 files changed, 130 insertions(+), 73 deletions(-) create mode 100644 core/java/com/android/internal/util/UserIcons.java rename {packages/SystemUI => core/res}/res/drawable/ic_account_circle.xml (50%) delete mode 100644 packages/SystemUI/res/drawable/ic_account_circle_qs.xml 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); } }