Fix a couple polish bugs with new folder previews
-> Don't reuse the same background object for the folder create preview
since this can cause interruptions in the animations for previous
creation previews.
-> When drawing the background to preview creation, don't draw the stroke
above the icon since the icon is not yet contained by the folder.
Change-Id: Ib666dc2453df465b342c02f3bd109b553a769dcc
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index af37033..51ee47a 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -510,6 +510,9 @@
canvas.save();
canvas.translate(mTempLocation[0], mTempLocation[1]);
bg.drawBackground(canvas, mFolderBgPaint);
+ if (!bg.isClipping) {
+ bg.drawBackgroundStroke(canvas, mFolderBgPaint);
+ }
canvas.restore();
}
@@ -529,11 +532,13 @@
for (int i = 0; i < mFolderBackgrounds.size(); i++) {
FolderIcon.PreviewBackground bg = mFolderBackgrounds.get(i);
- cellToPoint(bg.delegateCellX, bg.delegateCellY, mTempLocation);
- canvas.save();
- canvas.translate(mTempLocation[0], mTempLocation[1]);
- bg.drawBackgroundStroke(canvas, mFolderBgPaint);
- canvas.restore();
+ if (bg.isClipping) {
+ cellToPoint(bg.delegateCellX, bg.delegateCellY, mTempLocation);
+ canvas.save();
+ canvas.translate(mTempLocation[0], mTempLocation[1]);
+ bg.drawBackgroundStroke(canvas, mFolderBgPaint);
+ canvas.restore();
+ }
}
}
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index bd5cd8a..7cceba4 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -219,7 +219,7 @@
public static final int REORDER_TIMEOUT = 350;
private final Alarm mFolderCreationAlarm = new Alarm();
private final Alarm mReorderAlarm = new Alarm();
- private FolderIcon.PreviewBackground mFolderCreateBg = new FolderIcon.PreviewBackground();
+ private FolderIcon.PreviewBackground mFolderCreateBg;
private FolderIcon mDragOverFolderIcon = null;
private boolean mCreateUserFolderOnDrop = false;
private boolean mAddToExistingFolderOnDrop = false;
@@ -2878,7 +2878,9 @@
}
private void cleanupFolderCreation() {
- mFolderCreateBg.animateToRest();
+ if (mFolderCreateBg != null) {
+ mFolderCreateBg.animateToRest();
+ }
mFolderCreationAlarm.setOnAlarmListener(null);
mFolderCreationAlarm.cancelAlarm();
}
@@ -3182,6 +3184,8 @@
int cellX;
int cellY;
+ FolderIcon.PreviewBackground bg = new FolderIcon.PreviewBackground();
+
public FolderCreationAlarmListener(CellLayout layout, int cellX, int cellY) {
this.layout = layout;
this.cellX = cellX;
@@ -3190,11 +3194,15 @@
DeviceProfile grid = mLauncher.getDeviceProfile();
BubbleTextView cell = (BubbleTextView) layout.getChildAt(cellX, cellY);
- mFolderCreateBg.setup(getResources().getDisplayMetrics(), grid, null,
+ bg.setup(getResources().getDisplayMetrics(), grid, null,
cell.getMeasuredWidth(), cell.getPaddingTop());
+
+ // The full preview background should appear behind the icon
+ bg.isClipping = false;
}
public void onAlarm(Alarm alarm) {
+ mFolderCreateBg = bg;
mFolderCreateBg.animateToAccept(layout, cellX, cellY);
layout.clearDragOutlines();
setDragMode(DRAG_MODE_CREATE_FOLDER);
diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java
index a9b707f..b7e11f1 100644
--- a/src/com/android/launcher3/folder/FolderIcon.java
+++ b/src/com/android/launcher3/folder/FolderIcon.java
@@ -492,12 +492,16 @@
canvas.restore();
}
+ /**
+ * This object represents a FolderIcon preview background. It stores drawing / measurement
+ * information, handles drawing, and animation (accept state <--> rest state).
+ */
public static class PreviewBackground {
private float mScale = 1f;
private float mColorMultiplier = 1f;
private Path mClipPath = new Path();
private int mStrokeWidth;
- private View mInvalidateDeligate;
+ private View mInvalidateDelegate;
public int previewSize;
private int basePreviewOffsetX;
@@ -507,6 +511,10 @@
public int delegateCellX;
public int delegateCellY;
+ // When the PreviewBackground is drawn under an icon (for creating a folder) the border
+ // should not occlude the icon
+ public boolean isClipping = true;
+
// Drawing / animation configurations
private static final float ACCEPT_SCALE_FACTOR = 1.25f;
private static final float ACCEPT_COLOR_MULTIPLIER = 1.5f;
@@ -519,9 +527,9 @@
ValueAnimator mScaleAnimator;
- public void setup(DisplayMetrics dm, DeviceProfile grid, View invalidateDeligate,
+ public void setup(DisplayMetrics dm, DeviceProfile grid, View invalidateDelegate,
int availableSpace, int topPadding) {
- mInvalidateDeligate = invalidateDeligate;
+ mInvalidateDelegate = invalidateDelegate;
final int previewSize = grid.folderIconSizePx;
final int previewPadding = grid.folderIconPreviewPadding;
@@ -557,8 +565,8 @@
mClipPath.reset();
mClipPath.addCircle(radius, radius, radius, Path.Direction.CW);
- if (mInvalidateDeligate != null) {
- mInvalidateDeligate.invalidate();
+ if (mInvalidateDelegate != null) {
+ mInvalidateDelegate.invalidate();
}
if (mDrawingDelegate != null) {
@@ -566,8 +574,8 @@
}
}
- void setInvalidateDeligate(View invalidateDeligate) {
- mInvalidateDeligate = invalidateDeligate;
+ void setInvalidateDelegate(View invalidateDelegate) {
+ mInvalidateDelegate = invalidateDelegate;
invalidate();
}
@@ -742,7 +750,7 @@
public void setFolderBackground(PreviewBackground bg) {
mBackground = bg;
- mBackground.setInvalidateDeligate(this);
+ mBackground.setInvalidateDelegate(this);
}
@Override