summaryrefslogtreecommitdiffstats
path: root/iconloaderlib
diff options
context:
space:
mode:
authorTony Wickham <twickham@google.com>2018-11-29 15:28:53 -0800
committerTony Wickham <twickham@google.com>2018-11-30 16:28:56 -0800
commit8912b04c80f738fb8872ccf1791a5153d919dbaf (patch)
tree23c497b4a36015852c19b521471bae1d50250ec8 /iconloaderlib
parent6478d4f41bb5055116b97b55ba7ce08bd18fcd97 (diff)
downloadandroid_packages_apps_Trebuchet-8912b04c80f738fb8872ccf1791a5153d919dbaf.tar.gz
android_packages_apps_Trebuchet-8912b04c80f738fb8872ccf1791a5153d919dbaf.tar.bz2
android_packages_apps_Trebuchet-8912b04c80f738fb8872ccf1791a5153d919dbaf.zip
Move BadgeRenderer to iconloader library
- Rename BadgeRenderer to DotRenderer - Move drawing parameters to new class DrawParams - Add leftAlign param Change-Id: I69de56c13280ba5e7e1ea3868c23edfac01012e9
Diffstat (limited to 'iconloaderlib')
-rw-r--r--iconloaderlib/src/com/android/launcher3/icons/DotRenderer.java112
1 files changed, 112 insertions, 0 deletions
diff --git a/iconloaderlib/src/com/android/launcher3/icons/DotRenderer.java b/iconloaderlib/src/com/android/launcher3/icons/DotRenderer.java
new file mode 100644
index 000000000..6bc859aa6
--- /dev/null
+++ b/iconloaderlib/src/com/android/launcher3/icons/DotRenderer.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2017 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.launcher3.icons;
+
+import static android.graphics.Paint.ANTI_ALIAS_FLAG;
+import static android.graphics.Paint.FILTER_BITMAP_FLAG;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.util.Log;
+import android.view.ViewDebug;
+
+/**
+ * Used to draw a notification dot on top of an icon.
+ */
+public class DotRenderer {
+
+ private static final String TAG = "DotRenderer";
+
+ // The dot size is defined as a percentage 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;
+
+ // Offset the dot slightly away from the icon if there's space.
+ private static final float OFFSET_PERCENTAGE = 0.02f;
+
+ private final float mDotCenterOffset;
+ private final int mOffset;
+ private final float mCircleRadius;
+ private final Paint mCirclePaint = new Paint(ANTI_ALIAS_FLAG | FILTER_BITMAP_FLAG);
+
+ private final Bitmap mBackgroundWithShadow;
+ private final float mBitmapOffset;
+
+ public DotRenderer(int iconSizePx) {
+ mDotCenterOffset = SIZE_PERCENTAGE * iconSizePx;
+ mOffset = (int) (OFFSET_PERCENTAGE * iconSizePx);
+
+ int size = (int) (DOT_SCALE * mDotCenterOffset);
+ ShadowGenerator.Builder builder = new ShadowGenerator.Builder(Color.TRANSPARENT);
+ builder.ambientShadowAlpha = 88;
+ mBackgroundWithShadow = builder.setupBlurForSize(size).createPill(size, size);
+ mCircleRadius = builder.radius;
+
+ mBitmapOffset = -mBackgroundWithShadow.getHeight() * 0.5f; // Same as width.
+ }
+
+ /**
+ * Draw a circle on top of the canvas according to the given params.
+ */
+ public void draw(Canvas canvas, DrawParams params) {
+ if (params == null) {
+ Log.e(TAG, "Invalid null argument(s) passed in call to draw.");
+ return;
+ }
+ canvas.save();
+ // We draw the dot relative to its center.
+ float dotCenterX = params.leftAlign
+ ? params.iconBounds.left + mDotCenterOffset / 2
+ : params.iconBounds.right - mDotCenterOffset / 2;
+ float dotCenterY = params.iconBounds.top + mDotCenterOffset / 2;
+
+ int offsetX = Math.min(mOffset, params.spaceForOffset.x);
+ int offsetY = Math.min(mOffset, params.spaceForOffset.y);
+ canvas.translate(dotCenterX + offsetX, dotCenterY - offsetY);
+ canvas.scale(params.scale, params.scale);
+
+ mCirclePaint.setColor(Color.BLACK);
+ canvas.drawBitmap(mBackgroundWithShadow, mBitmapOffset, mBitmapOffset, mCirclePaint);
+ mCirclePaint.setColor(params.color);
+ canvas.drawCircle(0, 0, mCircleRadius, mCirclePaint);
+ canvas.restore();
+ }
+
+ public static class DrawParams {
+ /** The color (possibly based on the icon) to use for the dot. */
+ @ViewDebug.ExportedProperty(category = "notification dot", formatToHexString = true)
+ public int color;
+ /** The bounds of the icon that the dot is drawn on top of. */
+ @ViewDebug.ExportedProperty(category = "notification dot")
+ public Rect iconBounds = new Rect();
+ /** The progress of the animation, from 0 to 1. */
+ @ViewDebug.ExportedProperty(category = "notification dot")
+ public float scale;
+ /** Overrides internally calculated offset if specified value is smaller. */
+ @ViewDebug.ExportedProperty(category = "notification dot")
+ public Point spaceForOffset = new Point();
+ /** Whether the dot should align to the top left of the icon rather than the top right. */
+ @ViewDebug.ExportedProperty(category = "notification dot")
+ public boolean leftAlign;
+ }
+}