From b50567218e5b4990ad19874c0dd06046d0385fd4 Mon Sep 17 00:00:00 2001 From: Oli Lan Date: Fri, 11 Feb 2022 11:12:30 +0000 Subject: [PATCH] Increase default user icon size. This increases the size of the default user icon to 190dp. A new method convertToBitmapAtUserIconSize is added to UserIcons to allow bitmaps of this size to be easily obtained. The existing method convertToBitmap uses the intrinsic size of the drawable, which is only 48dp as standard. Bug: 218838295 Test: visual inspection of user icon for owner and new users Test: atest UserIconsTest Change-Id: I5cbf110731f4c944bb1d3af63b5a0fcb5ab50f16 --- .../com/android/internal/util/UserIcons.java | 14 +++++- core/res/res/values/dimens.xml | 3 ++ core/res/res/values/symbols.xml | 1 + packages/SettingsLib/res/values/dimens.xml | 2 - .../src/com/android/settingslib/Utils.java | 2 +- .../drawable/CircleFramedDrawable.java | 6 +-- .../drawable/UserIconDrawable.java | 7 ++- .../users/EditUserPhotoController.java | 18 ++----- .../android/systemui/user/UserCreator.java | 7 ++- .../android/internal/util/UserIconsTest.java | 47 +++++++++++++++++++ 10 files changed, 78 insertions(+), 29 deletions(-) create mode 100644 tests/Internal/src/com/android/internal/util/UserIconsTest.java diff --git a/core/java/com/android/internal/util/UserIcons.java b/core/java/com/android/internal/util/UserIcons.java index 17b84ffc2f3f..d9c1e571292b 100644 --- a/core/java/com/android/internal/util/UserIcons.java +++ b/core/java/com/android/internal/util/UserIcons.java @@ -46,11 +46,21 @@ public class UserIcons { * Converts a given drawable to a bitmap. */ public static Bitmap convertToBitmap(Drawable icon) { + return convertToBitmapAtSize(icon, icon.getIntrinsicWidth(), icon.getIntrinsicHeight()); + } + + /** + * Converts a given drawable to a bitmap, with width and height equal to the default icon size. + */ + public static Bitmap convertToBitmapAtUserIconSize(Resources res, Drawable icon) { + int size = res.getDimensionPixelSize(R.dimen.user_icon_size); + return convertToBitmapAtSize(icon, size, size); + } + + private static Bitmap convertToBitmapAtSize(Drawable icon, int width, int height) { if (icon == null) { return null; } - final int width = icon.getIntrinsicWidth(); - final int height = icon.getIntrinsicHeight(); Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); icon.setBounds(0, 0, width, height); diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 4874e6529620..39b41b587a33 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -991,4 +991,7 @@ 0px 0px 0px + + + 190dp diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index d731180bd56a..27bee3157b2c 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -541,6 +541,7 @@ + diff --git a/packages/SettingsLib/res/values/dimens.xml b/packages/SettingsLib/res/values/dimens.xml index 25d6c5556f5e..d893d09a9e3c 100644 --- a/packages/SettingsLib/res/values/dimens.xml +++ b/packages/SettingsLib/res/values/dimens.xml @@ -22,8 +22,6 @@ -32dp - 190dp - 24dp diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java index 883e0806f5f5..f6e3557b5a49 100644 --- a/packages/SettingsLib/src/com/android/settingslib/Utils.java +++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java @@ -144,7 +144,7 @@ public class Utils { * Returns a circular icon for a user. */ public static Drawable getUserIcon(Context context, UserManager um, UserInfo user) { - final int iconSize = UserIconDrawable.getSizeForList(context); + final int iconSize = UserIconDrawable.getDefaultSize(context); if (user.isManagedProfile()) { Drawable drawable = UserIconDrawable.getManagedUserDrawable(context); drawable.setBounds(0, 0, iconSize, iconSize); diff --git a/packages/SettingsLib/src/com/android/settingslib/drawable/CircleFramedDrawable.java b/packages/SettingsLib/src/com/android/settingslib/drawable/CircleFramedDrawable.java index e5ea4467517b..7db00f34b2a2 100644 --- a/packages/SettingsLib/src/com/android/settingslib/drawable/CircleFramedDrawable.java +++ b/packages/SettingsLib/src/com/android/settingslib/drawable/CircleFramedDrawable.java @@ -31,8 +31,6 @@ import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.Drawable; -import com.android.settingslib.R; - /** * Converts the user avatar icon to a circularly clipped one. * TODO: Move this to an internal framework class and share with the one in Keyguard. @@ -49,9 +47,9 @@ public class CircleFramedDrawable extends Drawable { public static CircleFramedDrawable getInstance(Context context, Bitmap icon) { Resources res = context.getResources(); - float iconSize = res.getDimension(R.dimen.circle_avatar_size); + int iconSize = res.getDimensionPixelSize(com.android.internal.R.dimen.user_icon_size); - CircleFramedDrawable instance = new CircleFramedDrawable(icon, (int) iconSize); + CircleFramedDrawable instance = new CircleFramedDrawable(icon, iconSize); return instance; } diff --git a/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java b/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java index 035fafd5bb58..d01f2b42f338 100644 --- a/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java +++ b/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java @@ -49,8 +49,6 @@ import androidx.annotation.RequiresApi; import androidx.annotation.VisibleForTesting; import androidx.core.os.BuildCompat; -import com.android.settingslib.R; - /** * Converts the user avatar icon to a circularly clipped one with an optional badge and frame */ @@ -120,8 +118,9 @@ public class UserIconDrawable extends Drawable implements Drawable.Callback { * @param context * @return size in pixels */ - public static int getSizeForList(Context context) { - return (int) context.getResources().getDimension(R.dimen.circle_avatar_size); + public static int getDefaultSize(Context context) { + return context.getResources() + .getDimensionPixelSize(com.android.internal.R.dimen.user_icon_size); } public UserIconDrawable() { diff --git a/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java b/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java index f8bb38b5978e..5862f6095018 100644 --- a/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java +++ b/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java @@ -16,19 +16,17 @@ package com.android.settingslib.users; -import android.annotation.NonNull; import android.app.Activity; import android.content.Intent; +import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.net.Uri; import android.util.Log; import android.widget.ImageView; import com.android.internal.util.UserIcons; -import com.android.settingslib.R; import com.android.settingslib.drawable.CircleFramedDrawable; import com.android.settingslib.utils.ThreadUtils; @@ -114,10 +112,10 @@ public class EditUserPhotoController { private void onDefaultIconSelected(int tintColor) { try { ThreadUtils.postOnBackgroundThread(() -> { + Resources res = mActivity.getResources(); Drawable drawable = - UserIcons.getDefaultUserIconInColor(mActivity.getResources(), tintColor); - Bitmap bitmap = convertToBitmap(drawable, - (int) mActivity.getResources().getDimension(R.dimen.circle_avatar_size)); + UserIcons.getDefaultUserIconInColor(res, tintColor); + Bitmap bitmap = UserIcons.convertToBitmapAtUserIconSize(res, drawable); ThreadUtils.postOnMainThread(() -> onPhotoProcessed(bitmap)); }).get(); @@ -126,14 +124,6 @@ public class EditUserPhotoController { } } - private static Bitmap convertToBitmap(@NonNull Drawable icon, int size) { - Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(bitmap); - icon.setBounds(0, 0, size, size); - icon.draw(canvas); - return bitmap; - } - private void onPhotoCropped(final Uri data) { ThreadUtils.postOnBackgroundThread(() -> { InputStream imageStream = null; diff --git a/packages/SystemUI/src/com/android/systemui/user/UserCreator.java b/packages/SystemUI/src/com/android/systemui/user/UserCreator.java index 3a270bb77e46..0686071c1718 100644 --- a/packages/SystemUI/src/com/android/systemui/user/UserCreator.java +++ b/packages/SystemUI/src/com/android/systemui/user/UserCreator.java @@ -19,6 +19,7 @@ package com.android.systemui.user; import android.app.Dialog; import android.content.Context; import android.content.pm.UserInfo; +import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.UserManager; @@ -70,10 +71,12 @@ public class UserCreator { } Drawable newUserIcon = userIcon; + Resources res = mContext.getResources(); if (newUserIcon == null) { - newUserIcon = UserIcons.getDefaultUserIcon(mContext.getResources(), user.id, false); + newUserIcon = UserIcons.getDefaultUserIcon(res, user.id, false); } - mUserManager.setUserIcon(user.id, UserIcons.convertToBitmap(newUserIcon)); + mUserManager.setUserIcon( + user.id, UserIcons.convertToBitmapAtUserIconSize(res, newUserIcon)); userCreationProgressDialog.dismiss(); successCallback.accept(user); diff --git a/tests/Internal/src/com/android/internal/util/UserIconsTest.java b/tests/Internal/src/com/android/internal/util/UserIconsTest.java new file mode 100644 index 000000000000..cc7b20b28a97 --- /dev/null +++ b/tests/Internal/src/com/android/internal/util/UserIconsTest.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2022 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 static com.google.common.truth.Truth.assertThat; + +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; + +import androidx.test.InstrumentationRegistry; + +import com.android.internal.R; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class UserIconsTest { + + @Test + public void convertToBitmapAtUserIconSize_sizeIsCorrect() { + Resources res = InstrumentationRegistry.getTargetContext().getResources(); + Drawable icon = UserIcons.getDefaultUserIcon(res, 0, true); + Bitmap bitmap = UserIcons.convertToBitmapAtUserIconSize(res, icon); + int expectedSize = res.getDimensionPixelSize(R.dimen.user_icon_size); + + assertThat(bitmap.getWidth()).isEqualTo(expectedSize); + assertThat(bitmap.getHeight()).isEqualTo(expectedSize); + } + +}