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

Commit 8bec3cf0 authored by Michal Brzezinski's avatar Michal Brzezinski
Browse files

Dual tone shade implementation

Splitting behindScrim into two separate scrims: qs and notificatins.
QsScrim role is solely to show dark background behind quick settings.
NotificationsScrim serves as past behindScrim, that is takes fullscreen
when on keyguard and draws notifications background.
Bottom of the quick settings panel determines where qsScrim ends and
notificationsScrim begins.

Fixes: 183953523
Test: atest ScrimControllerTest
Change-Id: I86897f23072281745cef23ef8eed51e06b21818b
parent b6521e0a
Loading
Loading
Loading
Loading
+58 −1
Original line number Diff line number Diff line
@@ -24,7 +24,9 @@ import android.annotation.Nullable;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.Xfermode;
import android.graphics.drawable.Drawable;
import android.view.animation.DecelerateInterpolator;
@@ -44,6 +46,9 @@ public class ScrimDrawable extends Drawable {
    private int mMainColor;
    private ValueAnimator mColorAnimation;
    private int mMainColorTo;
    private float mCornerRadius;
    private Rect mBounds;
    private ConcaveInfo mConcaveInfo;

    public ScrimDrawable() {
        mPaint = new Paint();
@@ -127,15 +132,67 @@ public class ScrimDrawable extends Drawable {
        return PixelFormat.TRANSLUCENT;
    }

    /**
     * Enable drawable shape to have rounded corners with provided radius
     */
    public void setRoundedCorners(float radius) {
        mCornerRadius = radius;
    }

    /**
     * Make bottom edge concave with provided corner radius
     */
    public void setBottomEdgeConcave(float radius) {
        // only rounding top corners for clip out path
        float[] cornerRadii = new float[]{radius, radius, radius, radius, 0, 0, 0, 0};
        mConcaveInfo = new ConcaveInfo(radius, cornerRadii);
    }

    @Override
    public void draw(@NonNull Canvas canvas) {
        mPaint.setColor(mMainColor);
        mPaint.setAlpha(mAlpha);
        canvas.drawRect(getBounds(), mPaint);
        if (mConcaveInfo != null) {
            drawConcave(canvas);
        }
        canvas.drawRoundRect(getBounds().left, getBounds().top, getBounds().right,
                getBounds().bottom + mCornerRadius,
                /* x radius*/ mCornerRadius, /* y radius*/ mCornerRadius, mPaint);
    }

    private void drawConcave(Canvas canvas) {
        // checking if width of clip out path needs to change
        if (mBounds == null
                || getBounds().right != mBounds.right
                || getBounds().left != mBounds.left) {
            mConcaveInfo.mPath.reset();
            float left = getBounds().left;
            float right = getBounds().right;
            float top = 0f;
            float bottom = mConcaveInfo.mPathOverlap;
            mConcaveInfo.mPath.addRoundRect(left, top, right, bottom,
                    mConcaveInfo.mCornerRadii, Path.Direction.CW);
        }
        mBounds = getBounds();
        int translation = (int) (mBounds.bottom - mConcaveInfo.mPathOverlap);
        canvas.translate(0, translation);
        canvas.clipOutPath(mConcaveInfo.mPath);
        canvas.translate(0, -translation);
    }

    @VisibleForTesting
    public int getMainColor() {
        return mMainColor;
    }

    private static class ConcaveInfo {
        private final float mPathOverlap;
        private final float[] mCornerRadii;
        private final Path mPath = new Path();

        ConcaveInfo(float pathOverlap, float[] cornerRadii) {
            mPathOverlap = pathOverlap;
            mCornerRadii = cornerRadii;
        }
    }
}
+8 −0
Original line number Diff line number Diff line
@@ -51,6 +51,14 @@
        sysui:ignoreRightInset="true"
        />

    <com.android.systemui.statusbar.ScrimView
        android:id="@+id/scrim_notifications"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:importantForAccessibility="no"
        sysui:ignoreRightInset="true"
        />

    <com.android.systemui.statusbar.LightRevealScrim
            android:id="@+id/light_reveal_scrim"
            android:layout_width="match_parent"
+1 −0
Original line number Diff line number Diff line
@@ -712,6 +712,7 @@
    <item name="keyguard_clock_line_spacing_scale_burmese" type="dimen" format="float">1</item>

    <item name="scrim_behind_alpha" format="float" type="dimen">0.62</item>
    <dimen name="notification_scrim_corner_radius">32dp</dimen>

    <!-- The minimum amount the user needs to swipe to go to the camera / phone. -->
    <dimen name="keyguard_min_swipe_amount">110dp</dimen>
+29 −1
Original line number Diff line number Diff line
@@ -26,17 +26,18 @@ import android.graphics.PorterDuff;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Looper;
import android.util.AttributeSet;
import android.view.View;

import androidx.annotation.DimenRes;
import androidx.core.graphics.ColorUtils;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.colorextraction.ColorExtractor;
import com.android.internal.colorextraction.drawable.ScrimDrawable;
import com.android.systemui.R;

import java.util.concurrent.Executor;

@@ -47,6 +48,10 @@ import java.util.concurrent.Executor;
 * need to be careful to synchronize when necessary.
 */
public class ScrimView extends View {

    @DimenRes
    private static final int CORNER_RADIUS = R.dimen.notification_scrim_corner_radius;

    private final Object mColorLock = new Object();

    @GuardedBy("mColorLock")
@@ -260,4 +265,27 @@ public class ScrimView extends View {
            mExecutor.execute(r);
        }
    }

    /**
     * Make bottom edge concave so overlap between layers is not visible for alphas between 0 and 1
     * @return height of concavity
     */
    public float enableBottomEdgeConcave() {
        if (mDrawable instanceof ScrimDrawable) {
            float radius = getResources().getDimensionPixelSize(CORNER_RADIUS);
            ((ScrimDrawable) mDrawable).setBottomEdgeConcave(radius);
            return radius;
        }
        return 0;
    }

    /**
     * Enable view to have rounded corners with radius of {@link #CORNER_RADIUS}
     */
    public void enableRoundedCorners() {
        if (mDrawable instanceof ScrimDrawable) {
            int radius = getResources().getDimensionPixelSize(CORNER_RADIUS);
            ((ScrimDrawable) mDrawable).setRoundedCorners(radius);
        }
    }
}
+13 −1
Original line number Diff line number Diff line
@@ -1991,10 +1991,22 @@ public class NotificationPanelViewController extends PanelViewController {
        float qsExpansionFraction = getQsExpansionFraction();
        mQs.setQsExpansion(qsExpansionFraction, getHeaderTranslation());
        mMediaHierarchyManager.setQsExpansion(qsExpansionFraction);
        mScrimController.setQsExpansion(qsExpansionFraction);
        mScrimController.setQsPosition(qsExpansionFraction,
                calculateQsBottomPosition(qsExpansionFraction));
        mNotificationStackScrollLayoutController.setQsExpansionFraction(qsExpansionFraction);
    }

    private int calculateQsBottomPosition(float qsExpansionFraction) {
        int qsBottomY = (int) getHeaderTranslation() + mQs.getQsMinExpansionHeight();
        if (qsExpansionFraction != 0.0) {
            qsBottomY = (int) MathUtils.lerp(
                    qsBottomY, mQs.getDesiredHeight(), qsExpansionFraction);
        }
        // to account for shade overshooting animation, see setSectionPadding method
        if (mSectionPadding > 0) qsBottomY += mSectionPadding;
        return qsBottomY;
    }

    private String determineAccessibilityPaneTitle() {
        if (mQs != null && mQs.isCustomizing()) {
            return mResources.getString(R.string.accessibility_desc_quick_settings_edit);
Loading