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

Commit 4c157edf authored by Jordan Demeulenaere's avatar Jordan Demeulenaere
Browse files

Animate notification corner radius when it is expanding.

This CL animates the notification corner radius when the notification is
expanding, from its initial radius up to the final window corner radius.

See b/181654098#comment5 for before/after videos.

Bug: 181654098
Test: Manual
Change-Id: I2b4889f3c811f27166e405248c512052d145922d
parent 8eecb94a
Loading
Loading
Loading
Loading
+24 −8
Original line number Diff line number Diff line
@@ -146,17 +146,19 @@ public class ActivityLaunchAnimator {
        private final ExpandableNotificationRow mSourceNotification;
        private final ExpandAnimationParameters mParams;
        private final Rect mWindowCrop = new Rect();
        private final float mNotificationCornerRadius;
        private float mCornerRadius;
        private boolean mIsFullScreenLaunch = true;
        private final SyncRtSurfaceTransactionApplier mSyncRtTransactionApplier;

        public AnimationRunner(ExpandableNotificationRow sourceNofitication) {
            mSourceNotification = sourceNofitication;
        private final float mNotificationStartTopCornerRadius;
        private final float mNotificationStartBottomCornerRadius;

        AnimationRunner(ExpandableNotificationRow sourceNotification) {
            mSourceNotification = sourceNotification;
            mParams = new ExpandAnimationParameters();
            mSyncRtTransactionApplier = new SyncRtSurfaceTransactionApplier(mSourceNotification);
            mNotificationCornerRadius = Math.max(mSourceNotification.getCurrentTopRoundness(),
                    mSourceNotification.getCurrentBottomRoundness());
            mNotificationStartTopCornerRadius = mSourceNotification.getCurrentBackgroundRadiusTop();
            mNotificationStartBottomCornerRadius =
                    mSourceNotification.getCurrentBackgroundRadiusBottom();
        }

        @Override
@@ -224,7 +226,10 @@ public class ActivityLaunchAnimator {
                                        + notificationHeight,
                                primary.position.y + primary.sourceContainerBounds.bottom,
                                progress);
                        mCornerRadius = MathUtils.lerp(mNotificationCornerRadius,
                        mParams.topCornerRadius = MathUtils.lerp(mNotificationStartTopCornerRadius,
                                mWindowCornerRadius, progress);
                        mParams.bottomCornerRadius = MathUtils.lerp(
                                mNotificationStartBottomCornerRadius,
                                mWindowCornerRadius, progress);
                        applyParamsToWindow(primary);
                        applyParamsToNotification(mParams);
@@ -309,12 +314,13 @@ public class ActivityLaunchAnimator {
            Matrix m = new Matrix();
            m.postTranslate(0, (float) (mParams.top - app.position.y));
            mWindowCrop.set(mParams.left, 0, mParams.right, mParams.getHeight());
            float cornerRadius = Math.min(mParams.topCornerRadius, mParams.bottomCornerRadius);
            SurfaceParams params = new SurfaceParams.Builder(app.leash)
                    .withAlpha(1f)
                    .withMatrix(m)
                    .withWindowCrop(mWindowCrop)
                    .withLayer(app.prefixOrderIndex)
                    .withCornerRadius(mCornerRadius)
                    .withCornerRadius(cornerRadius)
                    .withVisibility(true)
                    .build();
            mSyncRtTransactionApplier.scheduleApply(params);
@@ -339,6 +345,8 @@ public class ActivityLaunchAnimator {
        int bottom;
        int startClipTopAmount;
        int parentStartClipTopAmount;
        float topCornerRadius;
        float bottomCornerRadius;

        public ExpandAnimationParameters() {
        }
@@ -389,6 +397,14 @@ public class ActivityLaunchAnimator {
        public float getStartTranslationZ() {
            return startTranslationZ;
        }

        public float getTopCornerRadius() {
            return topCornerRadius;
        }

        public float getBottomCornerRadius() {
            return bottomCornerRadius;
        }
    }

    public interface Callback {
+2 −2
Original line number Diff line number Diff line
@@ -883,8 +883,8 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
    }

    private void applyBackgroundRoundness(float topRadius, float bottomRadius) {
        mBackgroundDimmed.setRoundness(topRadius, bottomRadius);
        mBackgroundNormal.setRoundness(topRadius, bottomRadius);
        mBackgroundDimmed.setRadius(topRadius, bottomRadius);
        mBackgroundNormal.setRadius(topRadius, bottomRadius);
    }

    @Override
+25 −0
Original line number Diff line number Diff line
@@ -347,6 +347,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
    private SystemNotificationAsyncTask mSystemNotificationAsyncTask =
            new SystemNotificationAsyncTask();

    private float mTopRoundnessDuringExpandAnimation;
    private float mBottomRoundnessDuringExpandAnimation;

    /**
     * Returns whether the given {@code statusBarNotification} is a system notification.
     * <b>Note</b>, this should be run in the background thread if possible as it makes multiple IPC
@@ -2012,6 +2015,24 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
        return false;
    }

    @Override
    public float getCurrentTopRoundness() {
        if (mExpandAnimationRunning) {
            return mTopRoundnessDuringExpandAnimation;
        }

        return super.getCurrentTopRoundness();
    }

    @Override
    public float getCurrentBottomRoundness() {
        if (mExpandAnimationRunning) {
            return mBottomRoundnessDuringExpandAnimation;
        }

        return super.getCurrentBottomRoundness();
    }

    public void applyExpandAnimationParams(ExpandAnimationParameters params) {
        if (params == null) {
            return;
@@ -2052,6 +2073,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
        setTranslationY(top);
        setActualHeight(params.getHeight());

        mTopRoundnessDuringExpandAnimation = params.getTopCornerRadius() / mOutlineRadius;
        mBottomRoundnessDuringExpandAnimation = params.getBottomCornerRadius() / mOutlineRadius;
        invalidateOutline();

        mBackgroundNormal.setExpandAnimationParams(params);
    }

+11 −10
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ import android.util.AttributeSet;
import android.view.View;
import android.view.ViewOutlineProvider;

import com.android.settingslib.Utils;
import com.android.systemui.R;
import com.android.systemui.statusbar.notification.AnimatableProperty;
import com.android.systemui.statusbar.notification.PropertyAnimator;
@@ -83,8 +82,8 @@ public abstract class ExpandableOutlineView extends ExpandableView {
    private final ViewOutlineProvider mProvider = new ViewOutlineProvider() {
        @Override
        public void getOutline(View view, Outline outline) {
            if (!mCustomOutline && mCurrentTopRoundness == 0.0f
                    && mCurrentBottomRoundness == 0.0f && !mAlwaysRoundBothCorners
            if (!mCustomOutline && getCurrentTopRoundness() == 0.0f
                    && getCurrentBottomRoundness() == 0.0f && !mAlwaysRoundBothCorners
                    && !mTopAmountRounded) {
                int translation = mShouldTranslateContents ? (int) getTranslation() : 0;
                int left = Math.max(translation, 0);
@@ -135,10 +134,12 @@ public abstract class ExpandableOutlineView extends ExpandableView {
                ? mOutlineRadius : getCurrentBackgroundRadiusBottom();
        if (topRoundness + bottomRoundness > height) {
            float overShoot = topRoundness + bottomRoundness - height;
            topRoundness -= overShoot * mCurrentTopRoundness
                    / (mCurrentTopRoundness + mCurrentBottomRoundness);
            bottomRoundness -= overShoot * mCurrentBottomRoundness
                    / (mCurrentTopRoundness + mCurrentBottomRoundness);
            float currentTopRoundness = getCurrentTopRoundness();
            float currentBottomRoundness = getCurrentBottomRoundness();
            topRoundness -= overShoot * currentTopRoundness
                    / (currentTopRoundness + currentBottomRoundness);
            bottomRoundness -= overShoot * currentBottomRoundness
                    / (currentTopRoundness + currentBottomRoundness);
        }
        getRoundedRectPath(left, top, right, bottom, topRoundness, bottomRoundness, mTmpPath);
        return mTmpPath;
@@ -267,7 +268,7 @@ public abstract class ExpandableOutlineView extends ExpandableView {
        if (mTopAmountRounded) {
            return mOutlineRadius;
        }
        return mCurrentTopRoundness * mOutlineRadius;
        return getCurrentTopRoundness() * mOutlineRadius;
    }

    public float getCurrentTopRoundness() {
@@ -278,8 +279,8 @@ public abstract class ExpandableOutlineView extends ExpandableView {
        return mCurrentBottomRoundness;
    }

    protected float getCurrentBackgroundRadiusBottom() {
        return mCurrentBottomRoundness * mOutlineRadius;
    public float getCurrentBackgroundRadiusBottom() {
        return getCurrentBottomRoundness() * mOutlineRadius;
    }

    @Override
+2 −3
Original line number Diff line number Diff line
@@ -224,10 +224,9 @@ public class NotificationBackgroundView extends View {
    }

    /**
     * Sets the current top and bottom roundness amounts for this background, between 0.0 (not
     * rounded) and 1.0 (maximally rounded).
     * Sets the current top and bottom radius for this background.
     */
    public void setRoundness(float topRoundness, float bottomRoundness) {
    public void setRadius(float topRoundness, float bottomRoundness) {
        if (topRoundness == mCornerRadii[0] && bottomRoundness == mCornerRadii[4]) {
            return;
        }