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

Commit 759d038a authored by Lucas Dupin's avatar Lucas Dupin Committed by Android (Google) Code Review
Browse files

Merge "Dual tone shade implementation" into sc-dev

parents 563dcd5c 8bec3cf0
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
@@ -718,6 +718,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
@@ -2002,11 +2002,23 @@ 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);
        mDepthController.setQsPanelExpansion(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