From 280d945d00325323ef784868b65d11b987494e19 Mon Sep 17 00:00:00 2001 From: Hugh Chen Date: Mon, 8 Jun 2020 13:48:33 +0800 Subject: [PATCH] Fix advanced icon will incorrect when change display size The value of radius will change when user adjust display size. This CL will calculate the radius rate base on display size to draw the icon. Bug: 156689249 Test: build pass Change-Id: I2701624742c3ecf8667a5626e2a621ee7aaf0ecb --- .../widget/AdaptiveOutlineDrawable.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/SettingsLib/AdaptiveIcon/src/com/android/settingslib/widget/AdaptiveOutlineDrawable.java b/packages/SettingsLib/AdaptiveIcon/src/com/android/settingslib/widget/AdaptiveOutlineDrawable.java index 4438893dabfc8..3bf43dd4d1bf1 100644 --- a/packages/SettingsLib/AdaptiveIcon/src/com/android/settingslib/widget/AdaptiveOutlineDrawable.java +++ b/packages/SettingsLib/AdaptiveIcon/src/com/android/settingslib/widget/AdaptiveOutlineDrawable.java @@ -29,7 +29,12 @@ import android.graphics.Path; import android.graphics.Rect; import android.graphics.drawable.AdaptiveIconDrawable; import android.graphics.drawable.DrawableWrapper; +import android.os.RemoteException; +import android.util.DisplayMetrics; import android.util.PathParser; +import android.view.Display; +import android.view.IWindowManager; +import android.view.WindowManagerGlobal; import androidx.annotation.IntDef; import androidx.annotation.VisibleForTesting; @@ -56,6 +61,7 @@ public class AdaptiveOutlineDrawable extends DrawableWrapper { private int mStrokeWidth; private Bitmap mBitmap; private int mType; + private float mDensity; public AdaptiveOutlineDrawable(Resources resources, Bitmap bitmap) { super(new AdaptiveIconShapeDrawable(resources)); @@ -77,6 +83,7 @@ public class AdaptiveOutlineDrawable extends DrawableWrapper { mPath = new Path(PathParser.createPathFromPathData( resources.getString(com.android.internal.R.string.config_icon_mask))); mStrokeWidth = resources.getDimensionPixelSize(R.dimen.adaptive_outline_stroke); + mDensity = resources.getDisplayMetrics().density; mOutlinePaint = new Paint(); mOutlinePaint.setColor(getColor(resources, type)); mOutlinePaint.setStyle(Paint.Style.STROKE); @@ -130,7 +137,12 @@ public class AdaptiveOutlineDrawable extends DrawableWrapper { if (mType == TYPE_DEFAULT) { canvas.drawPath(mPath, mOutlinePaint); } else { - canvas.drawCircle(2 * mInsetPx, 2 * mInsetPx, 2 * mInsetPx - mStrokeWidth, + final float defaultDensity = getDefaultDisplayDensity(Display.DEFAULT_DISPLAY) + / (float) DisplayMetrics.DENSITY_DEFAULT; + final int insetPx = + Math.round(mInsetPx / (float) (Math.floor( + (mDensity / defaultDensity) * 100) / 100.0)); + canvas.drawCircle(2 * insetPx, 2 * insetPx, 2 * insetPx - mStrokeWidth, mOutlinePaint); } canvas.restoreToCount(count); @@ -139,6 +151,15 @@ public class AdaptiveOutlineDrawable extends DrawableWrapper { canvas.drawBitmap(mBitmap, bounds.left + mInsetPx, bounds.top + mInsetPx, null); } + private static int getDefaultDisplayDensity(int displayId) { + try { + final IWindowManager wm = WindowManagerGlobal.getWindowManagerService(); + return wm.getInitialDisplayDensity(displayId); + } catch (RemoteException exc) { + return -1; + } + } + @Override public int getIntrinsicHeight() { return mBitmap.getHeight() + 2 * mInsetPx;