Fix quick settings user switcher avatar shape issue.
In older OS versions user photos weren't cropped to round shape, so a legacy user avatar had a rectangular shape in the QS user switcher. I've added on the fly shaping (similar to how it works in the Settings app) to QS user avatars. Test: manual test Bug: 159473281 Change-Id: Iea48f01aa2f94a2ca5adb3e46eea7c3947092447
This commit is contained in:
@@ -41,7 +41,7 @@ public class CircleFramedDrawable extends Drawable {
|
||||
|
||||
private final Bitmap mBitmap;
|
||||
private final int mSize;
|
||||
private final Paint mPaint;
|
||||
private Paint mIconPaint;
|
||||
|
||||
private float mScale;
|
||||
private Rect mSrcRect;
|
||||
@@ -75,18 +75,18 @@ public class CircleFramedDrawable extends Drawable {
|
||||
canvas.drawColor(0, PorterDuff.Mode.CLEAR);
|
||||
|
||||
// opaque circle matte
|
||||
mPaint = new Paint();
|
||||
mPaint.setAntiAlias(true);
|
||||
mPaint.setColor(Color.BLACK);
|
||||
mPaint.setStyle(Paint.Style.FILL);
|
||||
canvas.drawPath(fillPath, mPaint);
|
||||
Paint paint = new Paint();
|
||||
paint.setAntiAlias(true);
|
||||
paint.setColor(Color.BLACK);
|
||||
paint.setStyle(Paint.Style.FILL);
|
||||
canvas.drawPath(fillPath, paint);
|
||||
|
||||
// mask in the icon where the bitmap is opaque
|
||||
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
|
||||
canvas.drawBitmap(icon, cropRect, circleRect, mPaint);
|
||||
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
|
||||
canvas.drawBitmap(icon, cropRect, circleRect, paint);
|
||||
|
||||
// prepare paint for frame drawing
|
||||
mPaint.setXfermode(null);
|
||||
paint.setXfermode(null);
|
||||
|
||||
mScale = 1f;
|
||||
|
||||
@@ -100,7 +100,7 @@ public class CircleFramedDrawable extends Drawable {
|
||||
final float pad = (mSize - inside) / 2f;
|
||||
|
||||
mDstRect.set(pad, pad, mSize - pad, mSize - pad);
|
||||
canvas.drawBitmap(mBitmap, mSrcRect, mDstRect, null);
|
||||
canvas.drawBitmap(mBitmap, mSrcRect, mDstRect, mIconPaint);
|
||||
}
|
||||
|
||||
public void setScale(float scale) {
|
||||
@@ -122,8 +122,12 @@ public class CircleFramedDrawable extends Drawable {
|
||||
|
||||
@Override
|
||||
public void setColorFilter(ColorFilter cf) {
|
||||
if (mIconPaint == null) {
|
||||
mIconPaint = new Paint();
|
||||
}
|
||||
mIconPaint.setColorFilter(cf);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getIntrinsicWidth() {
|
||||
return mSize;
|
||||
|
||||
@@ -21,7 +21,6 @@ import static com.android.systemui.statusbar.policy.UserSwitcherController.USER_
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.LayerDrawable;
|
||||
import android.util.AttributeSet;
|
||||
@@ -33,6 +32,7 @@ import com.android.internal.logging.MetricsLogger;
|
||||
import com.android.internal.logging.UiEventLogger;
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settingslib.RestrictedLockUtils;
|
||||
import com.android.settingslib.drawable.CircleFramedDrawable;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.qs.PseudoGridView;
|
||||
import com.android.systemui.qs.QSUserSwitcherEvent;
|
||||
@@ -100,7 +100,8 @@ public class UserDetailView extends PseudoGridView {
|
||||
if (item.picture == null) {
|
||||
v.bind(name, getDrawable(mContext, item).mutate(), item.resolveId());
|
||||
} else {
|
||||
Drawable drawable = new BitmapDrawable(v.getResources(), item.picture);
|
||||
int avatarSize = (int) v.getResources().getDimension(R.dimen.qs_framed_avatar_size);
|
||||
Drawable drawable = new CircleFramedDrawable(item.picture, avatarSize);
|
||||
drawable.setColorFilter(
|
||||
item.isSwitchToEnabled ? null : getDisabledUserAvatarColorFilter());
|
||||
v.bind(name, drawable, item.info.id);
|
||||
|
||||
@@ -24,7 +24,6 @@ import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.content.Context;
|
||||
import android.database.DataSetObserver;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.LayerDrawable;
|
||||
import android.util.AttributeSet;
|
||||
@@ -36,6 +35,7 @@ import android.view.ViewStub;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import com.android.settingslib.animation.AppearAnimationUtils;
|
||||
import com.android.settingslib.drawable.CircleFramedDrawable;
|
||||
import com.android.systemui.Dependency;
|
||||
import com.android.systemui.Interpolators;
|
||||
import com.android.systemui.R;
|
||||
@@ -288,7 +288,8 @@ public class KeyguardUserSwitcher {
|
||||
if (item.picture == null) {
|
||||
v.bind(name, getDrawable(mContext, item).mutate(), item.resolveId());
|
||||
} else {
|
||||
Drawable drawable = new BitmapDrawable(v.getResources(), item.picture);
|
||||
int avatarSize = (int) v.getResources().getDimension(R.dimen.kg_framed_avatar_size);
|
||||
Drawable drawable = new CircleFramedDrawable(item.picture, avatarSize);
|
||||
drawable.setColorFilter(
|
||||
item.isSwitchToEnabled ? null : getDisabledUserAvatarColorFilter());
|
||||
v.bind(name, drawable, item.info.id);
|
||||
|
||||
Reference in New Issue
Block a user