From 828b11e5a934af781f620620dd20d312defa49b8 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 22 Jun 2017 09:53:59 -0700 Subject: Setting the callback for previewItems to folderIcon. This allows the FolderIcon to get updated without going through the child'draw pass. Also simplifying the draw code for the FolderIcon to remove any cycling invalidate calls Bug: 62900800 Change-Id: I17009a5347a1c3c35426313ac759e0240ce6a395 --- src/com/android/launcher3/BubbleTextView.java | 13 ------ src/com/android/launcher3/FastBitmapDrawable.java | 11 ----- .../folder/ClippedFolderIconLayoutRule.java | 2 +- src/com/android/launcher3/folder/FolderIcon.java | 47 ++++++++++++---------- .../android/launcher3/folder/FolderPagedView.java | 20 ++++----- .../folder/StackFolderIconLayoutRule.java | 2 +- .../launcher3/graphics/PreloadIconDrawable.java | 2 +- 7 files changed, 40 insertions(+), 57 deletions(-) diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index cb3cbd2bf..f8e87c57f 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -30,7 +30,6 @@ import android.graphics.Rect; import android.graphics.Region; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.support.annotation.NonNull; import android.support.v4.graphics.ColorUtils; import android.util.AttributeSet; import android.util.Property; @@ -48,7 +47,6 @@ import com.android.launcher3.IconCache.ItemInfoUpdateReceiver; import com.android.launcher3.badge.BadgeInfo; import com.android.launcher3.badge.BadgeRenderer; import com.android.launcher3.folder.FolderIconPreviewVerifier; -import com.android.launcher3.folder.FolderPagedView; import com.android.launcher3.graphics.DrawableFactory; import com.android.launcher3.graphics.HolographicOutlineHelper; import com.android.launcher3.graphics.IconPalette; @@ -209,17 +207,6 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { applyFromShortcutInfo(info, false); } - @Override - public void invalidateDrawable(@NonNull Drawable drawable) { - super.invalidateDrawable(drawable); - - if (getParent() != null - && getParent().getParent() != null - && getParent().getParent().getParent() instanceof FolderPagedView) { - ((FolderPagedView) getParent().getParent().getParent()).onIconInvalidated(this); - } - } - public void applyFromShortcutInfo(ShortcutInfo info, boolean promiseStateChanged) { applyIconAndLabel(info.iconBitmap, info); setTag(info); diff --git a/src/com/android/launcher3/FastBitmapDrawable.java b/src/com/android/launcher3/FastBitmapDrawable.java index 2ec6b4c81..1272e0ade 100644 --- a/src/com/android/launcher3/FastBitmapDrawable.java +++ b/src/com/android/launcher3/FastBitmapDrawable.java @@ -105,17 +105,6 @@ public class FastBitmapDrawable extends Drawable { @Override public void draw(Canvas canvas) { - drawInternal(canvas); - } - - public void drawWithBrightness(Canvas canvas, float brightness) { - float oldBrightness = getBrightness(); - setBrightness(brightness); - drawInternal(canvas); - setBrightness(oldBrightness); - } - - protected void drawInternal(Canvas canvas) { canvas.drawBitmap(mBitmap, null, getBounds(), mPaint); } diff --git a/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java b/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java index 0df787ac3..33bf2750c 100644 --- a/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java +++ b/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java @@ -20,7 +20,7 @@ public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule private float mBaselineIconScale; @Override - public void init(int availableSpace, int intrinsicIconSize, boolean rtl) { + public void init(int availableSpace, float intrinsicIconSize, boolean rtl) { mAvailableSpace = availableSpace; mRadius = ITEM_RADIUS_SCALE_FACTOR * availableSpace / 2f; mIconSize = intrinsicIconSize; 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 mDrawingParams = new ArrayList(); + private ArrayList 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 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(); diff --git a/src/com/android/launcher3/folder/FolderPagedView.java b/src/com/android/launcher3/folder/FolderPagedView.java index f3f337dc0..d0ac9f4b1 100644 --- a/src/com/android/launcher3/folder/FolderPagedView.java +++ b/src/com/android/launcher3/folder/FolderPagedView.java @@ -19,6 +19,7 @@ package com.android.launcher3.folder; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; +import android.graphics.drawable.Drawable; import android.util.ArrayMap; import android.util.AttributeSet; import android.util.Log; @@ -27,6 +28,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewDebug; import android.view.animation.DecelerateInterpolator; + import com.android.launcher3.BubbleTextView; import com.android.launcher3.CellLayout; import com.android.launcher3.DeviceProfile; @@ -44,6 +46,7 @@ import com.android.launcher3.Workspace.ItemOperator; import com.android.launcher3.keyboard.ViewGroupFocusHelper; import com.android.launcher3.pageindicators.PageIndicator; import com.android.launcher3.util.Thunk; + import java.util.ArrayList; import java.util.Iterator; import java.util.Map; @@ -178,14 +181,6 @@ public class FolderPagedView extends PagedView { super.dispatchDraw(canvas); } - public void onIconInvalidated(BubbleTextView icon) { - FolderIcon folderIcon = mFolder.mFolderIcon; - if (icon.getTag() instanceof ItemInfo - && folderIcon.mPreviewVerifier.isItemInPreview(((ItemInfo) icon.getTag()).rank)) { - folderIcon.invalidate(); - } - } - /** * Binds items to the layout. * @return list of items that could not be bound, probably because we hit the max size limit. @@ -562,7 +557,14 @@ public class FolderPagedView extends PagedView { if (page != null) { ShortcutAndWidgetContainer parent = page.getShortcutsAndWidgets(); for (int i = parent.getChildCount() - 1; i >= 0; i--) { - ((BubbleTextView) parent.getChildAt(i)).verifyHighRes(); + BubbleTextView icon = ((BubbleTextView) parent.getChildAt(i)); + icon.verifyHighRes(); + // Set the callback back to the actual icon, in case + // it was captured by the FolderIcon + Drawable d = icon.getCompoundDrawables()[1]; + if (d != null) { + d.setCallback(icon); + } } } } diff --git a/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java b/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java index 12bca5fdf..1ece27831 100644 --- a/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java +++ b/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java @@ -35,7 +35,7 @@ public class StackFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule { private float mMaxPerspectiveShift; @Override - public void init(int availableSpace, int intrinsicIconSize, boolean rtl) { + public void init(int availableSpace, float intrinsicIconSize, boolean rtl) { mAvailableSpaceInPreview = availableSpace; // cos(45) = 0.707 + ~= 0.1) = 0.8f diff --git a/src/com/android/launcher3/graphics/PreloadIconDrawable.java b/src/com/android/launcher3/graphics/PreloadIconDrawable.java index deb5b63a9..06dc7acfe 100644 --- a/src/com/android/launcher3/graphics/PreloadIconDrawable.java +++ b/src/com/android/launcher3/graphics/PreloadIconDrawable.java @@ -178,7 +178,7 @@ public class PreloadIconDrawable extends FastBitmapDrawable { Rect bounds = getBounds(); canvas.scale(mIconScale, mIconScale, bounds.exactCenterX(), bounds.exactCenterY()); - drawInternal(canvas); + super.draw(canvas); canvas.restoreToCount(saveCount); } -- cgit v1.2.3