diff --git a/res/values/strings.xml b/res/values/strings.xml
index 028ac796e9e..358b5c9dcf1 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7820,14 +7820,14 @@
Automatically caption media
-
- None
-
-
-
- - 1 schedule set
- - %d schedules set
-
+
+
+ {count, plural,
+ =0 {None}
+ =1 {1 schedule set}
+ other {# schedules set}
+ }
+
Do Not Disturb
@@ -8000,12 +8000,6 @@
On / %1$s
-
- Off / %1$s
-
-
- Off
-
On
@@ -8016,19 +8010,29 @@
Until you turn off
-
- - 1 hour
- - %d hours
-
+
+ {count, plural,
+ =1 {1 hour}
+ other {# hours}
+ }
+
- %d minutes
+
+ {count, plural,
+ =1 {1 minute}
+ other {# minutes}
+ }
+
-
-
- - 1 schedule can turn on automatically
- - %d schedules can turn on automatically
-
+
+
+ {count, plural,
+ =0 {Off}
+ =1 {Off / 1 schedule can turn on automatically}
+ other {Off / # schedules can turn on automatically}
+ }
+
What can interrupt Do Not Disturb
@@ -9027,12 +9031,14 @@
All conversations
Priority conversations
None
-
- - 1 conversation
- - %d conversations
-
-
- None
+
+
+ {count, plural,
+ =0 {None}
+ =1 {1 conversation}
+ other {# conversations}
+ }
+
Who can interrupt
@@ -9053,12 +9059,15 @@
Starred contacts
-
- - 1 other
- - %d others
-
-
- None
+
+ {count, plural, offset:2
+ =0 {None}
+ =1 {{contact_1}}
+ =2 {{contact_1} and {contact_2}}
+ =3 {{contact_1}, {contact_2}, and {contact_3}}
+ other {{contact_1}, {contact_2}, and # others}
+ }
+
Messages
@@ -9077,15 +9086,14 @@
All messages can reach you
All calls can reach you
-
-
- None
-
- - 1 contact
- - %d contacts
-
-
+
+ {count, plural,
+ =0 {None}
+ =1 {1 contact}
+ other {# contacts}
+ }
+
Anyone
@@ -9170,14 +9178,16 @@
Some notifications
Selected people can still reach you, even if you don\u2019t allow apps to interrupt
-
-
- - %s can interrupt
- - %s can interrupt
-
-
- %d more
+
+
+ {count, plural, offset:2
+ =0 {No apps can interrupt}
+ =1 {{app_1} can interrupt}
+ =2 {{app_1} and {app_2} can interrupt}
+ =3 {{app_1}, {app_2}, and {app_3} can interrupt}
+ other {{app_1}, {app_2}, and # more can interrupt}
+ }
+
Apps
@@ -9190,18 +9200,18 @@
toggle title -->
Allow all notifications
-
-
- - %s can interrupt
- - %s can interrupt
-
-
- Nothing can interrupt
-
- %d more
-
+
+
+ {count, plural, offset:2
+ =0 {Nothing can interrupt}
+ =1 {{sound_category_1} can interrupt}
+ =2 {{sound_category_1} and {sound_category_2} can interrupt}
+ =3 {{sound_category_1}, {sound_category_2}, and {sound_category_3} can interrupt}
+ other {{sound_category_1}, {sound_category_2}, and # more can interrupt}
+ }
+
+
+ Nothing can interrupt
No one can interrupt
diff --git a/src/com/android/settings/notification/zen/ZenModeBackend.java b/src/com/android/settings/notification/zen/ZenModeBackend.java
index 2f6a2b1b52e..1d41bb979a4 100644
--- a/src/com/android/settings/notification/zen/ZenModeBackend.java
+++ b/src/com/android/settings/notification/zen/ZenModeBackend.java
@@ -26,7 +26,7 @@ import android.app.AutomaticZenRule;
import android.app.NotificationManager;
import android.content.Context;
import android.database.Cursor;
-import android.icu.text.ListFormatter;
+import android.icu.text.MessageFormat;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.Settings;
@@ -41,7 +41,9 @@ import com.android.settings.R;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
+import java.util.HashMap;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
public class ZenModeBackend {
@@ -468,37 +470,30 @@ public class ZenModeBackend {
String getStarredContactsSummary(Context context) {
List starredContacts = getStarredContacts();
int numStarredContacts = starredContacts.size();
-
- List displayContacts = new ArrayList<>();
-
- if (numStarredContacts == 0) {
- displayContacts.add(context.getString(R.string.zen_mode_starred_contacts_summary_none));
- } else {
- for (int i = 0; i < 2 && i < numStarredContacts; i++) {
- displayContacts.add(starredContacts.get(i));
- }
-
- if (numStarredContacts == 3) {
- displayContacts.add(starredContacts.get(2));
- } else if (numStarredContacts > 2) {
- displayContacts.add(context.getResources().getQuantityString(
- R.plurals.zen_mode_starred_contacts_summary_additional_contacts,
- numStarredContacts - 2, numStarredContacts - 2));
+ MessageFormat msgFormat = new MessageFormat(
+ mContext.getString(R.string.zen_mode_starred_contacts_summary_contacts),
+ Locale.getDefault());
+ Map args = new HashMap<>();
+ args.put("count", numStarredContacts);
+ if (numStarredContacts >= 1) {
+ args.put("contact_1", starredContacts.get(0));
+ if (numStarredContacts >= 2) {
+ args.put("contact_2", starredContacts.get(1));
+ if (numStarredContacts == 3) {
+ args.put("contact_3", starredContacts.get(2));
+ }
}
}
-
- // values in displayContacts must not be null
- return ListFormatter.getInstance().format(displayContacts);
+ return msgFormat.format(args);
}
String getContactsNumberSummary(Context context) {
- final int numContacts = queryAllContactsData().getCount();
- if (numContacts == 0) {
- return context.getResources().getString(
- R.string.zen_mode_contacts_count_none);
- }
- return context.getResources().getQuantityString(R.plurals.zen_mode_contacts_count,
- numContacts, numContacts);
+ MessageFormat msgFormat = new MessageFormat(
+ mContext.getString(R.string.zen_mode_contacts_count),
+ Locale.getDefault());
+ Map args = new HashMap<>();
+ args.put("count", queryAllContactsData().getCount());
+ return msgFormat.format(args);
}
private Cursor queryStarredContactsData() {
diff --git a/src/com/android/settings/notification/zen/ZenModeBypassingAppsPreferenceController.java b/src/com/android/settings/notification/zen/ZenModeBypassingAppsPreferenceController.java
index d088c0a4291..8d2ae4838fd 100644
--- a/src/com/android/settings/notification/zen/ZenModeBypassingAppsPreferenceController.java
+++ b/src/com/android/settings/notification/zen/ZenModeBypassingAppsPreferenceController.java
@@ -3,7 +3,7 @@ package com.android.settings.notification.zen;
import android.app.Application;
import android.app.NotificationChannel;
import android.content.Context;
-import android.icu.text.ListFormatter;
+import android.icu.text.MessageFormat;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.ArraySet;
@@ -21,7 +21,10 @@ import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.core.lifecycle.Lifecycle;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Locale;
+import java.util.Map;
import java.util.Set;
/**
@@ -119,29 +122,23 @@ public class ZenModeBypassingAppsPreferenceController extends AbstractZenModePre
}
final int numAppsBypassingDnd = appsBypassingDnd.size();
- if (numAppsBypassingDnd == 0) {
- mSummary = mContext.getResources().getString(
- R.string.zen_mode_bypassing_apps_subtext_none);
- refreshSummary(mPreference);
- return;
+ String[] appsBypassingDndArr = appsBypassingDnd.toArray(new String[numAppsBypassingDnd]);
+ MessageFormat msgFormat = new MessageFormat(
+ mContext.getString(R.string.zen_mode_bypassing_apps_subtext),
+ Locale.getDefault());
+ Map args = new HashMap<>();
+ args.put("count", numAppsBypassingDnd);
+ if (numAppsBypassingDnd >= 1) {
+ args.put("app_1", appsBypassingDndArr[0]);
+ if (numAppsBypassingDnd >= 2) {
+ args.put("app_2", appsBypassingDndArr[1]);
+ if (numAppsBypassingDnd == 3) {
+ args.put("app_3", appsBypassingDndArr[2]);
+ }
+ }
}
- List displayAppsBypassing = new ArrayList<>();
- if (numAppsBypassingDnd <= 2) {
- displayAppsBypassing.addAll(appsBypassingDnd);
- } else {
- String[] appsBypassingDndArr =
- appsBypassingDnd.toArray(new String[numAppsBypassingDnd]);
- displayAppsBypassing.add(appsBypassingDndArr[0]);
- displayAppsBypassing.add(appsBypassingDndArr[1]);
- displayAppsBypassing.add(mContext.getResources().getString(
- R.string.zen_mode_apps_bypassing_list_count,
- numAppsBypassingDnd - 2));
- }
- mSummary = mContext.getResources().getQuantityString(
- R.plurals.zen_mode_bypassing_apps_subtext,
- numAppsBypassingDnd,
- ListFormatter.getInstance().format(displayAppsBypassing));
+ mSummary = msgFormat.format(args);
refreshSummary(mPreference);
}
diff --git a/src/com/android/settings/notification/zen/ZenModeDurationPreferenceController.java b/src/com/android/settings/notification/zen/ZenModeDurationPreferenceController.java
index f5d21a2edc7..938796b7f79 100644
--- a/src/com/android/settings/notification/zen/ZenModeDurationPreferenceController.java
+++ b/src/com/android/settings/notification/zen/ZenModeDurationPreferenceController.java
@@ -17,11 +17,16 @@
package com.android.settings.notification.zen;
import android.content.Context;
+import android.icu.text.MessageFormat;
import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.lifecycle.Lifecycle;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
public class ZenModeDurationPreferenceController extends AbstractZenModePreferenceController
implements PreferenceControllerMixin {
@@ -51,12 +56,19 @@ public class ZenModeDurationPreferenceController extends AbstractZenModePreferen
summary = mContext.getString(R.string.zen_mode_duration_summary_forever);
} else {
if (zenDuration >= 60) {
- int hours = zenDuration / 60;
- summary = mContext.getResources().getQuantityString(
- R.plurals.zen_mode_duration_summary_time_hours, hours, hours);
+ MessageFormat msgFormat = new MessageFormat(
+ mContext.getString(R.string.zen_mode_duration_summary_time_hours),
+ Locale.getDefault());
+ Map msgArgs = new HashMap<>();
+ msgArgs.put("count", zenDuration / 60);
+ summary = msgFormat.format(msgArgs);
} else {
- summary = mContext.getResources().getString(
- R.string.zen_mode_duration_summary_time_minutes, zenDuration);
+ MessageFormat msgFormat = new MessageFormat(
+ mContext.getString(R.string.zen_mode_duration_summary_time_minutes),
+ Locale.getDefault());
+ Map msgArgs = new HashMap<>();
+ msgArgs.put("count", zenDuration);
+ summary = msgFormat.format(msgArgs);
}
}
diff --git a/src/com/android/settings/notification/zen/ZenModePriorityConversationsPreferenceController.java b/src/com/android/settings/notification/zen/ZenModePriorityConversationsPreferenceController.java
index 4ae16bcec9a..e77f4eac2ac 100644
--- a/src/com/android/settings/notification/zen/ZenModePriorityConversationsPreferenceController.java
+++ b/src/com/android/settings/notification/zen/ZenModePriorityConversationsPreferenceController.java
@@ -23,6 +23,7 @@ import android.app.NotificationManager;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.pm.ParceledListSlice;
+import android.icu.text.MessageFormat;
import android.os.AsyncTask;
import android.service.notification.ConversationChannelWrapper;
import android.view.View;
@@ -41,7 +42,10 @@ import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.widget.RadioButtonPreference;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Locale;
+import java.util.Map;
/**
* Options to choose the priority conversations that are allowed to bypass DND.
@@ -130,12 +134,13 @@ public class ZenModePriorityConversationsPreferenceController
if (numConversations == UNSET) {
return null;
- } else if (numConversations == 0) {
- return mContext.getResources().getString(
- R.string.zen_mode_conversations_count_none);
} else {
- return mContext.getResources().getQuantityString(
- R.plurals.zen_mode_conversations_count, numConversations, numConversations);
+ MessageFormat msgFormat = new MessageFormat(
+ mContext.getString(R.string.zen_mode_conversations_count),
+ Locale.getDefault());
+ Map args = new HashMap<>();
+ args.put("count", numConversations);
+ return msgFormat.format(args);
}
}
diff --git a/src/com/android/settings/notification/zen/ZenModeSettings.java b/src/com/android/settings/notification/zen/ZenModeSettings.java
index 436a3990801..2cc4f8b35e8 100644
--- a/src/com/android/settings/notification/zen/ZenModeSettings.java
+++ b/src/com/android/settings/notification/zen/ZenModeSettings.java
@@ -32,7 +32,7 @@ import android.app.NotificationManager;
import android.app.NotificationManager.Policy;
import android.app.settings.SettingsEnums;
import android.content.Context;
-import android.icu.text.ListFormatter;
+import android.icu.text.MessageFormat;
import android.provider.Settings;
import android.service.notification.ZenModeConfig;
@@ -47,7 +47,9 @@ import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Predicate;
@@ -130,24 +132,21 @@ public class ZenModeSettings extends ZenModeSettingsBase {
|| PRIORITY_CATEGORY_EVENTS == category,
true);
int numCategories = enabledCategories.size();
- if (numCategories == 0) {
- return mContext.getResources().getString(R.string.zen_mode_other_sounds_none);
+ MessageFormat msgFormat = new MessageFormat(
+ mContext.getString(R.string.zen_mode_other_sounds_summary),
+ Locale.getDefault());
+ Map args = new HashMap<>();
+ args.put("count", numCategories);
+ if (numCategories >= 1) {
+ args.put("sound_category_1", enabledCategories.get(0));
+ if (numCategories >= 2) {
+ args.put("sound_category_2", enabledCategories.get(1));
+ if (numCategories == 3) {
+ args.put("sound_category_3", enabledCategories.get(2));
+ }
+ }
}
-
- List displayCategories = new ArrayList<>();
- if (numCategories <= 2) {
- displayCategories = enabledCategories;
- } else {
- displayCategories.add(enabledCategories.get(0));
- displayCategories.add(enabledCategories.get(1));
- displayCategories.add(mContext.getString(R.string.zen_mode_other_sounds_list_count,
- numCategories - 2));
- }
-
- return mContext.getResources().getQuantityString(
- R.plurals.zen_mode_other_sounds_summary,
- numCategories /* quantity */,
- ListFormatter.getInstance().format(displayCategories));
+ return msgFormat.format(args);
}
String getCallsSettingSummary(Policy policy) {
@@ -192,15 +191,12 @@ public class ZenModeSettings extends ZenModeSettingsBase {
description);
}
} else {
- final int count = getEnabledAutomaticRulesCount();
- if (count > 0) {
- return mContext.getString(R.string.zen_mode_sound_summary_off_with_info,
- mContext.getResources().getQuantityString(
- R.plurals.zen_mode_sound_summary_summary_off_info,
- count, count));
- }
-
- return mContext.getString(R.string.zen_mode_sound_summary_off);
+ MessageFormat msgFormat = new MessageFormat(
+ mContext.getString(R.string.zen_mode_sound_summary_off),
+ Locale.getDefault());
+ Map msgArgs = new HashMap<>();
+ msgArgs.put("count", getEnabledAutomaticRulesCount());
+ return msgFormat.format(msgArgs);
}
}
@@ -218,10 +214,12 @@ public class ZenModeSettings extends ZenModeSettingsBase {
}
String getAutomaticRulesSummary() {
- final int count = getEnabledAutomaticRulesCount();
- return count == 0 ? mContext.getString(R.string.zen_mode_settings_summary_off)
- : mContext.getResources().getQuantityString(
- R.plurals.zen_mode_settings_summary_on, count, count);
+ MessageFormat msgFormat = new MessageFormat(
+ mContext.getString(R.string.zen_mode_settings_schedules_summary),
+ Locale.getDefault());
+ Map msgArgs = new HashMap<>();
+ msgArgs.put("count", getEnabledAutomaticRulesCount());
+ return msgFormat.format(msgArgs);
}
@VisibleForTesting
diff --git a/src/com/android/settings/notification/zen/ZenModeSoundVibrationPreferenceController.java b/src/com/android/settings/notification/zen/ZenModeSoundVibrationPreferenceController.java
index 691c2aede69..1ceb35781d9 100644
--- a/src/com/android/settings/notification/zen/ZenModeSoundVibrationPreferenceController.java
+++ b/src/com/android/settings/notification/zen/ZenModeSoundVibrationPreferenceController.java
@@ -58,7 +58,7 @@ public class ZenModeSoundVibrationPreferenceController extends
switch (getZenMode()) {
case Settings.Global.ZEN_MODE_NO_INTERRUPTIONS:
preference.setEnabled(false);
- preference.setSummary(mContext.getString(R.string.zen_mode_other_sounds_none));
+ preference.setSummary(mContext.getString(R.string.zen_mode_sounds_none));
break;
case Settings.Global.ZEN_MODE_ALARMS:
preference.setEnabled(false);
diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenModeDurationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenModeDurationPreferenceControllerTest.java
index a8e583fcaf6..11e85481ff6 100644
--- a/tests/robotests/src/com/android/settings/notification/zen/ZenModeDurationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/zen/ZenModeDurationPreferenceControllerTest.java
@@ -90,7 +90,6 @@ public class ZenModeDurationPreferenceControllerTest {
Settings.Secure.putInt(mContentResolver, Settings.Secure.ZEN_DURATION,
zenDuration);
- assertEquals(mContext.getString(R.string.zen_mode_duration_summary_time_minutes,
- zenDuration), mController.getSummary());
+ assertEquals("45 minutes", mController.getSummary());
}
}
diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenModePreferenceControllerTest.java
index ef2040610f4..c2abbcdfb40 100644
--- a/tests/robotests/src/com/android/settings/notification/zen/ZenModePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/zen/ZenModePreferenceControllerTest.java
@@ -33,10 +33,6 @@ import android.content.Context;
import androidx.preference.Preference;
-import com.android.settings.R;
-import com.android.settings.notification.zen.ZenModePreferenceController;
-import com.android.settings.notification.zen.ZenModeSettings;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -85,7 +81,7 @@ public class ZenModePreferenceControllerTest {
when(mPreference.isEnabled()).thenReturn(true);
mController.updateState(mPreference);
- verify(mPreference).setSummary(mContext.getString(R.string.zen_mode_sound_summary_off));
+ verify(mPreference).setSummary("Off");
doReturn(1).when(mSummaryBuilder).getEnabledAutomaticRulesCount();
mController.updateState(mPreference);