package me.khodak.claudeusage import android.graphics.Bitmap import android.graphics.Canvas import android.graphics.Paint import android.graphics.RectF /** * Draws a usage bar as a Bitmap: rounded track + rounded fill + an optional vertical pace tick. * Used both in the home-screen widget (setImageViewBitmap) and the in-app card, so the two render * identically. Bitmaps are rendered at a fixed width and stretched horizontally via ImageView * scaleType=fitXY; height is fixed so there is no vertical distortion. */ object BarRenderer { private const val TRACK_COLOR = 0xFF252525.toInt() fun render( usedPct: Int, markerPct: Int?, fillColor: Int, tierColor: Int?, wPx: Int = 500, hPx: Int = 14, cornerPx: Float = 7f ): Bitmap { val bmp = Bitmap.createBitmap(wPx, hPx, Bitmap.Config.ARGB_8888) val canvas = Canvas(bmp) val paint = Paint(Paint.ANTI_ALIAS_FLAG) // Track paint.color = TRACK_COLOR val full = RectF(0f, 0f, wPx.toFloat(), hPx.toFloat()) canvas.drawRoundRect(full, cornerPx, cornerPx, paint) // Fill val pct = usedPct.coerceIn(0, 100) if (pct > 0) { paint.color = fillColor val fillW = (wPx * pct / 100f).coerceAtLeast(cornerPx * 2) val fill = RectF(0f, 0f, fillW, hPx.toFloat()) canvas.drawRoundRect(fill, cornerPx, cornerPx, paint) } // Pace tick — "where you should be right now". // Wider than before and wrapped in a white halo so it stands out on any fill color. if (markerPct != null && tierColor != null) { val m = markerPct.coerceIn(0, 100) val coreW = (wPx * 0.022f).coerceIn(9f, 14f) // tier-colored core val halo = coreW * 0.6f // white outline on each side var x = wPx * m / 100f x = x.coerceIn(coreW / 2f + halo, wPx - coreW / 2f - halo) // white halo paint.color = 0xFFFFFFFF.toInt() canvas.drawRect(x - coreW / 2f - halo, 0f, x + coreW / 2f + halo, hPx.toFloat(), paint) // tier-colored core paint.color = tierColor canvas.drawRect(x - coreW / 2f, 0f, x + coreW / 2f, hPx.toFloat(), paint) } return bmp } }