Loading quickstep/recents_ui_overrides/src/com/android/quickstep/util/StaggeredWorkspaceAnim.java +43 −12 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.view.ViewGroup; import androidx.annotation.Nullable; import com.android.launcher3.BubbleTextView; import com.android.launcher3.CellLayout; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; Loading @@ -40,7 +41,9 @@ import com.android.launcher3.Workspace; import com.android.launcher3.anim.AnimatorSetBuilder; import com.android.launcher3.anim.PropertySetter; import com.android.launcher3.anim.SpringObjectAnimator; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.OverviewScrim; import com.android.launcher3.views.IconLabelDotView; import java.util.ArrayList; import java.util.List; Loading @@ -62,7 +65,9 @@ public class StaggeredWorkspaceAnim { private final float mVelocity; private final float mSpringTransY; private final View mViewToIgnore; // The original view of the {@link FloatingIconView}. private final View mOriginalView; private final List<Animator> mAnimators = new ArrayList<>(); Loading @@ -72,9 +77,7 @@ public class StaggeredWorkspaceAnim { public StaggeredWorkspaceAnim(Launcher launcher, @Nullable View floatingViewOriginalView, float velocity) { mVelocity = velocity; // We ignore this view since it's visibility and position is controlled by // the FloatingIconView. mViewToIgnore = floatingViewOriginalView; mOriginalView = floatingViewOriginalView; // Scale the translationY based on the initial velocity to better sync the workspace items // with the floating view. Loading @@ -86,16 +89,21 @@ public class StaggeredWorkspaceAnim { Workspace workspace = launcher.getWorkspace(); CellLayout cellLayout = (CellLayout) workspace.getChildAt(workspace.getCurrentPage()); ShortcutAndWidgetContainer currentPage = cellLayout.getShortcutsAndWidgets(); ViewGroup hotseat = launcher.getHotseat(); boolean workspaceClipChildren = workspace.getClipChildren(); boolean workspaceClipToPadding = workspace.getClipToPadding(); boolean cellLayoutClipChildren = cellLayout.getClipChildren(); boolean cellLayoutClipToPadding = cellLayout.getClipToPadding(); boolean hotseatClipChildren = hotseat.getClipChildren(); boolean hotseatClipToPadding = hotseat.getClipToPadding(); workspace.setClipChildren(false); workspace.setClipToPadding(false); cellLayout.setClipChildren(false); cellLayout.setClipToPadding(false); hotseat.setClipChildren(false); hotseat.setClipToPadding(false); // Hotseat and QSB takes up two additional rows. int totalRows = grid.inv.numRows + (grid.isVerticalBarLayout() ? 0 : 2); Loading @@ -108,16 +116,18 @@ public class StaggeredWorkspaceAnim { } // Set up springs for the hotseat and qsb. ViewGroup hotseatChild = (ViewGroup) hotseat.getChildAt(0); if (grid.isVerticalBarLayout()) { ViewGroup hotseat = (ViewGroup) launcher.getHotseat().getChildAt(0); for (int i = hotseat.getChildCount() - 1; i >= 0; i--) { View child = hotseat.getChildAt(i); for (int i = hotseatChild.getChildCount() - 1; i >= 0; i--) { View child = hotseatChild.getChildAt(i); CellLayout.LayoutParams lp = ((CellLayout.LayoutParams) child.getLayoutParams()); addStaggeredAnimationForView(child, lp.cellY + 1, totalRows); } } else { View hotseat = launcher.getHotseat().getChildAt(0); addStaggeredAnimationForView(hotseat, grid.inv.numRows + 1, totalRows); for (int i = hotseatChild.getChildCount() - 1; i >= 0; i--) { View child = hotseatChild.getChildAt(i); addStaggeredAnimationForView(child, grid.inv.numRows + 1, totalRows); } View qsb = launcher.findViewById(R.id.search_container_all_apps); addStaggeredAnimationForView(qsb, grid.inv.numRows + 2, totalRows); Loading @@ -140,6 +150,8 @@ public class StaggeredWorkspaceAnim { workspace.setClipToPadding(workspaceClipToPadding); cellLayout.setClipChildren(cellLayoutClipChildren); cellLayout.setClipToPadding(cellLayoutClipToPadding); hotseat.setClipChildren(hotseatClipChildren); hotseat.setClipToPadding(hotseatClipToPadding); } }; Loading Loading @@ -180,16 +192,35 @@ public class StaggeredWorkspaceAnim { springTransY.setStartDelay(startDelay); mAnimators.add(springTransY); if (v == mViewToIgnore) { ObjectAnimator alpha = getAlphaAnimator(v, startDelay); if (v == mOriginalView) { // For IconLabelDotViews, we just want the label to fade in. // Icon, badge, and dots will animate in separately (controlled via FloatingIconView) if (v instanceof IconLabelDotView) { alpha.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { IconLabelDotView view = (IconLabelDotView) v; view.setIconVisible(false); view.setForceHideDot(true); } }); } else { return; } } v.setAlpha(0); mAnimators.add(alpha); } private ObjectAnimator getAlphaAnimator(View v, long startDelay) { ObjectAnimator alpha = ObjectAnimator.ofFloat(v, View.ALPHA, 0f, 1f); alpha.setInterpolator(LINEAR); alpha.setDuration(ALPHA_DURATION_MS); alpha.setStartDelay(startDelay); mAnimators.add(alpha); return alpha; } private void addScrimAnimationForState(Launcher launcher, LauncherState state, long duration) { Loading src/com/android/launcher3/BubbleTextView.java +6 −4 Original line number Diff line number Diff line Loading @@ -32,7 +32,6 @@ import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.text.TextUtils.TruncateAt; import android.util.AttributeSet; import android.util.Log; import android.util.Property; import android.util.TypedValue; import android.view.KeyEvent; Loading @@ -54,8 +53,8 @@ import com.android.launcher3.icons.DotRenderer; import com.android.launcher3.icons.IconCache.IconLoadRequest; import com.android.launcher3.icons.IconCache.ItemInfoUpdateReceiver; import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.testing.TestProtocol; import com.android.launcher3.views.ActivityContext; import com.android.launcher3.views.IconLabelDotView; import java.text.NumberFormat; Loading @@ -64,7 +63,8 @@ import java.text.NumberFormat; * because we want to make the bubble taller than the text and TextView's clip is * too aggressive. */ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, OnResumeCallback { public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, OnResumeCallback, IconLabelDotView { private static final int DISPLAY_WORKSPACE = 0; private static final int DISPLAY_ALL_APPS = 1; Loading Loading @@ -413,7 +413,8 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, } } public void forceHideDot(boolean forceHideDot) { @Override public void setForceHideDot(boolean forceHideDot) { if (mForceHideDot == forceHideDot) { return; } Loading Loading @@ -602,6 +603,7 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, } } @Override public void setIconVisible(boolean visible) { mIsIconVisible = visible; Drawable icon = visible ? mIcon : new ColorDrawable(Color.TRANSPARENT); Loading src/com/android/launcher3/FastBitmapDrawable.java +5 −2 Original line number Diff line number Diff line Loading @@ -142,8 +142,11 @@ public class FastBitmapDrawable extends Drawable { @Override public void setAlpha(int alpha) { if (mAlpha != alpha) { mAlpha = alpha; mPaint.setAlpha(alpha); invalidateSelf(); } } @Override Loading src/com/android/launcher3/folder/Folder.java +2 −2 Original line number Diff line number Diff line Loading @@ -516,7 +516,7 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { mFolderIcon.setBackgroundVisible(false); mFolderIcon.setIconVisible(false); mFolderIcon.drawLeaveBehindIfExists(); } @Override Loading Loading @@ -646,7 +646,7 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo clearFocus(); if (mFolderIcon != null) { mFolderIcon.setVisibility(View.VISIBLE); mFolderIcon.setBackgroundVisible(true); mFolderIcon.setIconVisible(true); mFolderIcon.mFolderName.setTextVisibility(true); if (wasAnimated) { mFolderIcon.animateBgShadowAndStroke(); Loading src/com/android/launcher3/folder/FolderIcon.java +20 −3 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ import com.android.launcher3.dragndrop.DragView; import com.android.launcher3.icons.DotRenderer; import com.android.launcher3.touch.ItemClickHandler; import com.android.launcher3.util.Thunk; import com.android.launcher3.views.IconLabelDotView; import com.android.launcher3.widget.PendingAddShortcutInfo; import java.util.ArrayList; Loading @@ -73,7 +74,7 @@ import java.util.List; /** * An icon that can appear on in the workspace representing an {@link Folder}. */ public class FolderIcon extends FrameLayout implements FolderListener { public class FolderIcon extends FrameLayout implements FolderListener, IconLabelDotView { @Thunk Launcher mLauncher; @Thunk Folder mFolder; Loading Loading @@ -107,6 +108,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { private Alarm mOpenAlarm = new Alarm(); private boolean mForceHideDot; @ViewDebug.ExportedProperty(category = "launcher", deepExport = true) private FolderDotInfo mDotInfo = new FolderDotInfo(); private DotRenderer mDotRenderer; Loading Loading @@ -409,6 +411,20 @@ public class FolderIcon extends FrameLayout implements FolderListener { return mPreviewLayoutRule; } @Override public void setForceHideDot(boolean forceHideDot) { if (mForceHideDot == forceHideDot) { return; } mForceHideDot = forceHideDot; if (forceHideDot) { invalidate(); } else if (hasDot()) { animateDotScale(0, 1); } } /** * Sets mDotScale to 1 or 0, animating if wasDotted or isDotted is false * (the dot is being added or removed). Loading Loading @@ -468,7 +484,8 @@ public class FolderIcon extends FrameLayout implements FolderListener { mBackground.setInvalidateDelegate(this); } public void setBackgroundVisible(boolean visible) { @Override public void setIconVisible(boolean visible) { mBackgroundIsVisible = visible; invalidate(); } Loading Loading @@ -509,7 +526,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { } public void drawDot(Canvas canvas) { if ((mDotInfo != null && mDotInfo.hasDot()) || mDotScale > 0) { if (!mForceHideDot && ((mDotInfo != null && mDotInfo.hasDot()) || mDotScale > 0)) { Rect iconBounds = mDotParams.iconBounds; BubbleTextView.getIconBounds(this, iconBounds, mLauncher.getWallpaperDeviceProfile().iconSizePx); Loading Loading
quickstep/recents_ui_overrides/src/com/android/quickstep/util/StaggeredWorkspaceAnim.java +43 −12 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.view.ViewGroup; import androidx.annotation.Nullable; import com.android.launcher3.BubbleTextView; import com.android.launcher3.CellLayout; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; Loading @@ -40,7 +41,9 @@ import com.android.launcher3.Workspace; import com.android.launcher3.anim.AnimatorSetBuilder; import com.android.launcher3.anim.PropertySetter; import com.android.launcher3.anim.SpringObjectAnimator; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.OverviewScrim; import com.android.launcher3.views.IconLabelDotView; import java.util.ArrayList; import java.util.List; Loading @@ -62,7 +65,9 @@ public class StaggeredWorkspaceAnim { private final float mVelocity; private final float mSpringTransY; private final View mViewToIgnore; // The original view of the {@link FloatingIconView}. private final View mOriginalView; private final List<Animator> mAnimators = new ArrayList<>(); Loading @@ -72,9 +77,7 @@ public class StaggeredWorkspaceAnim { public StaggeredWorkspaceAnim(Launcher launcher, @Nullable View floatingViewOriginalView, float velocity) { mVelocity = velocity; // We ignore this view since it's visibility and position is controlled by // the FloatingIconView. mViewToIgnore = floatingViewOriginalView; mOriginalView = floatingViewOriginalView; // Scale the translationY based on the initial velocity to better sync the workspace items // with the floating view. Loading @@ -86,16 +89,21 @@ public class StaggeredWorkspaceAnim { Workspace workspace = launcher.getWorkspace(); CellLayout cellLayout = (CellLayout) workspace.getChildAt(workspace.getCurrentPage()); ShortcutAndWidgetContainer currentPage = cellLayout.getShortcutsAndWidgets(); ViewGroup hotseat = launcher.getHotseat(); boolean workspaceClipChildren = workspace.getClipChildren(); boolean workspaceClipToPadding = workspace.getClipToPadding(); boolean cellLayoutClipChildren = cellLayout.getClipChildren(); boolean cellLayoutClipToPadding = cellLayout.getClipToPadding(); boolean hotseatClipChildren = hotseat.getClipChildren(); boolean hotseatClipToPadding = hotseat.getClipToPadding(); workspace.setClipChildren(false); workspace.setClipToPadding(false); cellLayout.setClipChildren(false); cellLayout.setClipToPadding(false); hotseat.setClipChildren(false); hotseat.setClipToPadding(false); // Hotseat and QSB takes up two additional rows. int totalRows = grid.inv.numRows + (grid.isVerticalBarLayout() ? 0 : 2); Loading @@ -108,16 +116,18 @@ public class StaggeredWorkspaceAnim { } // Set up springs for the hotseat and qsb. ViewGroup hotseatChild = (ViewGroup) hotseat.getChildAt(0); if (grid.isVerticalBarLayout()) { ViewGroup hotseat = (ViewGroup) launcher.getHotseat().getChildAt(0); for (int i = hotseat.getChildCount() - 1; i >= 0; i--) { View child = hotseat.getChildAt(i); for (int i = hotseatChild.getChildCount() - 1; i >= 0; i--) { View child = hotseatChild.getChildAt(i); CellLayout.LayoutParams lp = ((CellLayout.LayoutParams) child.getLayoutParams()); addStaggeredAnimationForView(child, lp.cellY + 1, totalRows); } } else { View hotseat = launcher.getHotseat().getChildAt(0); addStaggeredAnimationForView(hotseat, grid.inv.numRows + 1, totalRows); for (int i = hotseatChild.getChildCount() - 1; i >= 0; i--) { View child = hotseatChild.getChildAt(i); addStaggeredAnimationForView(child, grid.inv.numRows + 1, totalRows); } View qsb = launcher.findViewById(R.id.search_container_all_apps); addStaggeredAnimationForView(qsb, grid.inv.numRows + 2, totalRows); Loading @@ -140,6 +150,8 @@ public class StaggeredWorkspaceAnim { workspace.setClipToPadding(workspaceClipToPadding); cellLayout.setClipChildren(cellLayoutClipChildren); cellLayout.setClipToPadding(cellLayoutClipToPadding); hotseat.setClipChildren(hotseatClipChildren); hotseat.setClipToPadding(hotseatClipToPadding); } }; Loading Loading @@ -180,16 +192,35 @@ public class StaggeredWorkspaceAnim { springTransY.setStartDelay(startDelay); mAnimators.add(springTransY); if (v == mViewToIgnore) { ObjectAnimator alpha = getAlphaAnimator(v, startDelay); if (v == mOriginalView) { // For IconLabelDotViews, we just want the label to fade in. // Icon, badge, and dots will animate in separately (controlled via FloatingIconView) if (v instanceof IconLabelDotView) { alpha.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { IconLabelDotView view = (IconLabelDotView) v; view.setIconVisible(false); view.setForceHideDot(true); } }); } else { return; } } v.setAlpha(0); mAnimators.add(alpha); } private ObjectAnimator getAlphaAnimator(View v, long startDelay) { ObjectAnimator alpha = ObjectAnimator.ofFloat(v, View.ALPHA, 0f, 1f); alpha.setInterpolator(LINEAR); alpha.setDuration(ALPHA_DURATION_MS); alpha.setStartDelay(startDelay); mAnimators.add(alpha); return alpha; } private void addScrimAnimationForState(Launcher launcher, LauncherState state, long duration) { Loading
src/com/android/launcher3/BubbleTextView.java +6 −4 Original line number Diff line number Diff line Loading @@ -32,7 +32,6 @@ import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.text.TextUtils.TruncateAt; import android.util.AttributeSet; import android.util.Log; import android.util.Property; import android.util.TypedValue; import android.view.KeyEvent; Loading @@ -54,8 +53,8 @@ import com.android.launcher3.icons.DotRenderer; import com.android.launcher3.icons.IconCache.IconLoadRequest; import com.android.launcher3.icons.IconCache.ItemInfoUpdateReceiver; import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.testing.TestProtocol; import com.android.launcher3.views.ActivityContext; import com.android.launcher3.views.IconLabelDotView; import java.text.NumberFormat; Loading @@ -64,7 +63,8 @@ import java.text.NumberFormat; * because we want to make the bubble taller than the text and TextView's clip is * too aggressive. */ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, OnResumeCallback { public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, OnResumeCallback, IconLabelDotView { private static final int DISPLAY_WORKSPACE = 0; private static final int DISPLAY_ALL_APPS = 1; Loading Loading @@ -413,7 +413,8 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, } } public void forceHideDot(boolean forceHideDot) { @Override public void setForceHideDot(boolean forceHideDot) { if (mForceHideDot == forceHideDot) { return; } Loading Loading @@ -602,6 +603,7 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, } } @Override public void setIconVisible(boolean visible) { mIsIconVisible = visible; Drawable icon = visible ? mIcon : new ColorDrawable(Color.TRANSPARENT); Loading
src/com/android/launcher3/FastBitmapDrawable.java +5 −2 Original line number Diff line number Diff line Loading @@ -142,8 +142,11 @@ public class FastBitmapDrawable extends Drawable { @Override public void setAlpha(int alpha) { if (mAlpha != alpha) { mAlpha = alpha; mPaint.setAlpha(alpha); invalidateSelf(); } } @Override Loading
src/com/android/launcher3/folder/Folder.java +2 −2 Original line number Diff line number Diff line Loading @@ -516,7 +516,7 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { mFolderIcon.setBackgroundVisible(false); mFolderIcon.setIconVisible(false); mFolderIcon.drawLeaveBehindIfExists(); } @Override Loading Loading @@ -646,7 +646,7 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo clearFocus(); if (mFolderIcon != null) { mFolderIcon.setVisibility(View.VISIBLE); mFolderIcon.setBackgroundVisible(true); mFolderIcon.setIconVisible(true); mFolderIcon.mFolderName.setTextVisibility(true); if (wasAnimated) { mFolderIcon.animateBgShadowAndStroke(); Loading
src/com/android/launcher3/folder/FolderIcon.java +20 −3 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ import com.android.launcher3.dragndrop.DragView; import com.android.launcher3.icons.DotRenderer; import com.android.launcher3.touch.ItemClickHandler; import com.android.launcher3.util.Thunk; import com.android.launcher3.views.IconLabelDotView; import com.android.launcher3.widget.PendingAddShortcutInfo; import java.util.ArrayList; Loading @@ -73,7 +74,7 @@ import java.util.List; /** * An icon that can appear on in the workspace representing an {@link Folder}. */ public class FolderIcon extends FrameLayout implements FolderListener { public class FolderIcon extends FrameLayout implements FolderListener, IconLabelDotView { @Thunk Launcher mLauncher; @Thunk Folder mFolder; Loading Loading @@ -107,6 +108,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { private Alarm mOpenAlarm = new Alarm(); private boolean mForceHideDot; @ViewDebug.ExportedProperty(category = "launcher", deepExport = true) private FolderDotInfo mDotInfo = new FolderDotInfo(); private DotRenderer mDotRenderer; Loading Loading @@ -409,6 +411,20 @@ public class FolderIcon extends FrameLayout implements FolderListener { return mPreviewLayoutRule; } @Override public void setForceHideDot(boolean forceHideDot) { if (mForceHideDot == forceHideDot) { return; } mForceHideDot = forceHideDot; if (forceHideDot) { invalidate(); } else if (hasDot()) { animateDotScale(0, 1); } } /** * Sets mDotScale to 1 or 0, animating if wasDotted or isDotted is false * (the dot is being added or removed). Loading Loading @@ -468,7 +484,8 @@ public class FolderIcon extends FrameLayout implements FolderListener { mBackground.setInvalidateDelegate(this); } public void setBackgroundVisible(boolean visible) { @Override public void setIconVisible(boolean visible) { mBackgroundIsVisible = visible; invalidate(); } Loading Loading @@ -509,7 +526,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { } public void drawDot(Canvas canvas) { if ((mDotInfo != null && mDotInfo.hasDot()) || mDotScale > 0) { if (!mForceHideDot && ((mDotInfo != null && mDotInfo.hasDot()) || mDotScale > 0)) { Rect iconBounds = mDotParams.iconBounds; BubbleTextView.getIconBounds(this, iconBounds, mLauncher.getWallpaperDeviceProfile().iconSizePx); Loading