diff --git a/core/java/com/android/internal/util/UserIcons.java b/core/java/com/android/internal/util/UserIcons.java index 17b84ffc2f3fa..d9c1e571292be 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 4874e6529620f..39b41b587a336 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 e27aa8392caa7..f531c3abc98ed 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -545,6 +545,7 @@ + diff --git a/packages/SettingsLib/res/values/dimens.xml b/packages/SettingsLib/res/values/dimens.xml index 25d6c5556f5e1..d893d09a9e3ca 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 883e0806f5f56..f6e3557b5a499 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 e5ea4467517ba..7db00f34b2a24 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 035fafd5bb580..d01f2b42f3382 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 f8bb38b5978ec..5862f60950188 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 3a270bb77e461..0686071c17180 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 0000000000000..cc7b20b28a973 --- /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); + } + +}