diff --git a/iconloaderlib/src/com/android/launcher3/icons/DotRenderer.java b/iconloaderlib/src/com/android/launcher3/icons/DotRenderer.java index daede1014cc4e87c321bb5d65919e074f803f681..2ae35c01a26dc41447f9f8c8d82d333a1e61e58f 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,25 +193,56 @@ 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); + } 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+"; } }