Merge "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" into ub-launcher3-dorval-polish

This commit is contained in:
Sunny Goyal
2017-06-22 17:44:53 +00:00
committed by Android (Google) Code Review
7 changed files with 40 additions and 57 deletions
@@ -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);
@@ -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);
}
@@ -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;
@@ -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();
@@ -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);
}
}
}
}
@@ -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
@@ -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);
}