summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Michal Brzezinski <brzezinski@google.com> 2024-04-18 11:47:37 +0100
committer Michal Brzezinski <brzezinski@google.com> 2024-04-18 11:58:28 +0100
commit76ca5b9d43e7071d024c9e091c99b06a69a6fc75 (patch)
tree871743bdf4b81a43434ab30acbb97f12fcd147b2
parent1742bc0f97c6cd41163a98a7b40f5cdf94c715fe (diff)
Fixing radius of notification focus overlay
Focus overlay doesn't fully cover corners of notification background it's is peeking from beneath. It's caused by using stroke instead of filling with color - notification background drawable is layer drawable with all shapes being the same but when shape (as Path object) is drawn using stroke, stroke is centered on the path. That means drawable is bigger by stroke width / 2 and when it's fitted inside NotificationBackgroundView it needs to be scaled down. That changes radius shape and radius needs to be decreased to account for that. Fixes: 329250144 Flag: None Test: focus on notification and see notification background corners are not going outside of focus overaly Change-Id: Ib8948bc9559bf2598af63185bcd14f073e39bfa7
-rw-r--r--packages/SystemUI/res/drawable/notification_material_bg.xml5
-rw-r--r--packages/SystemUI/res/values/dimens.xml3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java25
3 files changed, 27 insertions, 6 deletions
diff --git a/packages/SystemUI/res/drawable/notification_material_bg.xml b/packages/SystemUI/res/drawable/notification_material_bg.xml
index 587a5a05458f..715be074eaa8 100644
--- a/packages/SystemUI/res/drawable/notification_material_bg.xml
+++ b/packages/SystemUI/res/drawable/notification_material_bg.xml
@@ -28,9 +28,10 @@
<solid android:color="@color/notification_state_color_default" />
</shape>
</item>
- <item>
+ <item android:id="@+id/notification_focus_overlay">
<shape>
- <stroke android:width="3dp" android:color="@color/notification_focus_overlay_color"/>
+ <stroke android:width="@dimen/notification_focus_stroke_width"
+ android:color="@color/notification_focus_overlay_color"/>
</shape>
</item>
</layer-list> \ No newline at end of file
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 26fa2b136ed4..07604d5d0ebd 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -310,6 +310,9 @@
<!-- Radius for notifications corners without adjacent notifications -->
<dimen name="notification_corner_radius">28dp</dimen>
+ <!-- Stroke width for notifications focus state overlay, see id/notification_focus_outline -->
+ <dimen name="notification_focus_stroke_width">3dp</dimen>
+
<!-- Distance over which notification corner animations run, near the shelf while scrolling. -->
<dimen name="notification_corner_animation_distance">48dp</dimen>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java
index ed3a38d3305b..d0db5145e0ff 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java
@@ -53,6 +53,8 @@ public class NotificationBackgroundView extends View implements Dumpable {
private int mTintColor;
@Nullable private Integer mRippleColor;
private final float[] mCornerRadii = new float[8];
+ private final float[] mFocusOverlayCornerRadii = new float[8];
+ private float mFocusOverlayStroke = 0;
private boolean mBottomIsRounded;
private boolean mBottomAmountClips = true;
private int mActualHeight = -1;
@@ -74,6 +76,7 @@ public class NotificationBackgroundView extends View implements Dumpable {
R.color.notification_state_color_dark);
mNormalColor = Utils.getColorAttrDefaultColor(mContext,
com.android.internal.R.attr.materialColorSurfaceContainerHigh);
+ mFocusOverlayStroke = getResources().getDimension(R.dimen.notification_focus_stroke_width);
}
@Override
@@ -290,14 +293,28 @@ public class NotificationBackgroundView extends View implements Dumpable {
if (mDontModifyCorners) {
return;
}
- if (mBackground instanceof LayerDrawable) {
- int numberOfLayers = ((LayerDrawable) mBackground).getNumberOfLayers();
+ if (mBackground instanceof LayerDrawable layerDrawable) {
+ int numberOfLayers = layerDrawable.getNumberOfLayers();
for (int i = 0; i < numberOfLayers; i++) {
- GradientDrawable gradientDrawable =
- (GradientDrawable) ((LayerDrawable) mBackground).getDrawable(i);
+ GradientDrawable gradientDrawable = (GradientDrawable) layerDrawable.getDrawable(i);
gradientDrawable.setCornerRadii(mCornerRadii);
}
+ updateFocusOverlayRadii(layerDrawable);
+ }
+ }
+
+ private void updateFocusOverlayRadii(LayerDrawable background) {
+ GradientDrawable overlay =
+ (GradientDrawable) background.findDrawableByLayerId(
+ R.id.notification_focus_overlay);
+ for (int i = 0; i < mCornerRadii.length; i++) {
+ // in theory subtracting mFocusOverlayStroke/2 should be enough but notification
+ // background is still peeking a bit from below - probably due to antialiasing or
+ // overlay uneven scaling. So let's subtract full mFocusOverlayStroke to make sure the
+ // radius is a bit smaller and covers background corners fully
+ mFocusOverlayCornerRadii[i] = Math.max(0, mCornerRadii[i] - mFocusOverlayStroke);
}
+ overlay.setCornerRadii(mFocusOverlayCornerRadii);
}
/** Set the current expand animation size. */