Removing some folder customization options

The old folder preview and animation relied on creating bitmaps for transition.
As we move to hardware bitmaps, creating custom bitmaps which rely on icon bitmaps
would be costly (hardware bitmaps are immutable and cannot be drawn on a software canvas).

Bug: 35428783
Change-Id: I39869ed44feb6a886985ad15775bc1ab55565727
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;
                     }
                 }