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
This commit is contained in:
Oli Lan 2022-02-11 11:12:30 +00:00
parent 823af0a05d
commit b50567218e
10 changed files with 78 additions and 29 deletions

View File

@ -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);

View File

@ -991,4 +991,7 @@
<dimen name="secondary_rounded_corner_radius_adjustment">0px</dimen>
<dimen name="secondary_rounded_corner_radius_top_adjustment">0px</dimen>
<dimen name="secondary_rounded_corner_radius_bottom_adjustment">0px</dimen>
<!-- Default size for user icons (a.k.a. avatar images) -->
<dimen name="user_icon_size">190dp</dimen>
</resources>

View File

@ -541,6 +541,7 @@
<java-symbol type="dimen" name="immersive_mode_cling_width" />
<java-symbol type="dimen" name="accessibility_magnification_indicator_width" />
<java-symbol type="dimen" name="circular_display_mask_thickness" />
<java-symbol type="dimen" name="user_icon_size" />
<java-symbol type="string" name="add_account_button_label" />
<java-symbol type="string" name="addToDictionary" />

View File

@ -22,8 +22,6 @@
<!-- The translation for disappearing security views after having solved them. -->
<dimen name="disappear_y_translation">-32dp</dimen>
<dimen name="circle_avatar_size">190dp</dimen>
<!-- Height of a user icon view -->
<dimen name="user_icon_view_height">24dp</dimen>
<!-- User spinner -->

View File

@ -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);

View File

@ -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;
}

View File

@ -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() {

View File

@ -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;

View File

@ -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);

View File

@ -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);
}
}