From c549280a33a31c8471c2c955a2c929fb777df74e Mon Sep 17 00:00:00 2001 From: Beverly Date: Mon, 29 Jun 2020 13:43:24 -0400 Subject: [PATCH] Replace zen setting plurals with MessageFormat For better translations. See go/android-i18n-plurals. Test: manual Test: make RunSettingsRoboTests7 Fixes: 156651436 Change-Id: Ic82140b81bf49f071291d2824fa45d310de238ae --- res/values/strings.xml | 138 ++++++++++-------- .../notification/zen/ZenModeBackend.java | 49 +++---- ...ModeBypassingAppsPreferenceController.java | 41 +++--- .../ZenModeDurationPreferenceController.java | 22 ++- ...rityConversationsPreferenceController.java | 15 +- .../notification/zen/ZenModeSettings.java | 60 ++++---- ...odeSoundVibrationPreferenceController.java | 2 +- ...nModeDurationPreferenceControllerTest.java | 3 +- .../zen/ZenModePreferenceControllerTest.java | 6 +- 9 files changed, 174 insertions(+), 162 deletions(-) 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);