Loading core/java/com/android/internal/colorextraction/drawable/ScrimDrawable.java +58 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading Loading @@ -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; } } } packages/SystemUI/res/layout/super_notification_shade.xml +8 −0 Original line number Diff line number Diff line Loading @@ -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" Loading packages/SystemUI/res/values/dimens.xml +1 −0 Original line number Diff line number Diff line Loading @@ -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> Loading packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java +29 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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") Loading Loading @@ -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); } } } packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +13 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
core/java/com/android/internal/colorextraction/drawable/ScrimDrawable.java +58 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading Loading @@ -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; } } }
packages/SystemUI/res/layout/super_notification_shade.xml +8 −0 Original line number Diff line number Diff line Loading @@ -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" Loading
packages/SystemUI/res/values/dimens.xml +1 −0 Original line number Diff line number Diff line Loading @@ -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> Loading
packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java +29 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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") Loading Loading @@ -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); } } }
packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +13 −1 Original line number Diff line number Diff line Loading @@ -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