3131import android .graphics .PixelFormat ;
3232import android .graphics .Rect ;
3333import android .graphics .drawable .Drawable ;
34+ import android .os .Build .VERSION ;
35+ import android .os .Build .VERSION_CODES ;
3436import android .os .Parcel ;
3537import android .os .Parcelable ;
3638import android .util .AttributeSet ;
6466import java .lang .annotation .RetentionPolicy ;
6567import java .lang .ref .WeakReference ;
6668import java .text .NumberFormat ;
69+ import java .util .Locale ;
6770
6871/**
6972 * {@code BadgeDrawable} contains all the layout and draw logic for a badge.
@@ -210,6 +213,7 @@ public static final class SavedState implements Parcelable {
210213 @ StringRes private int contentDescriptionExceedsMaxBadgeNumberRes ;
211214 @ BadgeGravity private int badgeGravity ;
212215 private boolean isVisible ;
216+ private Locale numberLocale ;
213217
214218 @ Dimension (unit = Dimension .PX )
215219 private int horizontalOffsetWithoutText ;
@@ -241,6 +245,10 @@ public SavedState(@NonNull Context context) {
241245 contentDescriptionExceedsMaxBadgeNumberRes =
242246 R .string .mtrl_exceed_max_badge_number_content_description ;
243247 isVisible = true ;
248+ numberLocale =
249+ VERSION .SDK_INT >= VERSION_CODES .N
250+ ? Locale .getDefault (Locale .Category .FORMAT )
251+ : Locale .getDefault ();
244252 }
245253
246254 protected SavedState (@ NonNull Parcel in ) {
@@ -259,6 +267,7 @@ protected SavedState(@NonNull Parcel in) {
259267 additionalHorizontalOffset = in .readInt ();
260268 additionalVerticalOffset = in .readInt ();
261269 isVisible = in .readInt () != 0 ;
270+ numberLocale = (Locale ) in .readSerializable ();
262271 }
263272
264273 public static final Creator <SavedState > CREATOR =
@@ -298,6 +307,7 @@ public void writeToParcel(@NonNull Parcel dest, int flags) {
298307 dest .writeInt (additionalHorizontalOffset );
299308 dest .writeInt (additionalVerticalOffset );
300309 dest .writeInt (isVisible ? 1 : 0 );
310+ dest .writeSerializable (numberLocale );
301311 }
302312 }
303313
@@ -371,6 +381,7 @@ public void setVisible(boolean visible) {
371381
372382 private void restoreFromSavedState (@ NonNull SavedState savedState ) {
373383 setMaxCharacterCount (savedState .maxCharacterCount );
384+ setBadgeNumberLocale (savedState .numberLocale );
374385
375386 // Only set the badge number if it exists in the style.
376387 // Defaulting it to 0 means the badge will incorrectly show text when the user may want a
@@ -647,6 +658,20 @@ public void setBadgeTextColor(@ColorInt int badgeTextColor) {
647658 }
648659 }
649660
661+ /** Returns the {@link Locale} used to show badge numbers. */
662+ @ NonNull
663+ public Locale getBadgeNumberLocale () {
664+ return savedState .numberLocale ;
665+ }
666+
667+ /** Sets the {@link Locale} used to show badge numbers. */
668+ public void setBadgeNumberLocale (@ NonNull Locale locale ) {
669+ if (!locale .equals (savedState .numberLocale )) {
670+ savedState .numberLocale = locale ;
671+ invalidateSelf ();
672+ }
673+ }
674+
650675 /** Returns whether this badge will display a number. */
651676 public boolean hasNumber () {
652677 return savedState .number != BADGE_NUMBER_NONE ;
@@ -1137,15 +1162,16 @@ private void drawText(Canvas canvas) {
11371162 private String getBadgeText () {
11381163 // If number exceeds max count, show badgeMaxCount+ instead of the number.
11391164 if (getNumber () <= maxBadgeNumber ) {
1140- return NumberFormat .getInstance ().format (getNumber ());
1165+ return NumberFormat .getInstance (savedState . numberLocale ).format (getNumber ());
11411166 } else {
11421167 Context context = contextRef .get ();
11431168 if (context == null ) {
11441169 return "" ;
11451170 }
11461171
1147- return context .getString (
1148- R .string .mtrl_exceed_max_badge_number_suffix ,
1172+ return String .format (
1173+ savedState .numberLocale ,
1174+ context .getString (R .string .mtrl_exceed_max_badge_number_suffix ),
11491175 maxBadgeNumber ,
11501176 DEFAULT_EXCEED_MAX_BADGE_NUMBER_SUFFIX );
11511177 }
0 commit comments