summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/folder/FolderIcon.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/launcher3/folder/FolderIcon.java')
-rw-r--r--src/com/android/launcher3/folder/FolderIcon.java47
1 files changed, 26 insertions, 21 deletions
diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java
index 48d8e10ed..fa148c889 100644
--- a/src/com/android/launcher3/folder/FolderIcon.java
+++ b/src/com/android/launcher3/folder/FolderIcon.java
@@ -36,6 +36,7 @@ import android.graphics.Region;
import android.graphics.Shader;
import android.graphics.drawable.Drawable;
import android.os.Parcelable;
+import android.support.annotation.NonNull;
import android.support.v4.graphics.ColorUtils;
import android.util.AttributeSet;
import android.util.Property;
@@ -116,7 +117,7 @@ public class FolderIcon extends FrameLayout implements FolderListener {
// These variables are all associated with the drawing of the preview; they are stored
// as member variables for shared usage and to avoid computation on each frame
- private int mIntrinsicIconSize = -1;
+ private float mIntrinsicIconSize = -1;
private int mTotalWidth = -1;
private int mPrevTopPadding = -1;
@@ -132,7 +133,7 @@ public class FolderIcon extends FrameLayout implements FolderListener {
FolderIconPreviewVerifier mPreviewVerifier;
private PreviewItemDrawingParams mTmpParams = new PreviewItemDrawingParams(0, 0, 0, 0);
- private ArrayList<PreviewItemDrawingParams> mDrawingParams = new ArrayList<PreviewItemDrawingParams>();
+ private ArrayList<PreviewItemDrawingParams> mDrawingParams = new ArrayList<>();
private Drawable mReferenceDrawable = null;
private Alarm mOpenAlarm = new Alarm();
@@ -510,24 +511,12 @@ public class FolderIcon extends FrameLayout implements FolderListener {
Drawable d = params.drawable;
if (d != null) {
- // Remove the callback to prevent invalidate as a result of property changes
- Drawable.Callback cb = d.getCallback();
- d.setCallback(null);
-
- mTempBounds.set(d.getBounds());
- d.setBounds(0, 0, mIntrinsicIconSize, mIntrinsicIconSize);
- boolean isPreloadIcon = d instanceof PreloadIconDrawable;
- if (!isPreloadIcon && d instanceof FastBitmapDrawable) {
- FastBitmapDrawable fd = (FastBitmapDrawable) d;
- fd.drawWithBrightness(canvas, params.overlayAlpha);
- } else {
- d.setColorFilter(Color.argb((int) (params.overlayAlpha * 255), 255, 255, 255),
- PorterDuff.Mode.SRC_ATOP);
- d.draw(canvas);
- d.clearColorFilter();
- }
- d.setBounds(mTempBounds);
- d.setCallback(cb);
+ Rect bounds = d.getBounds();
+ canvas.save();
+ canvas.translate(-bounds.left, -bounds.top);
+ canvas.scale(mIntrinsicIconSize / bounds.width(), mIntrinsicIconSize / bounds.height());
+ d.draw(canvas);
+ canvas.restore();
}
canvas.restore();
}
@@ -1112,6 +1101,16 @@ public class FolderIcon extends FrameLayout implements FolderListener {
return itemsToDisplay;
}
+ @Override
+ protected boolean verifyDrawable(@NonNull Drawable who) {
+ for (int i = 0; i < mDrawingParams.size(); i++) {
+ if (mDrawingParams.get(i).drawable == who) {
+ return true;
+ }
+ }
+ return super.verifyDrawable(who);
+ }
+
private void updateItemDrawingParams(boolean animate) {
List<BubbleTextView> items = getItemsToDisplay();
int nItemsInPreview = items.size();
@@ -1130,6 +1129,12 @@ public class FolderIcon extends FrameLayout implements FolderListener {
PreviewItemDrawingParams p = mDrawingParams.get(i);
p.drawable = items.get(i).getCompoundDrawables()[1];
+ if (p.drawable != null && !mFolder.isOpen()) {
+ // Set the callback to FolderIcon as it is responsible to drawing the icon. The
+ // callback will be release when the folder is opened.
+ p.drawable.setCallback(this);
+ }
+
if (!animate || FeatureFlags.LAUNCHER3_LEGACY_FOLDER_ICON) {
computePreviewItemDrawingParams(i, nItemsInPreview, p);
if (mReferenceDrawable == null) {
@@ -1300,7 +1305,7 @@ public class FolderIcon extends FrameLayout implements FolderListener {
public interface PreviewLayoutRule {
PreviewItemDrawingParams computePreviewItemDrawingParams(int index, int curNumItems,
PreviewItemDrawingParams params);
- void init(int availableSpace, int intrinsicIconSize, boolean rtl);
+ void init(int availableSpace, float intrinsicIconSize, boolean rtl);
float scaleForItem(int index, int totalNumItems);
float getIconSize();
int maxNumItems();