Loading src/com/android/launcher3/MainProcessInitializer.java +2 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.launcher3; import android.content.Context; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.folder.FolderShape; import com.android.launcher3.graphics.IconShapeOverride; import com.android.launcher3.logging.FileLog; import com.android.launcher3.util.ResourceBasedOverride; Loading @@ -39,5 +40,6 @@ public class MainProcessInitializer implements ResourceBasedOverride { FeatureFlags.initialize(context); IconShapeOverride.apply(context); SessionCommitReceiver.applyDefaultUserPrefs(context); FolderShape.init(); } } src/com/android/launcher3/Workspace.java +3 −3 Original line number Diff line number Diff line Loading @@ -127,8 +127,8 @@ public class Workspace extends PagedView<WorkspacePageIndicator> private static final int DEFAULT_PAGE = 0; private static final boolean MAP_NO_RECURSE = false; private static final boolean MAP_RECURSE = true; public static final boolean MAP_NO_RECURSE = false; public static final boolean MAP_RECURSE = true; // The screen id used for the empty screen always present to the right. public static final int EXTRA_EMPTY_SCREEN_ID = -201; Loading Loading @@ -3121,7 +3121,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator> * @param recurse true: iterate over folder children. false: op get the folders themselves. * @param op the operator to map over the shortcuts */ void mapOverItems(boolean recurse, ItemOperator op) { public void mapOverItems(boolean recurse, ItemOperator op) { ArrayList<ShortcutAndWidgetContainer> containers = getAllShortcutAndWidgetContainers(); final int containerCount = containers.size(); for (int containerIdx = 0; containerIdx < containerCount; containerIdx++) { Loading src/com/android/launcher3/folder/Folder.java +25 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ import android.animation.AnimatorSet; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Path; import android.graphics.Rect; import android.text.InputType; import android.text.Selection; Loading Loading @@ -151,6 +153,8 @@ public class Folder extends AbstractFloatingView implements DragSource, // Cell ranks used for drag and drop @Thunk int mTargetRank, mPrevTargetRank, mEmptyCellRank; private Path mClipPath; @ViewDebug.ExportedProperty(category = "launcher", mapping = { @ViewDebug.IntToString(from = STATE_NONE, to = "STATE_NONE"), Loading Loading @@ -1476,4 +1480,25 @@ public class Folder extends AbstractFloatingView implements DragSource, sHintText = res.getString(R.string.folder_hint_text); } } /** * Alternative to using {@link #getClipToOutline()} as it only works with derivatives of * rounded rect. */ public void setClipPath(Path clipPath) { mClipPath = clipPath; invalidate(); } @Override public void draw(Canvas canvas) { if (mClipPath != null) { int count = canvas.save(); canvas.clipPath(mClipPath); super.draw(canvas); canvas.restoreToCount(count); } else { super.draw(canvas); } } } src/com/android/launcher3/folder/FolderAnimationManager.java +3 −10 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.launcher3.folder; import static com.android.launcher3.BubbleTextView.TEXT_ALPHA_PROPERTY; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW; import static com.android.launcher3.folder.FolderShape.getShape; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; Loading @@ -40,7 +41,6 @@ import com.android.launcher3.R; import com.android.launcher3.ShortcutAndWidgetContainer; import com.android.launcher3.Utilities; import com.android.launcher3.anim.PropertyResetListener; import com.android.launcher3.anim.RoundedRectRevealOutlineProvider; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.util.Themes; Loading Loading @@ -166,7 +166,6 @@ public class FolderAnimationManager { Math.round((totalOffsetX + initialSize) / initialScale), Math.round((paddingOffsetY + initialSize) / initialScale)); Rect endRect = new Rect(0, 0, lp.width, lp.height); float initialRadius = initialSize / initialScale / 2f; float finalRadius = Utilities.pxFromDp(2, mContext.getResources().getDisplayMetrics()); // Create the animators. Loading @@ -189,14 +188,8 @@ public class FolderAnimationManager { play(a, getAnimator(mFolder, SCALE_PROPERTY, initialScale, finalScale)); play(a, getAnimator(mFolderBackground, "color", initialColor, finalColor)); play(a, mFolderIcon.mFolderName.createTextAlphaAnimator(!mIsOpening)); RoundedRectRevealOutlineProvider outlineProvider = new RoundedRectRevealOutlineProvider( initialRadius, finalRadius, startRect, endRect) { @Override public boolean shouldRemoveElevationDuringAnimation() { return true; } }; play(a, outlineProvider.createRevealAnimator(mFolder, !mIsOpening)); play(a, getShape().createRevealAnimator( mFolder, startRect, endRect, finalRadius, !mIsOpening)); // Animate the elevation midway so that the shadow is not noticeable in the background. int midDuration = mDuration / 2; Loading src/com/android/launcher3/folder/FolderIcon.java +3 −13 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ import androidx.annotation.NonNull; * An icon that can appear on in the workspace representing an {@link Folder}. */ public class FolderIcon extends FrameLayout implements FolderListener { @Thunk Launcher mLauncher; @Thunk Folder mFolder; private FolderInfo mInfo; Loading Loading @@ -477,20 +478,9 @@ public class FolderIcon extends FrameLayout implements FolderListener { if (mFolder == null) return; if (mFolder.getItemCount() == 0 && !mAnimating) return; final int saveCount; if (canvas.isHardwareAccelerated()) { saveCount = canvas.saveLayer(0, 0, getWidth(), getHeight(), null); } else { saveCount = canvas.save(); final int saveCount = canvas.save(); canvas.clipPath(mBackground.getClipPath()); } mPreviewItemManager.draw(canvas); if (canvas.isHardwareAccelerated()) { mBackground.clipCanvasHardware(canvas); } canvas.restoreToCount(saveCount); if (!mBackground.drawingDelegated()) { Loading Loading
src/com/android/launcher3/MainProcessInitializer.java +2 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.launcher3; import android.content.Context; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.folder.FolderShape; import com.android.launcher3.graphics.IconShapeOverride; import com.android.launcher3.logging.FileLog; import com.android.launcher3.util.ResourceBasedOverride; Loading @@ -39,5 +40,6 @@ public class MainProcessInitializer implements ResourceBasedOverride { FeatureFlags.initialize(context); IconShapeOverride.apply(context); SessionCommitReceiver.applyDefaultUserPrefs(context); FolderShape.init(); } }
src/com/android/launcher3/Workspace.java +3 −3 Original line number Diff line number Diff line Loading @@ -127,8 +127,8 @@ public class Workspace extends PagedView<WorkspacePageIndicator> private static final int DEFAULT_PAGE = 0; private static final boolean MAP_NO_RECURSE = false; private static final boolean MAP_RECURSE = true; public static final boolean MAP_NO_RECURSE = false; public static final boolean MAP_RECURSE = true; // The screen id used for the empty screen always present to the right. public static final int EXTRA_EMPTY_SCREEN_ID = -201; Loading Loading @@ -3121,7 +3121,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator> * @param recurse true: iterate over folder children. false: op get the folders themselves. * @param op the operator to map over the shortcuts */ void mapOverItems(boolean recurse, ItemOperator op) { public void mapOverItems(boolean recurse, ItemOperator op) { ArrayList<ShortcutAndWidgetContainer> containers = getAllShortcutAndWidgetContainers(); final int containerCount = containers.size(); for (int containerIdx = 0; containerIdx < containerCount; containerIdx++) { Loading
src/com/android/launcher3/folder/Folder.java +25 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ import android.animation.AnimatorSet; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Path; import android.graphics.Rect; import android.text.InputType; import android.text.Selection; Loading Loading @@ -151,6 +153,8 @@ public class Folder extends AbstractFloatingView implements DragSource, // Cell ranks used for drag and drop @Thunk int mTargetRank, mPrevTargetRank, mEmptyCellRank; private Path mClipPath; @ViewDebug.ExportedProperty(category = "launcher", mapping = { @ViewDebug.IntToString(from = STATE_NONE, to = "STATE_NONE"), Loading Loading @@ -1476,4 +1480,25 @@ public class Folder extends AbstractFloatingView implements DragSource, sHintText = res.getString(R.string.folder_hint_text); } } /** * Alternative to using {@link #getClipToOutline()} as it only works with derivatives of * rounded rect. */ public void setClipPath(Path clipPath) { mClipPath = clipPath; invalidate(); } @Override public void draw(Canvas canvas) { if (mClipPath != null) { int count = canvas.save(); canvas.clipPath(mClipPath); super.draw(canvas); canvas.restoreToCount(count); } else { super.draw(canvas); } } }
src/com/android/launcher3/folder/FolderAnimationManager.java +3 −10 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.launcher3.folder; import static com.android.launcher3.BubbleTextView.TEXT_ALPHA_PROPERTY; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW; import static com.android.launcher3.folder.FolderShape.getShape; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; Loading @@ -40,7 +41,6 @@ import com.android.launcher3.R; import com.android.launcher3.ShortcutAndWidgetContainer; import com.android.launcher3.Utilities; import com.android.launcher3.anim.PropertyResetListener; import com.android.launcher3.anim.RoundedRectRevealOutlineProvider; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.util.Themes; Loading Loading @@ -166,7 +166,6 @@ public class FolderAnimationManager { Math.round((totalOffsetX + initialSize) / initialScale), Math.round((paddingOffsetY + initialSize) / initialScale)); Rect endRect = new Rect(0, 0, lp.width, lp.height); float initialRadius = initialSize / initialScale / 2f; float finalRadius = Utilities.pxFromDp(2, mContext.getResources().getDisplayMetrics()); // Create the animators. Loading @@ -189,14 +188,8 @@ public class FolderAnimationManager { play(a, getAnimator(mFolder, SCALE_PROPERTY, initialScale, finalScale)); play(a, getAnimator(mFolderBackground, "color", initialColor, finalColor)); play(a, mFolderIcon.mFolderName.createTextAlphaAnimator(!mIsOpening)); RoundedRectRevealOutlineProvider outlineProvider = new RoundedRectRevealOutlineProvider( initialRadius, finalRadius, startRect, endRect) { @Override public boolean shouldRemoveElevationDuringAnimation() { return true; } }; play(a, outlineProvider.createRevealAnimator(mFolder, !mIsOpening)); play(a, getShape().createRevealAnimator( mFolder, startRect, endRect, finalRadius, !mIsOpening)); // Animate the elevation midway so that the shadow is not noticeable in the background. int midDuration = mDuration / 2; Loading
src/com/android/launcher3/folder/FolderIcon.java +3 −13 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ import androidx.annotation.NonNull; * An icon that can appear on in the workspace representing an {@link Folder}. */ public class FolderIcon extends FrameLayout implements FolderListener { @Thunk Launcher mLauncher; @Thunk Folder mFolder; private FolderInfo mInfo; Loading Loading @@ -477,20 +478,9 @@ public class FolderIcon extends FrameLayout implements FolderListener { if (mFolder == null) return; if (mFolder.getItemCount() == 0 && !mAnimating) return; final int saveCount; if (canvas.isHardwareAccelerated()) { saveCount = canvas.saveLayer(0, 0, getWidth(), getHeight(), null); } else { saveCount = canvas.save(); final int saveCount = canvas.save(); canvas.clipPath(mBackground.getClipPath()); } mPreviewItemManager.draw(canvas); if (canvas.isHardwareAccelerated()) { mBackground.clipCanvasHardware(canvas); } canvas.restoreToCount(saveCount); if (!mBackground.drawingDelegated()) { Loading