From 8991b106b59dd3a99baf1297863fb2a9e5156929 Mon Sep 17 00:00:00 2001 From: Saalim Quadri Date: Tue, 25 Mar 2025 09:58:24 +0530 Subject: [PATCH 1/2] fix: Return intended notification count Signed-off-by: Saalim Quadri --- .../src/com/android/launcher3/icons/DotRenderer.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/iconloaderlib/src/com/android/launcher3/icons/DotRenderer.java b/iconloaderlib/src/com/android/launcher3/icons/DotRenderer.java index daede101..3ff780ab 100644 --- a/iconloaderlib/src/com/android/launcher3/icons/DotRenderer.java +++ b/iconloaderlib/src/com/android/launcher3/icons/DotRenderer.java @@ -220,8 +220,16 @@ public class DotRenderer { private String numToNotation(int num) { if (num < 1000) { return String.valueOf(num); + } else if (num < 10000) { + int t = (num/100) * 100; + double v = t / 1000.0; + if (t % 1000 == 0) { + return String.format("%dk", (int)v); + } else { + return String.format("%.1fk", v); + } } else { - return num / 1000 + "k"; + return "10k+"; } } -- GitLab From a2352e3c7266c9e8120a40dd710068252aeb8b28 Mon Sep 17 00:00:00 2001 From: Saalim Quadri Date: Wed, 26 Mar 2025 01:25:13 +0530 Subject: [PATCH 2/2] (fix): Render notificationBadges as intended Signed-off-by: Saalim Quadri --- .../android/launcher3/icons/DotRenderer.java | 61 +++++++++++-------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/iconloaderlib/src/com/android/launcher3/icons/DotRenderer.java b/iconloaderlib/src/com/android/launcher3/icons/DotRenderer.java index 3ff780ab..2ae35c01 100644 --- a/iconloaderlib/src/com/android/launcher3/icons/DotRenderer.java +++ b/iconloaderlib/src/com/android/launcher3/icons/DotRenderer.java @@ -159,10 +159,8 @@ public class DotRenderer { // We will displace the dot to the correct position. if (isTaskbar) { canvas.translate(dotCenterX - mCircleRadius, dotCenterY - mCircleRadius); - } else if (numNotifications > 9 && numNotifications < 1000) { - canvas.translate(dx - (mustNudge ? 12f : 17f), dotCenterY); - } else if (numNotifications > 0) { - canvas.translate(dx - 12f, dotCenterY); + } else { + canvas.translate(dx, dotCenterY - 10f); } } else { float offsetX = params.leftAlign @@ -174,11 +172,7 @@ public class DotRenderer { float dx = dotCenterX + offsetX; float dy = dotCenterY + offsetY - 15f; - if (numNotifications > 9 && numNotifications < 1000) { - canvas.translate(dx - 17f, dy); - } else if (numNotifications > 0) { - canvas.translate(dx - 12f, dy); - } + canvas.translate(dx, dy); } float scale = params.scale * (isTablet && !isTaskbar ? 0.75f : 1f); @@ -187,12 +181,8 @@ public class DotRenderer { mCirclePaint.setColor(params.dotColor); mCircleShadowPaint.setColor(params.shadowDotColor); - if (!isTaskbar && numNotifications >= 10 && numNotifications < 1000) { - canvas.drawRoundRect(new RectF(-mCircleRadius + 10, -mCircleRadius, mCircleRadius + 20, mCircleRadius), 50, 50, mCircleShadowPaint); - canvas.drawRoundRect(new RectF(-mCircleRadius + 10, -mCircleRadius, mCircleRadius + 20, mCircleRadius), 50, 50, mCirclePaint); - } else if (numNotifications > 0) { - canvas.drawCircle(5, 10, mCircleRadius, mCircleShadowPaint); - canvas.drawCircle(5, 10, mCircleRadius, mCirclePaint); + if (!isTaskbar) { + drawBadge(canvas, numNotifications, isTablet); } if (mDisplayCount && numNotifications > 0 && !isTaskbar) { @@ -203,20 +193,43 @@ public class DotRenderer { String text = numToNotation(numNotifications); mTextPaint.getTextBounds(text, 0, text.length(), mTextRect); float y = mTextRect.height() / 2f - mTextRect.bottom; - if (numNotifications < 10) { - canvas.drawText(text, -4f, 22f, mTextPaint); - } else if (numNotifications < 100) { - canvas.drawText(text, -3f, y, mTextPaint); - } else if (numNotifications >= 1000) { - canvas.drawText(text, -14f, 20f, mTextPaint); - } else { - canvas.drawText(text, -12f, y, mTextPaint); - } + canvas.drawText(text, -10f, 21f, mTextPaint); } canvas.restore(); } + private void drawBadge(Canvas canvas, int numNotifications, boolean isTablet) { + if (numNotifications < 10) { + float centerY = 9f; + canvas.drawCircle(0, centerY, mCircleRadius, mCircleShadowPaint); + canvas.drawCircle(0, centerY, mCircleRadius, mCirclePaint); + } else { + RectF rect; + if (numNotifications < 100) { + rect = new RectF(-mCircleRadius + 2, -mCircleRadius + 10, mCircleRadius + 17, mCircleRadius + 8); + } else if (numNotifications < 1000) { + float b = (isTablet) ? mCircleRadius + 10: mCircleRadius + 8; + rect = new RectF(-mCircleRadius -2, -mCircleRadius + 10, mCircleRadius + 40, b); + } else if (numNotifications < 9999) { + int tt = (numNotifications/100)*100; + if (tt % 1000 == 0) { // num like 2000,3000,4000 + rect = new RectF(-mCircleRadius + 2, -mCircleRadius + 10, mCircleRadius + 17, mCircleRadius + 8); + } else if (isTablet) { // 999 < num < 10000 + rect = new RectF(-mCircleRadius - 2, -mCircleRadius+ 10, mCircleRadius + 40, mCircleRadius + 10); + } else { + rect = new RectF(-mCircleRadius + 2, -mCircleRadius + 10, mCircleRadius + 45, mCircleRadius + 10); + } + } else { // num >= 10000 + float t = (isTablet) ? -mCircleRadius + 11: -mCircleRadius + 10; + float b = (isTablet) ? mCircleRadius + 11: mCircleRadius + 10; + rect = new RectF(-mCircleRadius + 2, t, mCircleRadius + 45, b); + } + canvas.drawRoundRect(rect, 50, 50, mCircleShadowPaint); + canvas.drawRoundRect(rect, 50, 50, mCirclePaint); + } + } + private String numToNotation(int num) { if (num < 1000) { return String.valueOf(num); -- GitLab