summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/folder
diff options
context:
space:
mode:
authorTony Wickham <twickham@google.com>2017-02-07 22:26:20 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2017-02-07 22:26:20 +0000
commit4b20e0c312d7a6f5f0a65e8bada74eeb52c15bc0 (patch)
tree5dc32ea9638eb8917587011e877b2b1b11f9ebe7 /src/com/android/launcher3/folder
parent72d90876b8d0403684a534fa65cfbe91c839019b (diff)
parent1e61849bc729858f3fd0c0a1f31b15ef06cffdc3 (diff)
downloadandroid_packages_apps_Trebuchet-4b20e0c312d7a6f5f0a65e8bada74eeb52c15bc0.tar.gz
android_packages_apps_Trebuchet-4b20e0c312d7a6f5f0a65e8bada74eeb52c15bc0.tar.bz2
android_packages_apps_Trebuchet-4b20e0c312d7a6f5f0a65e8bada74eeb52c15bc0.zip
Merge "Animate badges when they are added or removed" into ub-launcher3-master
Diffstat (limited to 'src/com/android/launcher3/folder')
-rw-r--r--src/com/android/launcher3/folder/FolderIcon.java55
1 files changed, 52 insertions, 3 deletions
diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java
index 171d40d5c..96d56759d 100644
--- a/src/com/android/launcher3/folder/FolderIcon.java
+++ b/src/com/android/launcher3/folder/FolderIcon.java
@@ -33,6 +33,7 @@ import android.graphics.drawable.Drawable;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
+import android.util.Property;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
@@ -130,6 +131,21 @@ public class FolderIcon extends FrameLayout implements FolderListener {
private FolderBadgeInfo mBadgeInfo = new FolderBadgeInfo();
private BadgeRenderer mBadgeRenderer;
+ private float mBadgeScale;
+
+ private static final Property<FolderIcon, Float> BADGE_SCALE_PROPERTY
+ = new Property<FolderIcon, Float>(Float.TYPE, "badgeScale") {
+ @Override
+ public Float get(FolderIcon folderIcon) {
+ return folderIcon.mBadgeScale;
+ }
+
+ @Override
+ public void set(FolderIcon folderIcon, Float value) {
+ folderIcon.mBadgeScale = value;
+ folderIcon.invalidate();
+ }
+ };
public FolderIcon(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -388,8 +404,25 @@ public class FolderIcon extends FrameLayout implements FolderListener {
}
public void setBadgeInfo(FolderBadgeInfo badgeInfo) {
+ updateBadgeScale(mBadgeInfo.getNotificationCount(), badgeInfo.getNotificationCount());
mBadgeInfo = badgeInfo;
- invalidate();
+ }
+
+ /**
+ * Sets mBadgeScale to 1 or 0, animating if oldCount or newCount is 0
+ * (the badge is being added or removed).
+ */
+ private void updateBadgeScale(int oldCount, int newCount) {
+ boolean wasBadged = oldCount > 0;
+ boolean isBadged = newCount > 0;
+ float newBadgeScale = isBadged ? 1f : 0f;
+ // Animate when a badge is first added or when it is removed.
+ if ((wasBadged ^ isBadged) && isShown()) {
+ ObjectAnimator.ofFloat(this, BADGE_SCALE_PROPERTY, newBadgeScale).start();
+ } else {
+ mBadgeScale = newBadgeScale;
+ invalidate();
+ }
}
static class PreviewItemDrawingParams {
@@ -550,6 +583,14 @@ public class FolderIcon extends FrameLayout implements FolderListener {
return basePreviewOffsetY - (getScaledRadius() - getRadius());
}
+ /**
+ * Returns the progress of the scale animation, where 0 means the scale is at 1f
+ * and 1 means the scale is at ACCEPT_SCALE_FACTOR.
+ */
+ float getScaleProgress() {
+ return (mScale - 1f) / (ACCEPT_SCALE_FACTOR - 1f);
+ }
+
void invalidate() {
int radius = getScaledRadius();
mClipPath.reset();
@@ -785,8 +826,10 @@ public class FolderIcon extends FrameLayout implements FolderListener {
int offsetY = mBackground.getOffsetY();
int previewSize = (int) (mBackground.previewSize * mBackground.mScale);
Rect bounds = new Rect(offsetX, offsetY, offsetX + previewSize, offsetY + previewSize);
- if (mBadgeInfo != null && mBadgeInfo.getNotificationCount() > 0) {
- mBadgeRenderer.draw(canvas, IconPalette.FOLDER_ICON_PALETTE, mBadgeInfo, bounds);
+ if ((mBadgeInfo != null && mBadgeInfo.getNotificationCount() > 0) || mBadgeScale > 0) {
+ // If we are animating to the accepting state, animate the badge out.
+ float badgeScale = Math.max(0, mBadgeScale - mBackground.getScaleProgress());
+ mBadgeRenderer.draw(canvas, IconPalette.FOLDER_ICON_PALETTE, mBadgeInfo, bounds, badgeScale);
}
}
@@ -939,14 +982,20 @@ public class FolderIcon extends FrameLayout implements FolderListener {
@Override
public void onAdd(ShortcutInfo item) {
+ int oldCount = mBadgeInfo.getNotificationCount();
mBadgeInfo.addBadgeInfo(mLauncher.getPopupDataProvider().getBadgeInfoForItem(item));
+ int newCount = mBadgeInfo.getNotificationCount();
+ updateBadgeScale(oldCount, newCount);
invalidate();
requestLayout();
}
@Override
public void onRemove(ShortcutInfo item) {
+ int oldCount = mBadgeInfo.getNotificationCount();
mBadgeInfo.subtractBadgeInfo(mLauncher.getPopupDataProvider().getBadgeInfoForItem(item));
+ int newCount = mBadgeInfo.getNotificationCount();
+ updateBadgeScale(oldCount, newCount);
invalidate();
requestLayout();
}