From f172b747c24f28e29baaaf58f08bab48847b7a40 Mon Sep 17 00:00:00 2001 From: Adam Cohen Date: Wed, 30 Mar 2016 19:28:34 -0700 Subject: [PATCH] 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 --- src/com/android/launcher3/CellLayout.java | 15 ++++++++---- src/com/android/launcher3/Workspace.java | 14 ++++++++--- .../android/launcher3/folder/FolderIcon.java | 24 ++++++++++++------- 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index af37033146..51ee47aeed 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -510,6 +510,9 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { 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 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { 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 bd5cd8acfe..7cceba4ae8 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -219,7 +219,7 @@ public class Workspace extends PagedView 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 @@ public class Workspace extends PagedView } private void cleanupFolderCreation() { - mFolderCreateBg.animateToRest(); + if (mFolderCreateBg != null) { + mFolderCreateBg.animateToRest(); + } mFolderCreationAlarm.setOnAlarmListener(null); mFolderCreationAlarm.cancelAlarm(); } @@ -3182,6 +3184,8 @@ public class Workspace extends PagedView 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 @@ public class Workspace extends PagedView 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 a9b707fcf8..b7e11f1aac 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -492,12 +492,16 @@ public class FolderIcon extends FrameLayout implements FolderListener { 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 class FolderIcon extends FrameLayout implements FolderListener { 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 @@ public class FolderIcon extends FrameLayout implements FolderListener { 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 @@ public class FolderIcon extends FrameLayout implements FolderListener { 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 @@ public class FolderIcon extends FrameLayout implements FolderListener { } } - void setInvalidateDeligate(View invalidateDeligate) { - mInvalidateDeligate = invalidateDeligate; + void setInvalidateDelegate(View invalidateDelegate) { + mInvalidateDelegate = invalidateDelegate; invalidate(); } @@ -742,7 +750,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { public void setFolderBackground(PreviewBackground bg) { mBackground = bg; - mBackground.setInvalidateDeligate(this); + mBackground.setInvalidateDelegate(this); } @Override