Merge "Removing some folder customization options" into ub-launcher3-master
diff --git a/res/values/config.xml b/res/values/config.xml
index 10b612b..f8faf98 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -86,9 +86,7 @@
<integer name="config_dropAnimMaxDuration">500</integer>
<!-- The duration of the UserFolder opening and closing animation -->
- <integer name="config_folderExpandDuration">120</integer>
<integer name="config_materialFolderExpandDuration">200</integer>
- <integer name="config_materialFolderExpandStagger">60</integer>
<integer name="config_folderDelay">30</integer>
<!-- The distance at which the animation should take the max duration -->
@@ -128,9 +126,6 @@
<!-- View ID used by cell layout to jail its content -->
<item type="id" name="cell_layout_jail_id" />
- <!-- View ID used by PreviewImageView to cache its instance -->
- <item type="id" name="preview_image_id" />
-
<!-- Popup items -->
<integer name="config_popupOpenCloseDuration">150</integer>
<integer name="config_popupArrowOpenDuration">80</integer>
diff --git a/src/com/android/launcher3/config/BaseFlags.java b/src/com/android/launcher3/config/BaseFlags.java
index c88359b..5adeec1 100644
--- a/src/com/android/launcher3/config/BaseFlags.java
+++ b/src/com/android/launcher3/config/BaseFlags.java
@@ -32,9 +32,7 @@
// Custom flags go below this
public static boolean LAUNCHER3_DISABLE_ICON_NORMALIZATION = false;
- public static boolean LAUNCHER3_LEGACY_FOLDER_ICON = false;
public static boolean LAUNCHER3_DISABLE_PINCH_TO_OVERVIEW = false;
- public static boolean LAUNCHER3_NEW_FOLDER_ANIMATION = true;
// When enabled allows to use any point on the fast scrollbar to start dragging.
public static final boolean LAUNCHER3_DIRECT_SCROLL = true;
// When enabled while all-apps open, the soft input will be set to adjust resize .
diff --git a/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java b/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java
index f25345e..5954efa 100644
--- a/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java
+++ b/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java
@@ -1,9 +1,8 @@
package com.android.launcher3.folder;
+public class ClippedFolderIconLayoutRule {
-public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule {
-
- static final int MAX_NUM_ITEMS_IN_PREVIEW = 4;
+ public static final int MAX_NUM_ITEMS_IN_PREVIEW = 4;
private static final int MIN_NUM_ITEMS_IN_PREVIEW = 2;
private static final float MIN_SCALE = 0.48f;
@@ -11,8 +10,8 @@
private static final float MAX_RADIUS_DILATION = 0.15f;
private static final float ITEM_RADIUS_SCALE_FACTOR = 1.33f;
- private static final int EXIT_INDEX = -2;
- private static final int ENTER_INDEX = -3;
+ public static final int EXIT_INDEX = -2;
+ public static final int ENTER_INDEX = -3;
private float[] mTmpPoint = new float[2];
@@ -22,7 +21,6 @@
private boolean mIsRtl;
private float mBaselineIconScale;
- @Override
public void init(int availableSpace, float intrinsicIconSize, boolean rtl) {
mAvailableSpace = availableSpace;
mRadius = ITEM_RADIUS_SCALE_FACTOR * availableSpace / 2f;
@@ -31,19 +29,18 @@
mBaselineIconScale = availableSpace / (intrinsicIconSize * 1f);
}
- @Override
public PreviewItemDrawingParams computePreviewItemDrawingParams(int index, int curNumItems,
PreviewItemDrawingParams params) {
- float totalScale = scaleForItem(index, curNumItems);
+ float totalScale = scaleForItem(curNumItems);
float transX;
float transY;
float overlayAlpha = 0;
- if (index == getExitIndex()) {
+ if (index == EXIT_INDEX) {
// 0 1 * <-- Exit position (row 0, col 2)
// 2 3
getGridPosition(0, 2, mTmpPoint);
- } else if (index == getEnterIndex()) {
+ } else if (index == ENTER_INDEX) {
// 0 1
// 2 3 * <-- Enter position (row 1, col 2)
getGridPosition(1, 2, mTmpPoint);
@@ -120,7 +117,7 @@
MIN_NUM_ITEMS_IN_PREVIEW) / (MAX_NUM_ITEMS_IN_PREVIEW - MIN_NUM_ITEMS_IN_PREVIEW));
double theta = theta0 + index * (2 * Math.PI / curNumItems) * direction;
- float halfIconSize = (mIconSize * scaleForItem(index, curNumItems)) / 2;
+ float halfIconSize = (mIconSize * scaleForItem(curNumItems)) / 2;
// Map the location along the circle, and offset the coordinates to represent the center
// of the icon, and to be based from the top / left of the preview area. The y component
@@ -130,10 +127,9 @@
}
- @Override
- public float scaleForItem(int index, int numItems) {
+ public float scaleForItem(int numItems) {
// Scale is determined by the number of items in the preview.
- float scale = 1f;
+ final float scale;
if (numItems <= 2) {
scale = MAX_SCALE;
} else if (numItems == 3) {
@@ -141,37 +137,10 @@
} else {
scale = MIN_SCALE;
}
-
return scale * mBaselineIconScale;
}
- @Override
public float getIconSize() {
return mIconSize;
}
-
- @Override
- public int maxNumItems() {
- return MAX_NUM_ITEMS_IN_PREVIEW;
- }
-
- @Override
- public boolean clipToBackground() {
- return true;
- }
-
- @Override
- public boolean hasEnterExitIndices() {
- return true;
- }
-
- @Override
- public int getExitIndex() {
- return EXIT_INDEX;
- }
-
- @Override
- public int getEnterIndex() {
- return ENTER_INDEX;
- }
}
diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java
index 85792d4..64a2dab 100644
--- a/src/com/android/launcher3/folder/Folder.java
+++ b/src/com/android/launcher3/folder/Folder.java
@@ -19,8 +19,6 @@
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.animation.PropertyValuesHolder;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.Resources;
@@ -37,7 +35,6 @@
import android.view.View;
import android.view.ViewDebug;
import android.view.accessibility.AccessibilityEvent;
-import android.view.animation.AccelerateInterpolator;
import android.view.animation.AnimationUtils;
import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
@@ -55,9 +52,7 @@
import com.android.launcher3.FolderInfo.FolderListener;
import com.android.launcher3.ItemInfo;
import com.android.launcher3.Launcher;
-import com.android.launcher3.LauncherAnimUtils;
import com.android.launcher3.LauncherSettings;
-import com.android.launcher3.LogDecelerateInterpolator;
import com.android.launcher3.OnAlarmListener;
import com.android.launcher3.PagedView;
import com.android.launcher3.R;
@@ -66,8 +61,6 @@
import com.android.launcher3.Utilities;
import com.android.launcher3.Workspace.ItemOperator;
import com.android.launcher3.accessibility.AccessibleDragListenerAdapter;
-import com.android.launcher3.anim.AnimationLayerSet;
-import com.android.launcher3.anim.CircleRevealOutlineProvider;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.dragndrop.DragController;
import com.android.launcher3.dragndrop.DragController.DragListener;
@@ -137,10 +130,6 @@
private AnimatorSet mCurrentAnimator;
- private final int mExpandDuration;
- public final int mMaterialExpandDuration;
- private final int mMaterialExpandStagger;
-
protected final Launcher mLauncher;
protected DragController mDragController;
public FolderInfo mInfo;
@@ -201,9 +190,6 @@
super(context, attrs);
setAlwaysDrawnWithCacheEnabled(false);
Resources res = getResources();
- mExpandDuration = res.getInteger(R.integer.config_folderExpandDuration);
- mMaterialExpandDuration = res.getInteger(R.integer.config_materialFolderExpandDuration);
- mMaterialExpandStagger = res.getInteger(R.integer.config_materialFolderExpandStagger);
if (sDefaultFolderName == null) {
sDefaultFolderName = res.getString(R.string.folder_name);
@@ -487,25 +473,6 @@
? R.layout.user_folder : R.layout.user_folder_icon_normalized, null);
}
- /**
- * This method is intended to make the UserFolder to be visually identical in size and position
- * to its associated FolderIcon. This allows for a seamless transition into the expanded state.
- */
- private void positionAndSizeAsIcon() {
- if (!(getParent() instanceof DragLayer)) return;
- setScaleX(0.8f);
- setScaleY(0.8f);
- setAlpha(0f);
- mState = STATE_SMALL;
- }
-
- private void prepareReveal() {
- setScaleX(1f);
- setScaleY(1f);
- setAlpha(1f);
- mState = STATE_SMALL;
- }
-
private void startAnimation(final AnimatorSet a) {
if (mCurrentAnimator != null && mCurrentAnimator.isRunning()) {
mCurrentAnimator.cancel();
@@ -525,61 +492,6 @@
a.start();
}
- private AnimatorSet getOpeningAnimator() {
- prepareReveal();
- mFolderIcon.growAndFadeOut();
-
- AnimatorSet anim = LauncherAnimUtils.createAnimatorSet();
-
- int width = getFolderWidth();
- int height = getFolderHeight();
-
- float transX = - 0.075f * (width / 2 - getPivotX());
- float transY = - 0.075f * (height / 2 - getPivotY());
- setTranslationX(transX);
- setTranslationY(transY);
- PropertyValuesHolder tx = PropertyValuesHolder.ofFloat(TRANSLATION_X, transX, 0);
- PropertyValuesHolder ty = PropertyValuesHolder.ofFloat(TRANSLATION_Y, transY, 0);
-
- Animator drift = ObjectAnimator.ofPropertyValuesHolder(this, tx, ty);
- drift.setDuration(mMaterialExpandDuration);
- drift.setStartDelay(mMaterialExpandStagger);
- drift.setInterpolator(new LogDecelerateInterpolator(100, 0));
-
- int rx = (int) Math.max(Math.max(width - getPivotX(), 0), getPivotX());
- int ry = (int) Math.max(Math.max(height - getPivotY(), 0), getPivotY());
- float radius = (float) Math.hypot(rx, ry);
-
- Animator reveal = new CircleRevealOutlineProvider((int) getPivotX(),
- (int) getPivotY(), 0, radius).createRevealAnimator(this);
- reveal.setDuration(mMaterialExpandDuration);
- reveal.setInterpolator(new LogDecelerateInterpolator(100, 0));
-
- mContent.setAlpha(0f);
- Animator iconsAlpha = ObjectAnimator.ofFloat(mContent, "alpha", 0f, 1f);
- iconsAlpha.setDuration(mMaterialExpandDuration);
- iconsAlpha.setStartDelay(mMaterialExpandStagger);
- iconsAlpha.setInterpolator(new AccelerateInterpolator(1.5f));
-
- mFooter.setAlpha(0f);
- Animator textAlpha = ObjectAnimator.ofFloat(mFooter, "alpha", 0f, 1f);
- textAlpha.setDuration(mMaterialExpandDuration);
- textAlpha.setStartDelay(mMaterialExpandStagger);
- textAlpha.setInterpolator(new AccelerateInterpolator(1.5f));
-
- anim.play(drift);
- anim.play(iconsAlpha);
- anim.play(textAlpha);
- anim.play(reveal);
-
- AnimationLayerSet layerSet = new AnimationLayerSet();
- layerSet.addView(mContent);
- layerSet.addView(mFooter);
- anim.addListener(layerSet);
-
- return anim;
- }
-
/**
* Opens the user folder described by the specified tag. The opening of the folder
* is animated relative to the specified View. If the View is null, no animation
@@ -621,9 +533,7 @@
final Runnable onCompleteRunnable;
centerAboutIcon();
- AnimatorSet anim = FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION
- ? new FolderAnimationManager(this, true /* isOpening */).getAnimator()
- : getOpeningAnimator();
+ AnimatorSet anim = new FolderAnimationManager(this, true /* isOpening */).getAnimator();
onCompleteRunnable = new Runnable() {
@Override
public void run() {
@@ -633,12 +543,8 @@
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
- if (FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION) {
- mFolderIcon.setBackgroundVisible(false);
- mFolderIcon.drawLeaveBehindIfExists();
- } else {
- mFolderIcon.setVisibility(INVISIBLE);
- }
+ mFolderIcon.setBackgroundVisible(false);
+ mFolderIcon.drawLeaveBehindIfExists();
Utilities.sendCustomAccessibilityEvent(
Folder.this,
@@ -728,11 +634,7 @@
}
if (mFolderIcon != null) {
- if (FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION) {
- mFolderIcon.clearLeaveBehindIfExists();
- } else {
- mFolderIcon.shrinkAndFadeIn(animate);
- }
+ mFolderIcon.clearLeaveBehindIfExists();
}
if (!(getParent() instanceof DragLayer)) return;
@@ -749,21 +651,8 @@
parent.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
}
- private AnimatorSet getClosingAnimator() {
- AnimatorSet animatorSet = LauncherAnimUtils.createAnimatorSet();
- animatorSet.play(LauncherAnimUtils.ofViewAlphaAndScale(this, 0, 0.9f, 0.9f));
-
- AnimationLayerSet layerSet = new AnimationLayerSet();
- layerSet.addView(this);
- animatorSet.addListener(layerSet);
- animatorSet.setDuration(mExpandDuration);
- return animatorSet;
- }
-
private void animateClosed() {
- AnimatorSet a = FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION
- ? new FolderAnimationManager(this, false /* isOpening */).getAnimator()
- : getClosingAnimator();
+ AnimatorSet a = new FolderAnimationManager(this, false /* isOpening */).getAnimator();
a.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
@@ -790,16 +679,12 @@
clearFocus();
if (mFolderIcon != null) {
mFolderIcon.setVisibility(View.VISIBLE);
- if (FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION) {
- mFolderIcon.setBackgroundVisible(true);
- mFolderIcon.mFolderName.setTextVisibility(true);
- }
+ mFolderIcon.setBackgroundVisible(true);
+ mFolderIcon.mFolderName.setTextVisibility(true);
if (wasAnimated) {
- if (FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION) {
- mFolderIcon.mBackground.fadeInBackgroundShadow();
- mFolderIcon.mBackground.animateBackgroundStroke();
- mFolderIcon.onFolderClose(mContent.getCurrentPage());
- }
+ mFolderIcon.mBackground.fadeInBackgroundShadow();
+ mFolderIcon.mBackground.animateBackgroundStroke();
+ mFolderIcon.onFolderClose(mContent.getCurrentPage());
if (mFolderIcon.hasBadge()) {
mFolderIcon.createBadgeScaleAnimator(0f, 1f).start();
}
@@ -852,18 +737,14 @@
return (getLayoutDirection() == LAYOUT_DIRECTION_RTL);
}
- @Override
- public void onDragOver(DragObject d) {
- onDragOver(d, REORDER_DELAY);
- }
-
private int getTargetRank(DragObject d, float[] recycle) {
recycle = d.getVisualCenter(recycle);
return mContent.findNearestArea(
(int) recycle[0] - getPaddingLeft(), (int) recycle[1] - getPaddingTop());
}
- @Thunk void onDragOver(DragObject d, int reorderDelay) {
+ @Override
+ public void onDragOver(DragObject d) {
if (mScrollPauseAlarm.alarmPending()) {
return;
}
@@ -1095,10 +976,7 @@
}
public boolean isDropEnabled() {
- if (FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION) {
- return mState != STATE_ANIMATING;
- }
- return true;
+ return mState != STATE_ANIMATING;
}
public boolean isFull() {
@@ -1113,7 +991,7 @@
int width = getFolderWidth();
int height = getFolderHeight();
- float scale = parent.getDescendantRectRelativeToSelf(mFolderIcon, sTempRect);
+ parent.getDescendantRectRelativeToSelf(mFolderIcon, sTempRect);
int centerX = sTempRect.centerX();
int centerY = sTempRect.centerY();
int centeredLeft = centerX - width / 2;
@@ -1611,7 +1489,7 @@
@Override
public void onAlarm(Alarm alarm) {
// Reorder immediately on page change.
- onDragOver(mDragObject, 1);
+ onDragOver(mDragObject);
}
}
diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java
index 69705d5..cdb0ce3 100644
--- a/src/com/android/launcher3/folder/FolderAnimationManager.java
+++ b/src/com/android/launcher3/folder/FolderAnimationManager.java
@@ -22,6 +22,7 @@
import android.animation.ObjectAnimator;
import android.animation.TimeInterpolator;
import android.content.Context;
+import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.GradientDrawable;
@@ -44,6 +45,8 @@
import java.util.List;
+import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW;
+
/**
* Manages the opening and closing animations for a {@link Folder}.
*
@@ -101,8 +104,9 @@
mIsOpening = isOpening;
- mDuration = mFolder.mMaterialExpandDuration;
- mDelay = mContext.getResources().getInteger(R.integer.config_folderDelay);
+ Resources res = mContent.getResources();
+ mDuration = res.getInteger(R.integer.config_materialFolderExpandDuration);
+ mDelay = res.getInteger(R.integer.config_folderDelay);
mFolderInterpolator = AnimationUtils.loadInterpolator(mContext,
R.interpolator.folder_interpolator);
@@ -118,7 +122,7 @@
*/
public AnimatorSet getAnimator() {
final DragLayer.LayoutParams lp = (DragLayer.LayoutParams) mFolder.getLayoutParams();
- FolderIcon.PreviewLayoutRule rule = mFolderIcon.getLayoutRule();
+ ClippedFolderIconLayoutRule rule = mFolderIcon.getLayoutRule();
final List<BubbleTextView> itemsInPreview = mFolderIcon.getPreviewItems();
// Match position of the FolderIcon
@@ -129,7 +133,7 @@
float initialSize = (scaledRadius * 2) * scaleRelativeToDragLayer;
// Match size/scale of icons in the preview
- float previewScale = rule.scaleForItem(0, itemsInPreview.size());
+ float previewScale = rule.scaleForItem(itemsInPreview.size());
float previewSize = rule.getIconSize() * previewScale;
float initialScale = previewSize / itemsInPreview.get(0).getIconSize()
* scaleRelativeToDragLayer;
@@ -242,15 +246,14 @@
*/
private void addPreviewItemAnimators(AnimatorSet animatorSet, final float folderScale,
int previewItemOffsetX, int previewItemOffsetY) {
- FolderIcon.PreviewLayoutRule rule = mFolderIcon.getLayoutRule();
+ ClippedFolderIconLayoutRule rule = mFolderIcon.getLayoutRule();
boolean isOnFirstPage = mFolder.mContent.getCurrentPage() == 0;
final List<BubbleTextView> itemsInPreview = isOnFirstPage
? mFolderIcon.getPreviewItems()
: mFolderIcon.getPreviewItemsOnPage(mFolder.mContent.getCurrentPage());
final int numItemsInPreview = itemsInPreview.size();
final int numItemsInFirstPagePreview = isOnFirstPage
- ? numItemsInPreview
- : FolderIcon.NUM_ITEMS_IN_PREVIEW;
+ ? numItemsInPreview : MAX_NUM_ITEMS_IN_PREVIEW;
TimeInterpolator previewItemInterpolator = getPreviewItemInterpolator();
@@ -264,7 +267,7 @@
cwc.setupLp(btv);
// Match scale of icons in the preview of the items on the first page.
- float previewScale = rule.scaleForItem(i, numItemsInFirstPagePreview);
+ float previewScale = rule.scaleForItem(numItemsInFirstPagePreview);
float previewSize = rule.getIconSize() * previewScale;
float iconScale = previewSize / itemsInPreview.get(i).getIconSize();
@@ -299,7 +302,7 @@
scaleAnimator.setInterpolator(previewItemInterpolator);
play(animatorSet, scaleAnimator);
- if (mFolder.getItemCount() > FolderIcon.NUM_ITEMS_IN_PREVIEW) {
+ if (mFolder.getItemCount() > MAX_NUM_ITEMS_IN_PREVIEW) {
// These delays allows the preview items to move as part of the Folder's motion,
// and its only necessary for large folders because of differing interpolators.
int delay = mIsOpening ? mDelay : mDelay * 2;
@@ -349,7 +352,7 @@
}
private TimeInterpolator getPreviewItemInterpolator() {
- if (mFolder.getItemCount() > FolderIcon.NUM_ITEMS_IN_PREVIEW) {
+ if (mFolder.getItemCount() > MAX_NUM_ITEMS_IN_PREVIEW) {
// With larger folders, we want the preview items to reach their final positions faster
// (when opening) and later (when closing) so that they appear aligned with the rest of
// the folder items when they are both visible.
diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java
index 8339bc5..bb0a726 100644
--- a/src/com/android/launcher3/folder/FolderIcon.java
+++ b/src/com/android/launcher3/folder/FolderIcon.java
@@ -17,7 +17,6 @@
package com.android.launcher3.folder;
import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Canvas;
@@ -49,7 +48,6 @@
import com.android.launcher3.FolderInfo.FolderListener;
import com.android.launcher3.ItemInfo;
import com.android.launcher3.Launcher;
-import com.android.launcher3.LauncherAnimUtils;
import com.android.launcher3.LauncherSettings;
import com.android.launcher3.OnAlarmListener;
import com.android.launcher3.R;
@@ -60,7 +58,6 @@
import com.android.launcher3.Workspace;
import com.android.launcher3.badge.BadgeRenderer;
import com.android.launcher3.badge.FolderBadgeInfo;
-import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.dragndrop.BaseItemDragListener;
import com.android.launcher3.dragndrop.DragLayer;
import com.android.launcher3.dragndrop.DragView;
@@ -71,6 +68,7 @@
import java.util.ArrayList;
import java.util.List;
+import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW;
import static com.android.launcher3.folder.PreviewItemManager.INITIAL_ITEM_ANIMATION_DURATION;
/**
@@ -82,10 +80,6 @@
private FolderInfo mInfo;
@Thunk static boolean sStaticValuesDirty = true;
- public static final int NUM_ITEMS_IN_PREVIEW = FeatureFlags.LAUNCHER3_LEGACY_FOLDER_ICON ?
- StackFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW :
- ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW;
-
private CheckLongPressHelper mLongPressHelper;
private StylusEventHelper mStylusEventHelper;
@@ -103,7 +97,7 @@
private boolean mBackgroundIsVisible = true;
FolderIconPreviewVerifier mPreviewVerifier;
- PreviewLayoutRule mPreviewLayoutRule;
+ ClippedFolderIconLayoutRule mPreviewLayoutRule;
private PreviewItemManager mPreviewItemManager;
private PreviewItemDrawingParams mTmpParams = new PreviewItemDrawingParams(0, 0, 0, 0);
@@ -146,9 +140,7 @@
private void init() {
mLongPressHelper = new CheckLongPressHelper(this);
mStylusEventHelper = new StylusEventHelper(new SimpleOnStylusPressListener(this), this);
- mPreviewLayoutRule = FeatureFlags.LAUNCHER3_LEGACY_FOLDER_ICON ?
- new StackFolderIconLayoutRule() :
- new ClippedFolderIconLayoutRule();
+ mPreviewLayoutRule = new ClippedFolderIconLayoutRule();
mSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
mPreviewItemManager = new PreviewItemManager(this);
}
@@ -314,8 +306,7 @@
}
boolean itemAdded = false;
- if (index >= mPreviewLayoutRule.maxNumItems()
- && mPreviewLayoutRule.hasEnterExitIndices()) {
+ if (index >= MAX_NUM_ITEMS_IN_PREVIEW) {
List<BubbleTextView> oldPreviewItems = getPreviewItemsOnPage(0);
addItem(item, false);
List<BubbleTextView> newPreviewItems = getPreviewItemsOnPage(0);
@@ -347,7 +338,7 @@
to.offset(center[0] - animateView.getMeasuredWidth() / 2,
center[1] - animateView.getMeasuredHeight() / 2);
- float finalAlpha = index < mPreviewLayoutRule.maxNumItems() ? 0.5f : 0f;
+ float finalAlpha = index < MAX_NUM_ITEMS_IN_PREVIEW ? 0.5f : 0f;
float finalScale = scale * scaleRelativeToDragLayer;
dragLayer.animateView(animateView, from, to, finalAlpha,
@@ -391,7 +382,7 @@
mBadgeInfo = badgeInfo;
}
- public PreviewLayoutRule getLayoutRule() {
+ public ClippedFolderIconLayoutRule getLayoutRule() {
return mPreviewLayoutRule;
}
@@ -420,7 +411,7 @@
private float getLocalCenterForIndex(int index, int curNumItems, int[] center) {
mTmpParams = mPreviewItemManager.computePreviewItemDrawingParams(
- Math.min(mPreviewLayoutRule.maxNumItems(), index), curNumItems, mTmpParams);
+ Math.min(MAX_NUM_ITEMS_IN_PREVIEW, index), curNumItems, mTmpParams);
mTmpParams.transX += mBackground.basePreviewOffsetX;
mTmpParams.transY += mBackground.basePreviewOffsetY;
@@ -474,19 +465,17 @@
Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG);
} else {
saveCount = canvas.save(Canvas.CLIP_SAVE_FLAG);
- if (mPreviewLayoutRule.clipToBackground()) {
- canvas.clipPath(mBackground.getClipPath(), Region.Op.INTERSECT);
- }
+ canvas.clipPath(mBackground.getClipPath(), Region.Op.INTERSECT);
}
mPreviewItemManager.draw(canvas);
- if (mPreviewLayoutRule.clipToBackground() && canvas.isHardwareAccelerated()) {
+ if (canvas.isHardwareAccelerated()) {
mBackground.clipCanvasHardware(canvas);
}
canvas.restoreToCount(saveCount);
- if (mPreviewLayoutRule.clipToBackground() && !mBackground.drawingDelegated()) {
+ if (!mBackground.drawingDelegated()) {
mBackground.drawBackgroundStroke(canvas);
}
@@ -542,7 +531,7 @@
itemsToDisplay.add(itemsOnPage.get(rank));
}
- if (itemsToDisplay.size() == FolderIcon.NUM_ITEMS_IN_PREVIEW) {
+ if (itemsToDisplay.size() == MAX_NUM_ITEMS_IN_PREVIEW) {
break;
}
}
@@ -631,30 +620,6 @@
mInfo.removeListener(mFolder);
}
- public void shrinkAndFadeIn(boolean animate) {
- // We remove and re-draw the FolderIcon in-case it has changed
- final PreviewImageView previewImage = PreviewImageView.get(getContext());
- previewImage.removeFromParent();
- copyToPreview(previewImage);
-
- clearLeaveBehindIfExists();
-
- ObjectAnimator oa = LauncherAnimUtils.ofViewAlphaAndScale(previewImage, 1, 1, 1);
- oa.setDuration(getResources().getInteger(R.integer.config_folderExpandDuration));
- oa.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- // Remove the ImageView copy of the FolderIcon and make the original visible.
- previewImage.removeFromParent();
- setVisibility(View.VISIBLE);
- }
- });
- oa.start();
- if (!animate) {
- oa.end();
- }
- }
-
public void clearLeaveBehindIfExists() {
((CellLayout.LayoutParams) getLayoutParams()).canReorder = true;
if (mInfo.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) {
@@ -673,48 +638,7 @@
}
}
- public void growAndFadeOut() {
- drawLeaveBehindIfExists();
-
- // Push an ImageView copy of the FolderIcon into the DragLayer and hide the original
- PreviewImageView previewImage = PreviewImageView.get(getContext());
- copyToPreview(previewImage);
- setVisibility(View.INVISIBLE);
-
- ObjectAnimator oa = LauncherAnimUtils.ofViewAlphaAndScale(previewImage, 0, 1.5f, 1.5f);
- oa.setDuration(getResources().getInteger(R.integer.config_folderExpandDuration));
- oa.start();
- }
-
- /**
- * This method draws the FolderIcon to an ImageView and then adds and positions that ImageView
- * in the DragLayer in the exact absolute location of the original FolderIcon.
- */
- private void copyToPreview(PreviewImageView previewImageView) {
- previewImageView.copy(this);
- if (mFolder != null) {
- previewImageView.setPivotX(mFolder.getPivotXForIconAnimation());
- previewImageView.setPivotY(mFolder.getPivotYForIconAnimation());
- mFolder.bringToFront();
- }
- }
-
public void onFolderClose(int currentPage) {
mPreviewItemManager.onFolderClose(currentPage);
}
-
- interface PreviewLayoutRule {
- PreviewItemDrawingParams computePreviewItemDrawingParams(int index, int curNumItems,
- PreviewItemDrawingParams params);
- void init(int availableSpace, float intrinsicIconSize, boolean rtl);
- float scaleForItem(int index, int totalNumItems);
- float getIconSize();
- int maxNumItems();
- boolean clipToBackground();
-
- boolean hasEnterExitIndices();
- int getExitIndex();
- int getEnterIndex();
-
- }
}
diff --git a/src/com/android/launcher3/folder/FolderIconPreviewVerifier.java b/src/com/android/launcher3/folder/FolderIconPreviewVerifier.java
index d054a5d..5a27cd4 100644
--- a/src/com/android/launcher3/folder/FolderIconPreviewVerifier.java
+++ b/src/com/android/launcher3/folder/FolderIconPreviewVerifier.java
@@ -18,7 +18,8 @@
import com.android.launcher3.FolderInfo;
import com.android.launcher3.InvariantDeviceProfile;
-import com.android.launcher3.config.FeatureFlags;
+
+import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW;
/**
* Verifies whether an item in a Folder is displayed in the FolderIcon preview.
@@ -45,9 +46,7 @@
mMaxGridCountY, mMaxItemsPerPage, mGridSize);
mGridCountX = mGridSize[0];
- mDisplayingUpperLeftQuadrant = FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION
- && !FeatureFlags.LAUNCHER3_LEGACY_FOLDER_ICON
- && numItemsInFolder > FolderIcon.NUM_ITEMS_IN_PREVIEW;
+ mDisplayingUpperLeftQuadrant = numItemsInFolder > MAX_NUM_ITEMS_IN_PREVIEW;
}
/**
@@ -70,6 +69,6 @@
int row = rank / mGridCountX;
return col < 2 && row < 2;
}
- return rank < FolderIcon.NUM_ITEMS_IN_PREVIEW;
+ return rank < MAX_NUM_ITEMS_IN_PREVIEW;
}
}
diff --git a/src/com/android/launcher3/folder/PreviewImageView.java b/src/com/android/launcher3/folder/PreviewImageView.java
deleted file mode 100644
index 65d9db1..0000000
--- a/src/com/android/launcher3/folder/PreviewImageView.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.launcher3.folder;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.PorterDuff;
-import android.graphics.Rect;
-import android.view.View;
-import android.widget.ImageView;
-
-import com.android.launcher3.Launcher;
-import com.android.launcher3.R;
-import com.android.launcher3.dragndrop.DragLayer;
-
-/**
- * A temporary view which displays the a bitmap (used for folder icon animation)
- */
-public class PreviewImageView extends ImageView {
-
- private final Rect mTempRect = new Rect();
- private final DragLayer mParent;
-
- private Bitmap mBitmap;
- private Canvas mCanvas;
-
- public PreviewImageView(DragLayer parent) {
- super(parent.getContext());
- mParent = parent;
- }
-
- public void copy(View view) {
- final int width = view.getMeasuredWidth();
- final int height = view.getMeasuredHeight();
-
- if (mBitmap == null || mBitmap.getWidth() != width || mBitmap.getHeight() != height) {
- mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
- mCanvas = new Canvas(mBitmap);
- }
-
- DragLayer.LayoutParams lp;
- if (getLayoutParams() instanceof DragLayer.LayoutParams) {
- lp = (DragLayer.LayoutParams) getLayoutParams();
- } else {
- lp = new DragLayer.LayoutParams(width, height);
- }
-
- // The layout from which the folder is being opened may be scaled, adjust the starting
- // view size by this scale factor.
- float scale = mParent.getDescendantRectRelativeToSelf(view, mTempRect);
- lp.customPosition = true;
- lp.x = mTempRect.left;
- lp.y = mTempRect.top;
- lp.width = (int) (scale * width);
- lp.height = (int) (scale * height);
-
- mCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
- view.draw(mCanvas);
- setImageBitmap(mBitmap);
-
- // Just in case this image view is still in the drag layer from a previous animation,
- // we remove it and re-add it.
- removeFromParent();
- mParent.addView(this, lp);
- }
-
- public void removeFromParent() {
- if (mParent.indexOfChild(this) != -1) {
- mParent.removeView(this);
- }
- }
-
- public static PreviewImageView get(Context context) {
- DragLayer dragLayer = Launcher.getLauncher(context).getDragLayer();
- PreviewImageView view = (PreviewImageView) dragLayer.getTag(R.id.preview_image_id);
- if (view == null) {
- view = new PreviewImageView(dragLayer);
- dragLayer.setTag(R.id.preview_image_id, view);
- }
- return view;
- }
-}
diff --git a/src/com/android/launcher3/folder/PreviewItemManager.java b/src/com/android/launcher3/folder/PreviewItemManager.java
index 2d979a6..5d40010 100644
--- a/src/com/android/launcher3/folder/PreviewItemManager.java
+++ b/src/com/android/launcher3/folder/PreviewItemManager.java
@@ -29,11 +29,13 @@
import com.android.launcher3.BubbleTextView;
import com.android.launcher3.ShortcutInfo;
import com.android.launcher3.Utilities;
-import com.android.launcher3.config.FeatureFlags;
import java.util.ArrayList;
import java.util.List;
+import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.ENTER_INDEX;
+import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.EXIT_INDEX;
+import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW;
import static com.android.launcher3.folder.FolderIcon.DROP_IN_ANIMATION_DURATION;
/**
@@ -202,7 +204,7 @@
params.add(new PreviewItemDrawingParams(0, 0, 0, 0));
}
- int numItemsInFirstPagePreview = page == 0 ? items.size() : FolderIcon.NUM_ITEMS_IN_PREVIEW;
+ int numItemsInFirstPagePreview = page == 0 ? items.size() : MAX_NUM_ITEMS_IN_PREVIEW;
for (int i = 0; i < params.size(); i++) {
PreviewItemDrawingParams p = params.get(i);
p.drawable = items.get(i).getCompoundDrawables()[1];
@@ -213,7 +215,7 @@
p.drawable.setCallback(mIcon);
}
- if (!animate || FeatureFlags.LAUNCHER3_LEGACY_FOLDER_ICON) {
+ if (!animate) {
computePreviewItemDrawingParams(i, numItemsInFirstPagePreview, p);
if (mReferenceDrawable == null) {
mReferenceDrawable = p.drawable;
@@ -308,7 +310,7 @@
int prevIndex = newParams.indexOf(moveIn.get(i));
PreviewItemDrawingParams p = params.get(prevIndex);
computePreviewItemDrawingParams(prevIndex, numItems, p);
- updateTransitionParam(p, moveIn.get(i), mIcon.mPreviewLayoutRule.getEnterIndex(),
+ updateTransitionParam(p, moveIn.get(i), ENTER_INDEX,
newParams.indexOf(moveIn.get(i)));
}
@@ -328,7 +330,7 @@
BubbleTextView item = moveOut.get(i);
int oldIndex = oldParams.indexOf(item);
PreviewItemDrawingParams p = computePreviewItemDrawingParams(oldIndex, numItems, null);
- updateTransitionParam(p, item, oldIndex, mIcon.mPreviewLayoutRule.getExitIndex());
+ updateTransitionParam(p, item, oldIndex, EXIT_INDEX);
params.add(0, p); // We want these items first so that they are on drawn last.
}
@@ -349,7 +351,7 @@
}
FolderPreviewItemAnim anim = new FolderPreviewItemAnim(this, p, prevIndex,
- FolderIcon.NUM_ITEMS_IN_PREVIEW, newIndex, FolderIcon.NUM_ITEMS_IN_PREVIEW,
+ MAX_NUM_ITEMS_IN_PREVIEW, newIndex, MAX_NUM_ITEMS_IN_PREVIEW,
DROP_IN_ANIMATION_DURATION, null);
if (p.anim != null && !p.anim.hasEqualFinalState(anim)) {
p.anim.cancel();
diff --git a/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java b/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java
deleted file mode 100644
index 7d10556..0000000
--- a/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/**
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.launcher3.folder;
-
-public class StackFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule {
-
- static final int MAX_NUM_ITEMS_IN_PREVIEW = 3;
-
- // The degree to which the item in the back of the stack is scaled [0...1]
- // (0 means it's not scaled at all, 1 means it's scaled to nothing)
- private static final float PERSPECTIVE_SCALE_FACTOR = 0.35f;
-
- // The amount of vertical spread between items in the stack [0...1]
- private static final float PERSPECTIVE_SHIFT_FACTOR = 0.18f;
-
- private float mBaselineIconScale;
- private int mBaselineIconSize;
- private int mAvailableSpaceInPreview;
- private float mMaxPerspectiveShift;
-
- @Override
- public void init(int availableSpace, float intrinsicIconSize, boolean rtl) {
- mAvailableSpaceInPreview = availableSpace;
-
- // cos(45) = 0.707 + ~= 0.1) = 0.8f
- int adjustedAvailableSpace = (int) ((mAvailableSpaceInPreview / 2) * (1 + 0.8f));
-
- int unscaledHeight = (int) (intrinsicIconSize * (1 + PERSPECTIVE_SHIFT_FACTOR));
-
- mBaselineIconScale = (1.0f * adjustedAvailableSpace / unscaledHeight);
-
- mBaselineIconSize = (int) (intrinsicIconSize * mBaselineIconScale);
- mMaxPerspectiveShift = mBaselineIconSize * PERSPECTIVE_SHIFT_FACTOR;
- }
-
- @Override
- public PreviewItemDrawingParams computePreviewItemDrawingParams(int index, int curNumItems,
- PreviewItemDrawingParams params) {
- float scale = scaleForItem(index, curNumItems);
-
- index = MAX_NUM_ITEMS_IN_PREVIEW - index - 1;
- float r = (index * 1.0f) / (MAX_NUM_ITEMS_IN_PREVIEW - 1);
-
- float offset = (1 - r) * mMaxPerspectiveShift;
- float scaledSize = scale * mBaselineIconSize;
- float scaleOffsetCorrection = (1 - scale) * mBaselineIconSize;
-
- // We want to imagine our coordinates from the bottom left, growing up and to the
- // right. This is natural for the x-axis, but for the y-axis, we have to invert things.
- float transY = mAvailableSpaceInPreview - (offset + scaledSize + scaleOffsetCorrection);
- float transX = (mAvailableSpaceInPreview - scaledSize) / 2;
- float totalScale = mBaselineIconScale * scale;
- final float overlayAlpha = (80 * (1 - r)) / 255f;
-
- if (params == null) {
- params = new PreviewItemDrawingParams(transX, transY, totalScale, overlayAlpha);
- } else {
- params.update(transX, transY, totalScale);
- params.overlayAlpha = overlayAlpha;
- }
- return params;
- }
-
- @Override
- public int maxNumItems() {
- return MAX_NUM_ITEMS_IN_PREVIEW;
- }
-
- @Override
- public float getIconSize() {
- return mBaselineIconSize;
- }
-
- @Override
- public float scaleForItem(int index, int numItems) {
- // Scale is determined by the position of the icon in the preview.
- index = MAX_NUM_ITEMS_IN_PREVIEW - index - 1;
- float r = (index * 1.0f) / (MAX_NUM_ITEMS_IN_PREVIEW - 1);
- return (1 - PERSPECTIVE_SCALE_FACTOR * (1 - r));
- }
-
- @Override
- public boolean clipToBackground() {
- return false;
- }
-
- @Override
- public boolean hasEnterExitIndices() {
- return false;
- }
-
- @Override
- public int getExitIndex() {
- throw new RuntimeException("hasEnterExitIndices not supported");
- }
-
- @Override
- public int getEnterIndex() {
- throw new RuntimeException("hasEnterExitIndices not supported");
- }
-}
diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java
index 4756edc..e1b208a 100644
--- a/src/com/android/launcher3/model/LoaderTask.java
+++ b/src/com/android/launcher3/model/LoaderTask.java
@@ -53,7 +53,6 @@
import com.android.launcher3.compat.UserManagerCompat;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.folder.Folder;
-import com.android.launcher3.folder.FolderIcon;
import com.android.launcher3.folder.FolderIconPreviewVerifier;
import com.android.launcher3.graphics.LauncherIcons;
import com.android.launcher3.logging.FileLog;
@@ -76,6 +75,8 @@
import java.util.Map;
import java.util.concurrent.CancellationException;
+import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW;
+
/**
* Runnable for the thread that loads the contents of the launcher:
* - workspace icons
@@ -734,7 +735,7 @@
numItemsInPreview++;
}
- if (numItemsInPreview >= FolderIcon.NUM_ITEMS_IN_PREVIEW) {
+ if (numItemsInPreview >= MAX_NUM_ITEMS_IN_PREVIEW) {
break;
}
}