/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.bubbles; import static android.graphics.Paint.ANTI_ALIAS_FLAG; import static android.graphics.Paint.FILTER_BITMAP_FLAG; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Rect; import android.util.Log; import com.android.systemui.R; // XXX: Mostly opied from launcher code / can we share? /** * Contains parameters necessary to draw a badge for an icon (e.g. the size of the badge). */ public class BadgeRenderer { private static final String TAG = "BadgeRenderer"; /** The badge sizes are defined as percentages of the app icon size. */ private static final float SIZE_PERCENTAGE = 0.38f; /** Extra scale down of the dot. */ private static final float DOT_SCALE = 0.6f; private final float mDotCenterOffset; private final float mCircleRadius; private final Paint mCirclePaint = new Paint(ANTI_ALIAS_FLAG | FILTER_BITMAP_FLAG); public BadgeRenderer(Context context) { mDotCenterOffset = getDotCenterOffset(context); mCircleRadius = getDotRadius(mDotCenterOffset); } /** Space between the center of the dot and the top or left of the bubble stack. */ static float getDotCenterOffset(Context context) { final int iconSizePx = context.getResources().getDimensionPixelSize(R.dimen.individual_bubble_size); return SIZE_PERCENTAGE * iconSizePx; } static float getDotRadius(float dotCenterOffset) { int size = (int) (DOT_SCALE * dotCenterOffset); return size / 2f; } /** * Draw a circle in the top right corner of the given bounds. * * @param color The color (based on the icon) to use for the badge. * @param iconBounds The bounds of the icon being badged. * @param badgeScale The progress of the animation, from 0 to 1. * @param spaceForOffset How much space to offset the badge up and to the left or right. * @param onLeft Whether the badge should be draw on left or right side. */ public void draw(Canvas canvas, int color, Rect iconBounds, float badgeScale, Point spaceForOffset, boolean onLeft) { if (iconBounds == null) { Log.e(TAG, "Invalid null argument(s) passed in call to draw."); return; } canvas.save(); // We draw the badge relative to its center. int x = onLeft ? iconBounds.left : iconBounds.right; float offset = onLeft ? (mDotCenterOffset / 2) : -(mDotCenterOffset / 2); float badgeCenterX = x + offset; float badgeCenterY = iconBounds.top + mDotCenterOffset / 2; canvas.translate(badgeCenterX + spaceForOffset.x, badgeCenterY - spaceForOffset.y); canvas.scale(badgeScale, badgeScale); mCirclePaint.setColor(color); canvas.drawCircle(0, 0, mCircleRadius, mCirclePaint); canvas.restore(); } }