Skip to content

Commit a0d0b53

Browse files
imhappipekingme
authored andcommitted
[Badge] Add getters/setters for vertical and horizontal badge padding
PiperOrigin-RevId: 520969935
1 parent d722a78 commit a0d0b53

File tree

5 files changed

+114
-24
lines changed

5 files changed

+114
-24
lines changed

docs/components/BadgeDrawable.md

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -90,18 +90,20 @@ center, use `setHorizontalOffset(int)` or `setVerticalOffset(int)`
9090

9191
### `BadgeDrawable` Attributes
9292

93-
| Feature | Relevant attributes |
94-
| --------------------- | -----------------------------------------------------------------------------------------------------------------|
95-
| Color | `app:backgroundColor` <br> `app:badgeTextColor` |
96-
| Width | `app:badgeWidth` <br> `app:badgeWithTextWidth` |
97-
| Height | `app:badgeHeight` <br> `app:badgeWithTextHeight` |
98-
| Shape | `app:badgeShapeAppearance` <br> `app:badgeShapeAppearanceOverlay` <br> `app:badgeWithTextShapeAppearance` <br> `app:badgeWithTextShapeAppearanceOverlay` |
99-
| Label | `app:badgeText` (for text) <br> `app:number` (for numbers) |
100-
| Label Length | `app:maxCharacterCount` |
101-
| Label Text Color | `app:badgeTextColor` |
102-
| Label Text Appearance | `app:badgeTextAppearance` |
103-
| Badge Gravity | `app:badgeGravity` |
104-
| Offset Alignment | `app:offsetAlignmentMode` |
93+
| Feature | Relevant attributes |
94+
|-----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------|
95+
| Color | `app:backgroundColor` <br> `app:badgeTextColor` |
96+
| Width | `app:badgeWidth` <br> `app:badgeWithTextWidth` |
97+
| Height | `app:badgeHeight` <br> `app:badgeWithTextHeight` |
98+
| Shape | `app:badgeShapeAppearance` <br> `app:badgeShapeAppearanceOverlay` <br> `app:badgeWithTextShapeAppearance` <br> `app:badgeWithTextShapeAppearanceOverlay` |
99+
| Label | `app:badgeText` (for text) <br> `app:number` (for numbers) |
100+
| Label Length | `app:maxCharacterCount` |
101+
| Label Text Color | `app:badgeTextColor` |
102+
| Label Text Appearance | `app:badgeTextAppearance` |
103+
| Badge Gravity | `app:badgeGravity` |
104+
| Offset Alignment | `app:offsetAlignmentMode` |
105+
| Horizontal Padding | `app:badgeWidePadding` |
106+
| Vertical Padding | `app:badgeVerticalPadding` |
105107

106108
**Note:** If both `app:badgeText` and `app:number` are specified, the badge label will be `app:badgeText`.
107109

lib/java/com/google/android/material/badge/BadgeDrawable.java

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -783,6 +783,48 @@ private CharSequence getEmptyContentDescription() {
783783
return state.getContentDescriptionNumberless();
784784
}
785785

