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

Commit 3d104e21 authored by Jordan Demeulenaere's avatar Jordan Demeulenaere Committed by Android (Google) Code Review
Browse files

Merge "Animate notification corner radius when it is expanding." into sc-dev

parents 7dfa3fce 4c157edf
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
@@ -346,6 +346,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
@@ -2009,6 +2012,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;
@@ -2053,6 +2074,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;
        }