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

Commit 11b47c54 authored by Jon Miranda's avatar Jon Miranda
Browse files

Crop taskbar icons during stash/unstash animation.

When we stash, we crop the taskbar icons to the height of the
stashed handle.

In a follow up CL we will translate the icons so that at the
end of the stash animation, the icons will overlap with the
stashed handle for a more seamless handoff.

This will be good to get in first so that we can see if there is
any performance regression by running multiple outline
animations at the same time.

Test: stash/unstash observe cropping
Bug: 267806083
Change-Id: I19b05647a669c11376ac1d3267fd600131246be8
parent 7b7130db
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -596,6 +596,10 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
            }
            }
        }
        }


        if (DisplayController.isTransientTaskbar(mActivity)) {
            fullLengthAnimatorSet.play(mControllers.taskbarViewController
                    .createRevealAnimToIsStashed(isStashed));
        }
        fullLengthAnimatorSet.play(mControllers.stashedHandleViewController
        fullLengthAnimatorSet.play(mControllers.stashedHandleViewController
                .createRevealAnimToIsStashed(isStashed));
                .createRevealAnimToIsStashed(isStashed));
        // Return the stashed handle to its default scale in case it was changed as part of the
        // Return the stashed handle to its default scale in case it was changed as part of the
+41 −0
Original line number Original line Diff line number Diff line
@@ -27,6 +27,8 @@ import static com.android.launcher3.taskbar.TaskbarManager.isPhoneMode;
import static com.android.launcher3.touch.SingleAxisSwipeDetector.DIRECTION_NEGATIVE;
import static com.android.launcher3.touch.SingleAxisSwipeDetector.DIRECTION_NEGATIVE;
import static com.android.launcher3.touch.SingleAxisSwipeDetector.VERTICAL;
import static com.android.launcher3.touch.SingleAxisSwipeDetector.VERTICAL;


import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
import android.annotation.NonNull;
import android.annotation.NonNull;
import android.graphics.Rect;
import android.graphics.Rect;
import android.util.FloatProperty;
import android.util.FloatProperty;
@@ -49,6 +51,8 @@ import com.android.launcher3.anim.AnimatedFloat;
import com.android.launcher3.anim.AnimatorPlaybackController;
import com.android.launcher3.anim.AnimatorPlaybackController;
import com.android.launcher3.anim.Interpolators;
import com.android.launcher3.anim.Interpolators;
import com.android.launcher3.anim.PendingAnimation;
import com.android.launcher3.anim.PendingAnimation;
import com.android.launcher3.anim.RevealOutlineAnimation;
import com.android.launcher3.anim.RoundedRectRevealOutlineProvider;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.folder.FolderIcon;
import com.android.launcher3.folder.FolderIcon;
import com.android.launcher3.icons.ThemedIconDrawable;
import com.android.launcher3.icons.ThemedIconDrawable;
@@ -95,6 +99,7 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar
    private float mTaskbarIconTranslationYForSwipe;
    private float mTaskbarIconTranslationYForSwipe;


    private final int mTaskbarBottomMargin;
    private final int mTaskbarBottomMargin;
    private final int mStashedHandleHeight;


    private final AnimatedFloat mThemeIconsBackground = new AnimatedFloat(
    private final AnimatedFloat mThemeIconsBackground = new AnimatedFloat(
            this::updateIconsBackground);
            this::updateIconsBackground);
@@ -127,6 +132,8 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar
        mTaskbarBottomMargin = DisplayController.isTransientTaskbar(activity)
        mTaskbarBottomMargin = DisplayController.isTransientTaskbar(activity)
                ? activity.getResources().getDimensionPixelSize(R.dimen.transient_taskbar_margin)
                ? activity.getResources().getDimensionPixelSize(R.dimen.transient_taskbar_margin)
                : 0;
                : 0;
        mStashedHandleHeight = activity.getResources()
                .getDimensionPixelSize(R.dimen.taskbar_stashed_handle_height);


        if (DisplayController.isTransientTaskbar(mActivity)) {
        if (DisplayController.isTransientTaskbar(mActivity)) {
            mSwipeDownDetector = new SingleAxisSwipeDetector(activity,
            mSwipeDownDetector = new SingleAxisSwipeDetector(activity,
@@ -280,6 +287,40 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar
                ));
                ));
    }
    }


    private ValueAnimator createRevealAnimForView(View view, boolean isStashed) {
        Rect viewBounds = new Rect(0, 0, view.getWidth(), view.getHeight());
        int centerY = viewBounds.centerY();
        int halfHandleHeight = mStashedHandleHeight / 2;

        Rect stashedRect = new Rect(viewBounds.left,
                centerY - halfHandleHeight,
                viewBounds.right,
                centerY + halfHandleHeight);

        float radius = 0;
        float stashedRadius = viewBounds.width() / 2f;

        return new RoundedRectRevealOutlineProvider(radius, stashedRadius, viewBounds, stashedRect)
                .createRevealAnimator(view, !isStashed, 0);
    }

    /**
     * Creates and returns a {@link RevealOutlineAnimation} Animator that updates the icon shape
     * and size.
     * @param isStashed When true, the icon crops vertically to the size of the stashed handle.
     *                  When false, the reverse happens.
     */
    public AnimatorSet createRevealAnimToIsStashed(boolean isStashed) {
        AnimatorSet as = new AnimatorSet();
        for (int i = mTaskbarView.getChildCount() - 1; i >= 0; i--) {
            View child = mTaskbarView.getChildAt(i);
            if (child instanceof BubbleTextView) {
                as.play(createRevealAnimForView(child, isStashed));
            }
        }
        return as;
    }

    /**
    /**
     * Sets the taskbar icon alignment relative to Launcher hotseat icons
     * Sets the taskbar icon alignment relative to Launcher hotseat icons
     * @param alignmentRatio [0, 1]
     * @param alignmentRatio [0, 1]