786+
/**
787+
* Sets how much (in pixels) horizontal padding to add to the badge when it has label contents.
788+
* Note that badges have a minimum width as specified by
789+
* com.google.android.material.R.styleable#Badge_badgeWidth.
790+
*
791+
* @param horizontalPadding badge's horizontal padding
792+
* @attr ref com.google.android.material.R.styleable#Badge_badgeWidePadding
793+
*/
794+
public void setHorizontalPadding(@Px int horizontalPadding) {
795+
if (horizontalPadding != state.getBadgeHorizontalPadding()) {
796+
state.setBadgeHorizontalPadding(horizontalPadding);
797+
updateCenterAndBounds();
798+
}
799+
}
800+
801+
/** Returns the badge horizontal padding in pixels. */
802+
@Px
803+
public int getHorizontalPadding() {
804+
return state.getBadgeHorizontalPadding();
805+
}
806+
807+
/**
808+
* Sets how much (in pixels) vertical padding to add to the badge when it has label contents. Note
809+
* that badges have a minimum height as specified by
810+
* com.google.android.material.R.styleable#Badge_badgeHeight.
811+
*
812+
* @param verticalPadding badge's vertical padding
813+
* @attr ref com.google.android.material.R.styleable#Badge_badgeVerticalPadding
814+
*/
815+
public void setVerticalPadding(@Px int verticalPadding) {
816+
if (verticalPadding != state.getBadgeVerticalPadding()) {
817+
state.setBadgeVerticalPadding(verticalPadding);
818+
updateCenterAndBounds();
819+
}
820+
}
821+
822+
/** Returns the badge vertical padding in pixels. */
823+
@Px
824+
public int getVerticalPadding() {
825+
return state.getBadgeVerticalPadding();
826+
}
827+
786828
/**
787829
* Sets how much (in pixels) to horizontally move this badge towards the center of its anchor.
788830
*
@@ -1106,7 +1148,8 @@ private void calculateCenterAndBounds(@NonNull Rect anchorRect, @NonNull View an
11061148
halfBadgeHeight =
11071149
Math.max(
11081150
halfBadgeHeight,
1109-
textDrawableHelper.getTextHeight(badgeContent) / 2f + state.badgeVerticalPadding);
1151+
textDrawableHelper.getTextHeight(badgeContent) / 2f
1152+
+ state.getBadgeVerticalPadding());
11101153

11111154
// If the badge has text, it should at least have the same width as it does height
11121155
halfBadgeWidth = Math.max(halfBadgeWidth, halfBadgeHeight);
@@ -1119,7 +1162,8 @@ private void calculateCenterAndBounds(@NonNull Rect anchorRect, @NonNull View an
11191162
halfBadgeWidth =
11201163
Math.max(
11211164
halfBadgeWidth,
1122-
textDrawableHelper.getTextWidth(badgeContent) / 2f + state.badgeWidePadding);
1165+
textDrawableHelper.getTextWidth(badgeContent) / 2f
1166+
+ state.getBadgeHorizontalPadding());
11231167
}
11241168

11251169
int totalVerticalOffset = getTotalVerticalOffsetForState();

lib/java/com/google/android/material/badge/BadgeState.java

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import androidx.annotation.NonNull;
3838
import androidx.annotation.Nullable;
3939
import androidx.annotation.PluralsRes;
40+
import androidx.annotation.Px;
4041
import androidx.annotation.RestrictTo;
4142
import androidx.annotation.StringRes;
4243
import androidx.annotation.StyleRes;
@@ -76,8 +77,6 @@ public final class BadgeState {
7677
final float badgeHeight;
7778
final float badgeWithTextWidth;
7879
final float badgeWithTextHeight;
79-
final float badgeWidePadding;
80-
final float badgeVerticalPadding;
8180
final int horizontalInset;
8281
final int horizontalInsetWithText;
8382

@@ -102,14 +101,7 @@ public final class BadgeState {
102101
Resources res = context.getResources();
103102
badgeRadius =
104103
a.getDimensionPixelSize(R.styleable.Badge_badgeRadius, BADGE_RADIUS_NOT_SPECIFIED);
105-
badgeWidePadding =
106-
a.getDimensionPixelSize(
107-
R.styleable.Badge_badgeWidePadding,
108-
res.getDimensionPixelSize(R.dimen.mtrl_badge_long_text_horizontal_padding));
109-
badgeVerticalPadding =
110-
a.getDimension(
111-
R.styleable.Badge_badgeVerticalPadding,
112-
res.getDimension(R.dimen.m3_badge_with_text_vertical_padding));
104+
113105
horizontalInset =
114106
context
115107
.getResources()
@@ -236,6 +228,19 @@ public final class BadgeState {
236228
? a.getInt(R.styleable.Badge_badgeGravity, TOP_END)
237229
: storedState.badgeGravity;
238230

231+
currentState.badgeHorizontalPadding =
232+
storedState.badgeHorizontalPadding == null
233+
? a.getDimensionPixelSize(
234+
R.styleable.Badge_badgeWidePadding,
235+
res.getDimensionPixelSize(R.dimen.mtrl_badge_long_text_horizontal_padding))
236+
: storedState.badgeHorizontalPadding;
237+
currentState.badgeVerticalPadding =
238+
storedState.badgeVerticalPadding == null
239+
? a.getDimensionPixelSize(
240+
R.styleable.Badge_badgeVerticalPadding,
241+
res.getDimensionPixelSize(R.dimen.m3_badge_with_text_vertical_padding))
242+
: storedState.badgeVerticalPadding;
243+
239244
currentState.horizontalOffsetWithoutText =
240245
storedState.horizontalOffsetWithoutText == null
241246
? a.getDimensionPixelOffset(R.styleable.Badge_horizontalOffset, 0)
@@ -442,6 +447,26 @@ void setBadgeGravity(@BadgeGravity int badgeGravity) {
442447
currentState.badgeGravity = badgeGravity;
443448
}
444449

450+
@Px
451+
int getBadgeHorizontalPadding() {
452+
return currentState.badgeHorizontalPadding;
453+
}
454+
455+
void setBadgeHorizontalPadding(@Px int horizontalPadding) {
456+
overridingState.badgeHorizontalPadding = horizontalPadding;
457+
currentState.badgeHorizontalPadding = horizontalPadding;
458+
}
459+
460+
@Px
461+
int getBadgeVerticalPadding() {
462+
return currentState.badgeVerticalPadding;
463+
}
464+
465+
void setBadgeVerticalPadding(@Px int verticalPadding) {
466+
overridingState.badgeVerticalPadding = verticalPadding;
467+
currentState.badgeVerticalPadding = verticalPadding;
468+
}
469+
445470
@Dimension(unit = Dimension.PX)
446471
int getHorizontalOffsetWithoutText() {
447472
return currentState.horizontalOffsetWithoutText;
@@ -591,6 +616,10 @@ public static final class State implements Parcelable {
591616
@BadgeGravity private Integer badgeGravity;
592617
private Boolean isVisible = true;
593618

619+
@Px private Integer badgeHorizontalPadding;
620+
621+
@Px private Integer badgeVerticalPadding;
622+
594623
@Dimension(unit = Dimension.PX)
595624
private Integer horizontalOffsetWithoutText;
596625

@@ -628,6 +657,8 @@ public State() {}
628657
contentDescriptionNumberless = in.readString();
629658
contentDescriptionQuantityStrings = in.readInt();
630659
badgeGravity = (Integer) in.readSerializable();
660+
badgeHorizontalPadding = (Integer) in.readSerializable();
661+
badgeVerticalPadding = (Integer) in.readSerializable();
631662
horizontalOffsetWithoutText = (Integer) in.readSerializable();
632663
verticalOffsetWithoutText = (Integer) in.readSerializable();
633664
horizontalOffsetWithText = (Integer) in.readSerializable();
@@ -678,6 +709,8 @@ public void writeToParcel(@NonNull Parcel dest, int flags) {
678709
contentDescriptionNumberless != null ? contentDescriptionNumberless.toString() : null);
679710
dest.writeInt(contentDescriptionQuantityStrings);
680711
dest.writeSerializable(badgeGravity);
712+
dest.writeSerializable(badgeHorizontalPadding);
713+
dest.writeSerializable(badgeVerticalPadding);
681714
dest.writeSerializable(horizontalOffsetWithoutText);
682715
dest.writeSerializable(verticalOffsetWithoutText);
683716
dest.writeSerializable(horizontalOffsetWithText);

lib/java/com/google/android/material/badge/res-public/values/public.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
<public name="badgeText" type="attr"/>
2424
<public name="number" type="attr"/>
2525
<public name="badgeGravity" type="attr"/>
26+
<public name="badgeWidePadding" type="attr"/>
27+
<public name="badgeVerticalPadding" type="attr"/>
2628
<public name="horizontalOffset" type="attr"/>
2729
<public name="verticalOffset" type="attr"/>
2830
<public name="offsetAlignmentMode" type="attr"/>

lib/javatests/com/google/android/material/badge/BadgeDrawableTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ public class BadgeDrawableTest {
5050
private static final int TEST_BADGE_HORIZONTAL_OFFSET = 10;
5151
private static final int TEST_BADGE_VERTICAL_OFFSET = 5;
5252

53+
private static final int TEST_BADGE_HORIZONTAL_PADDING = 10;
54+
private static final int TEST_BADGE_VERTICAL_PADDING = 10;
55+
5356
private final Context context = ApplicationProvider.getApplicationContext();
5457

5558
@Before
@@ -70,6 +73,9 @@ public void testSavedState() {
7073
badgeDrawable.setNumber(TEST_BADGE_NUMBER);
7174
badgeDrawable.setBadgeGravity(BadgeDrawable.TOP_START);
7275

76+
badgeDrawable.setHorizontalPadding(TEST_BADGE_HORIZONTAL_PADDING);
77+
badgeDrawable.setVerticalPadding(TEST_BADGE_VERTICAL_PADDING);
78+
7379
badgeDrawable.setHorizontalOffset(TEST_BADGE_HORIZONTAL_OFFSET);
7480
badgeDrawable.setVerticalOffset(TEST_BADGE_VERTICAL_OFFSET);
7581

@@ -104,6 +110,9 @@ public void testSavedState() {
104110
assertThat(restoredBadgeDrawable.getAlpha()).isEqualTo(255);
105111
assertThat(restoredBadgeDrawable.getMaxCharacterCount()).isEqualTo(4);
106112
assertThat(restoredBadgeDrawable.getBadgeGravity()).isEqualTo(BadgeDrawable.TOP_START);
113+
// badge padding
114+
assertThat(restoredBadgeDrawable.getHorizontalPadding()).isEqualTo(TEST_BADGE_HORIZONTAL_PADDING);
115+
assertThat(restoredBadgeDrawable.getVerticalPadding()).isEqualTo(TEST_BADGE_VERTICAL_PADDING);
107116
// badge offsets
108117
assertThat(restoredBadgeDrawable.getHorizontalOffset()).isEqualTo(TEST_BADGE_HORIZONTAL_OFFSET);
109118
assertThat(restoredBadgeDrawable.getVerticalOffset()).isEqualTo(TEST_BADGE_VERTICAL_OFFSET);

0 commit comments

Comments
 (0)