Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18c69140 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Update app open/close animations." into ub-launcher3-master

parents c04780c1 dff0de47
Loading
Loading
Loading
Loading
+43 −12
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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<>();

@@ -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.
@@ -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);
@@ -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);
@@ -140,6 +150,8 @@ public class StaggeredWorkspaceAnim {
                workspace.setClipToPadding(workspaceClipToPadding);
                cellLayout.setClipChildren(cellLayoutClipChildren);
                cellLayout.setClipToPadding(cellLayoutClipToPadding);
                hotseat.setClipChildren(hotseatClipChildren);
                hotseat.setClipToPadding(hotseatClipToPadding);
            }
        };

@@ -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) {
+6 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -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;
@@ -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;
        }
@@ -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);
+5 −2
Original line number Diff line number Diff line
@@ -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
+2 −2
Original line number Diff line number Diff line
@@ -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
@@ -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();
+20 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -405,6 +407,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).
@@ -464,7 +480,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();
    }
@@ -504,7 +521,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