Loading src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java +31 −9 Original line number Diff line number Diff line package com.android.launcher3.folder; import android.graphics.Path; import android.graphics.Point; import android.view.View; import com.android.launcher3.DeviceProfile; import com.android.launcher3.LauncherAppState; import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; import java.util.ArrayList; import java.util.List; public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule { static final int MAX_NUM_ITEMS_IN_PREVIEW = 4; private static final int MIN_NUM_ITEMS_IN_PREVIEW = 2; private static final int MAX_NUM_ITEMS_PER_ROW = 2; final float MIN_SCALE = 0.48f; final float MAX_SCALE = 0.58f; Loading Loading @@ -38,7 +39,7 @@ public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule public FolderIcon.PreviewItemDrawingParams computePreviewItemDrawingParams(int index, int curNumItems, FolderIcon.PreviewItemDrawingParams params) { float totalScale = scaleForNumItems(curNumItems); float totalScale = scaleForItem(index, curNumItems); float transX; float transY; float overlayAlpha = 0; Loading Loading @@ -94,7 +95,7 @@ public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule 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 * scaleForNumItems(curNumItems)) / 2; float halfIconSize = (mIconSize * scaleForItem(index, 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 Loading @@ -104,7 +105,9 @@ public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule } private float scaleForNumItems(int numItems) { @Override public float scaleForItem(int index, int numItems) { // Scale is determined by the number of items in the preview. float scale = 1f; if (numItems <= 2) { scale = MAX_SCALE; Loading @@ -118,7 +121,7 @@ public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule } @Override public int numItems() { public int maxNumItems() { return MAX_NUM_ITEMS_IN_PREVIEW; } Loading @@ -127,4 +130,23 @@ public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule return true; } @Override public List<View> getItemsToDisplay(Folder folder) { List<View> items = new ArrayList<>(folder.getItemsInReadingOrder()); int numItems = items.size(); if (FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION && numItems > MAX_NUM_ITEMS_IN_PREVIEW) { // We match the icons in the preview with the layout of the opened folder (b/27944225), // but we still need to figure out how we want to handle updating the preview when the // upper left quadrant changes. int appsPerRow = folder.mContent.getPageAt(0).getCountX(); int appsToDelete = appsPerRow - MAX_NUM_ITEMS_PER_ROW; // We only display the upper left quadrant. while (appsToDelete > 0) { items.remove(MAX_NUM_ITEMS_PER_ROW); appsToDelete--; } } return items.subList(0, Math.min(numItems, MAX_NUM_ITEMS_IN_PREVIEW)); } } src/com/android/launcher3/folder/FolderIcon.java +9 −8 Original line number Diff line number Diff line Loading @@ -73,6 +73,7 @@ import com.android.launcher3.graphics.IconPalette; import com.android.launcher3.util.Thunk; import java.util.ArrayList; import java.util.List; /** * An icon that can appear on in the workspace representing an {@link Folder}. Loading Loading @@ -327,7 +328,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { to.offset(center[0] - animateView.getMeasuredWidth() / 2, center[1] - animateView.getMeasuredHeight() / 2); float finalAlpha = index < mPreviewLayoutRule.numItems() ? 0.5f : 0f; float finalAlpha = index < mPreviewLayoutRule.maxNumItems() ? 0.5f : 0f; float finalScale = scale * scaleRelativeToDragLayer; dragLayer.animateView(animateView, from, to, finalAlpha, Loading Loading @@ -425,8 +426,8 @@ public class FolderIcon extends FrameLayout implements FolderListener { } private float getLocalCenterForIndex(int index, int curNumItems, int[] center) { mTmpParams = computePreviewItemDrawingParams(Math.min(mPreviewLayoutRule.numItems(), index), curNumItems, mTmpParams); mTmpParams = computePreviewItemDrawingParams( Math.min(mPreviewLayoutRule.maxNumItems(), index), curNumItems, mTmpParams); mTmpParams.transX += mBackground.basePreviewOffsetX; mTmpParams.transY += mBackground.basePreviewOffsetY; Loading Loading @@ -890,8 +891,8 @@ public class FolderIcon extends FrameLayout implements FolderListener { } private void updateItemDrawingParams(boolean animate) { ArrayList<View> items = mFolder.getItemsInReadingOrder(); int nItemsInPreview = Math.min(items.size(), mPreviewLayoutRule.numItems()); List<View> items = mPreviewLayoutRule.getItemsToDisplay(mFolder); int nItemsInPreview = items.size(); int prevNumItems = mDrawingParams.size(); Loading Loading @@ -1062,10 +1063,10 @@ public class FolderIcon extends FrameLayout implements FolderListener { public interface PreviewLayoutRule { PreviewItemDrawingParams computePreviewItemDrawingParams(int index, int curNumItems, PreviewItemDrawingParams params); void init(int availableSpace, int intrinsicIconSize, boolean rtl); int numItems(); float scaleForItem(int index, int totalNumItems); int maxNumItems(); boolean clipToBackground(); List<View> getItemsToDisplay(Folder folder); } } src/com/android/launcher3/folder/StackFolderIconLayoutRule.java +19 −3 Original line number Diff line number Diff line Loading @@ -16,10 +16,12 @@ package com.android.launcher3.folder; import android.graphics.Path; import android.view.View; import com.android.launcher3.folder.FolderIcon.PreviewItemDrawingParams; import java.util.List; public class StackFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule { static final int MAX_NUM_ITEMS_IN_PREVIEW = 3; Loading Loading @@ -54,10 +56,10 @@ public class StackFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule { @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 scale = (1 - PERSPECTIVE_SCALE_FACTOR * (1 - r)); float offset = (1 - r) * mMaxPerspectiveShift; float scaledSize = scale * mBaselineIconSize; Loading @@ -80,12 +82,26 @@ public class StackFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule { } @Override public int numItems() { public int maxNumItems() { return MAX_NUM_ITEMS_IN_PREVIEW; } @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 List<View> getItemsToDisplay(Folder folder) { List<View> items = folder.getItemsInReadingOrder(); return items.subList(0, Math.min(items.size(), MAX_NUM_ITEMS_IN_PREVIEW)); } } src_config/com/android/launcher3/config/FeatureFlags.java +1 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ public final class FeatureFlags { public static boolean LAUNCHER3_USE_SYSTEM_DRAG_DRIVER = true; public static boolean LAUNCHER3_DISABLE_PINCH_TO_OVERVIEW = false; public static boolean LAUNCHER3_ALL_APPS_PULL_UP = true; public static boolean LAUNCHER3_NEW_FOLDER_ANIMATION = false; // Feature flag to enable moving the QSB on the 0th screen of the workspace. public static final boolean QSB_ON_FIRST_SCREEN = true; Loading Loading
src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java +31 −9 Original line number Diff line number Diff line package com.android.launcher3.folder; import android.graphics.Path; import android.graphics.Point; import android.view.View; import com.android.launcher3.DeviceProfile; import com.android.launcher3.LauncherAppState; import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; import java.util.ArrayList; import java.util.List; public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule { static final int MAX_NUM_ITEMS_IN_PREVIEW = 4; private static final int MIN_NUM_ITEMS_IN_PREVIEW = 2; private static final int MAX_NUM_ITEMS_PER_ROW = 2; final float MIN_SCALE = 0.48f; final float MAX_SCALE = 0.58f; Loading Loading @@ -38,7 +39,7 @@ public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule public FolderIcon.PreviewItemDrawingParams computePreviewItemDrawingParams(int index, int curNumItems, FolderIcon.PreviewItemDrawingParams params) { float totalScale = scaleForNumItems(curNumItems); float totalScale = scaleForItem(index, curNumItems); float transX; float transY; float overlayAlpha = 0; Loading Loading @@ -94,7 +95,7 @@ public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule 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 * scaleForNumItems(curNumItems)) / 2; float halfIconSize = (mIconSize * scaleForItem(index, 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 Loading @@ -104,7 +105,9 @@ public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule } private float scaleForNumItems(int numItems) { @Override public float scaleForItem(int index, int numItems) { // Scale is determined by the number of items in the preview. float scale = 1f; if (numItems <= 2) { scale = MAX_SCALE; Loading @@ -118,7 +121,7 @@ public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule } @Override public int numItems() { public int maxNumItems() { return MAX_NUM_ITEMS_IN_PREVIEW; } Loading @@ -127,4 +130,23 @@ public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule return true; } @Override public List<View> getItemsToDisplay(Folder folder) { List<View> items = new ArrayList<>(folder.getItemsInReadingOrder()); int numItems = items.size(); if (FeatureFlags.LAUNCHER3_NEW_FOLDER_ANIMATION && numItems > MAX_NUM_ITEMS_IN_PREVIEW) { // We match the icons in the preview with the layout of the opened folder (b/27944225), // but we still need to figure out how we want to handle updating the preview when the // upper left quadrant changes. int appsPerRow = folder.mContent.getPageAt(0).getCountX(); int appsToDelete = appsPerRow - MAX_NUM_ITEMS_PER_ROW; // We only display the upper left quadrant. while (appsToDelete > 0) { items.remove(MAX_NUM_ITEMS_PER_ROW); appsToDelete--; } } return items.subList(0, Math.min(numItems, MAX_NUM_ITEMS_IN_PREVIEW)); } }
src/com/android/launcher3/folder/FolderIcon.java +9 −8 Original line number Diff line number Diff line Loading @@ -73,6 +73,7 @@ import com.android.launcher3.graphics.IconPalette; import com.android.launcher3.util.Thunk; import java.util.ArrayList; import java.util.List; /** * An icon that can appear on in the workspace representing an {@link Folder}. Loading Loading @@ -327,7 +328,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { to.offset(center[0] - animateView.getMeasuredWidth() / 2, center[1] - animateView.getMeasuredHeight() / 2); float finalAlpha = index < mPreviewLayoutRule.numItems() ? 0.5f : 0f; float finalAlpha = index < mPreviewLayoutRule.maxNumItems() ? 0.5f : 0f; float finalScale = scale * scaleRelativeToDragLayer; dragLayer.animateView(animateView, from, to, finalAlpha, Loading Loading @@ -425,8 +426,8 @@ public class FolderIcon extends FrameLayout implements FolderListener { } private float getLocalCenterForIndex(int index, int curNumItems, int[] center) { mTmpParams = computePreviewItemDrawingParams(Math.min(mPreviewLayoutRule.numItems(), index), curNumItems, mTmpParams); mTmpParams = computePreviewItemDrawingParams( Math.min(mPreviewLayoutRule.maxNumItems(), index), curNumItems, mTmpParams); mTmpParams.transX += mBackground.basePreviewOffsetX; mTmpParams.transY += mBackground.basePreviewOffsetY; Loading Loading @@ -890,8 +891,8 @@ public class FolderIcon extends FrameLayout implements FolderListener { } private void updateItemDrawingParams(boolean animate) { ArrayList<View> items = mFolder.getItemsInReadingOrder(); int nItemsInPreview = Math.min(items.size(), mPreviewLayoutRule.numItems()); List<View> items = mPreviewLayoutRule.getItemsToDisplay(mFolder); int nItemsInPreview = items.size(); int prevNumItems = mDrawingParams.size(); Loading Loading @@ -1062,10 +1063,10 @@ public class FolderIcon extends FrameLayout implements FolderListener { public interface PreviewLayoutRule { PreviewItemDrawingParams computePreviewItemDrawingParams(int index, int curNumItems, PreviewItemDrawingParams params); void init(int availableSpace, int intrinsicIconSize, boolean rtl); int numItems(); float scaleForItem(int index, int totalNumItems); int maxNumItems(); boolean clipToBackground(); List<View> getItemsToDisplay(Folder folder); } }
src/com/android/launcher3/folder/StackFolderIconLayoutRule.java +19 −3 Original line number Diff line number Diff line Loading @@ -16,10 +16,12 @@ package com.android.launcher3.folder; import android.graphics.Path; import android.view.View; import com.android.launcher3.folder.FolderIcon.PreviewItemDrawingParams; import java.util.List; public class StackFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule { static final int MAX_NUM_ITEMS_IN_PREVIEW = 3; Loading Loading @@ -54,10 +56,10 @@ public class StackFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule { @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 scale = (1 - PERSPECTIVE_SCALE_FACTOR * (1 - r)); float offset = (1 - r) * mMaxPerspectiveShift; float scaledSize = scale * mBaselineIconSize; Loading @@ -80,12 +82,26 @@ public class StackFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule { } @Override public int numItems() { public int maxNumItems() { return MAX_NUM_ITEMS_IN_PREVIEW; } @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 List<View> getItemsToDisplay(Folder folder) { List<View> items = folder.getItemsInReadingOrder(); return items.subList(0, Math.min(items.size(), MAX_NUM_ITEMS_IN_PREVIEW)); } }
src_config/com/android/launcher3/config/FeatureFlags.java +1 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ public final class FeatureFlags { public static boolean LAUNCHER3_USE_SYSTEM_DRAG_DRIVER = true; public static boolean LAUNCHER3_DISABLE_PINCH_TO_OVERVIEW = false; public static boolean LAUNCHER3_ALL_APPS_PULL_UP = true; public static boolean LAUNCHER3_NEW_FOLDER_ANIMATION = false; // Feature flag to enable moving the QSB on the 0th screen of the workspace. public static final boolean QSB_ON_FIRST_SCREEN = true; Loading