Merge "Cleanup plurals in Settings, change <one> to <1> in string res file."
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e51910d..33873ba 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -8042,15 +8042,15 @@
     <!-- [CHAR LIMIT=NONE] Zen mode summary spoken when changing mode by voice: switch to alarms only forever. -->
     <string name="zen_mode_summary_alarms_only_indefinite">Change to alarms only indefinitely</string>
     <!-- [CHAR LIMIT=NONE] Zen mode summary spoken when changing mode by voice: switch to alarms only for < 60 minutes. -->
-    <plurals name="zen_mode_summary_alarms_only_by_minute">
-        <item quantity="one">Change to alarms only for one minute until <xliff:g id="formattedTime" example="10:00 PM">%2$s</xliff:g></item>
-        <item quantity="other">Change to alarms only for <xliff:g id="duration" example="2">%1$d</xliff:g> minutes (until <xliff:g id="formattedTime" example="10:00 PM">%2$s</xliff:g>)</item>
-    </plurals>
+    <string name="zen_mode_summary_alarms_only_by_minute">{count, plural,
+      =1      {Change to alarms only for one minute until {time}}
+      other   {Change to alarms only for # minutes (until {time})}
+    }</string>
     <!-- [CHAR LIMIT=NONE] Zen mode summary spoken when changing mode by voice: switch to alarms only for N hours. -->
-    <plurals name="zen_mode_summary_alarms_only_by_hour">
-        <item quantity="one">Change to alarms only for one hour until <xliff:g id="formattedTime" example="10:00 PM">%2$s</xliff:g></item>
-        <item quantity="other">Change to alarms only for <xliff:g id="duration" example="2">%1$d</xliff:g> hours until <xliff:g id="formattedTime" example="10:00 PM">%2$s</xliff:g></item>
-    </plurals>
+    <string name="zen_mode_summary_alarms_only_by_hour">{count, plural,
+      =1      {Change to alarms only for one hour until {time}}
+      other   {Change to alarms only for # hours until {time}}
+    }</string>
     <!-- [CHAR LIMIT=NONE] Zen mode summary spoken when changing mode by voice: switch to alarms only until a specific time. -->
     <string name="zen_mode_summary_alarms_only_by_time">Change to alarms only until <xliff:g id="formattedTime" example="10:00 PM">%1$s</xliff:g></string>
     <!-- [CHAR LIMIT=NONE] Zen mode summary spoken when changing mode by voice: Turn on all notifications. -->
@@ -8241,14 +8241,14 @@
     <string name="app_launch_footer">An app can verify links to automatically open in the app.</string>
 
     <!-- Title, message and button for verified links dialog. -->
-    <plurals name="app_launch_verified_links_title">
-        <item quantity="one"><xliff:g id="count">%d</xliff:g> verified link</item>
-        <item quantity="other"><xliff:g id="count">%d</xliff:g> verified links</item>
-    </plurals>
-    <plurals name="app_launch_verified_links_message">
-        <item quantity="one">This link is verified and automatically opens in this app.</item>
-        <item quantity="other">These links are verified and automatically open in this app.</item>
-    </plurals>
+    <string name="app_launch_verified_links_title">{count, plural,
+      =1      {# verified link}
+      other   {# verified links}
+    }</string>
+    <string name="app_launch_verified_links_message">{count, plural,
+      =1      {This link is verified and automatically opens in this app.}
+      other   {These links are verified and automatically open in this app.}
+    }</string>
     <!-- OK button for verified links dialog. [CHAR LIMIT=20] -->
     <string name="app_launch_dialog_ok">OK</string>
     <!-- Info icon description of the verified links. [CHAR LIMIT=NONE] -->
@@ -8260,10 +8260,10 @@
     <string name="app_launch_dialog_cancel">Cancel</string>
 
     <!-- Title and button for supported links dialog. -->
-    <plurals name="app_launch_supported_links_title">
-        <item quantity="one"><xliff:g id="count">%d</xliff:g> supported link</item>
-        <item quantity="other"><xliff:g id="count">%d</xliff:g> supported links</item>
-    </plurals>
+    <string name="app_launch_supported_links_title">{count, plural,
+      =1      {# supported link}
+      other   {# supported links}
+    }</string>
     <!-- Add button for supported links dialog. [CHAR LIMIT=20] -->
     <string name="app_launch_supported_links_add">Add</string>
     <!-- The subtext of the link title in supported links dialog. [CHAR LIMIT=30] -->
@@ -8294,16 +8294,16 @@
     <string name="notifications_enabled_with_info"><xliff:g id="notifications_sent" example="~6 per week">%1$s</xliff:g> / <xliff:g id="notifications_categories_off" example="3 categories turned off">%2$s</xliff:g> </string>
 
     <!-- Permissions preference summary [CHAR LIMIT=40] -->
-    <plurals name="notifications_categories_off">
-        <item quantity="one"><xliff:g id="count" example="1">%d</xliff:g> category turned off</item>
-        <item quantity="other"><xliff:g id="count" example="10">%d</xliff:g> categories turned off</item>
-    </plurals>
+    <string name="notifications_categories_off">{count, plural,
+      =1      {# category turned off}
+      other   {# categories turned off}
+    }</string>
 
     <!-- Runtime permissions preference summary.  Number of additional permissions granted. [CHAR LIMIT=40] -->
-    <plurals name="runtime_permissions_additional_count">
-        <item quantity="one"><xliff:g id="count" example="1">%d</xliff:g> additional permission</item>
-        <item quantity="other"><xliff:g id="count" example="10">%d</xliff:g> additional permissions</item>
-    </plurals>
+    <string name="runtime_permissions_additional_count">{count, plural,
+      =1      {# additional permission}
+      other   {# additional permissions}
+    }</string>
 
     <!-- Runtime permissions preference summary, shown when the app has no permissions granted. [CHAR LIMIT=40] -->
     <string name="runtime_permissions_summary_no_permissions_granted">No permissions granted</string>
@@ -8324,10 +8324,10 @@
     <string name="unused_apps">Unused apps</string>
 
     <!-- Summary of number of apps that have not been used for months. [CHAR LIMIT=40]-->
-    <plurals name="unused_apps_summary">
-        <item quantity="one"><xliff:g id="count" example="1">%d</xliff:g> unused app</item>
-        <item quantity="other"><xliff:g id="count" example="10">%d</xliff:g> unused apps</item>
-    </plurals>
+    <string name="unused_apps_summary">{count, plural,
+      =1      {# unused app}
+      other   {# unused apps}
+    }</string>
 
     <!-- Label for category for unused app settings for an app. [CHAR LIMIT=40]-->
     <string name="unused_apps_category">Unused app settings</string>
@@ -8382,10 +8382,10 @@
     <string name="app_link_open_never">Don&#8217;t allow app to open links</string>
 
     <!-- Summary for allow app to open supported links [CHAR LIMIT=42] -->
-    <plurals name="app_link_open_always_summary">
-        <item quantity="one">App claims to handle <xliff:g id="count">%d</xliff:g> link</item>
-        <item quantity="other">App claims to handle <xliff:g id="count">%d</xliff:g> links</item>
-    </plurals>
+    <string name="app_link_open_always_summary">{count, plural,
+      =1      {App claims to handle # link}
+      other   {App claims to handle # links}
+    }</string>
 
     <!-- Footer of open supported links settings [CHAR LIMIT=NONE] -->
     <string name="open_supported_links_footer">App claims to handle following links:</string>
@@ -8645,10 +8645,10 @@
     <string name="memory_usage_apps">Memory used by apps</string>
 
     <!-- Description of number of apps using memory [CHAR LIMIT=NONE] -->
-    <plurals name="memory_usage_apps_summary">
-        <item quantity="one">1 app used memory in the last <xliff:g id="duration" example="3 hours">%2$s</xliff:g></item>
-        <item quantity="other"><xliff:g id="count" example="10">%1$d</xliff:g> apps used memory in the last <xliff:g id="duration" example="3 hours">%2$s</xliff:g></item>
-    </plurals>
+    <string name="memory_usage_apps_summary">{count, plural,
+      =1      {1 app used memory in the last {time}}
+      other   {# apps used memory in the last {time}}
+    }</string>
 
     <!-- Label for frequency that the app is runnig (e.g. always, sometimes, etc.) [CHAR LIMIT=25] -->
     <string name="running_frequency">Frequency</string>
@@ -9037,10 +9037,10 @@
     <string name="data_usage_other_apps">Other apps included in usage</string>
 
     <!-- Description of number of apps allowed to ignore Data Saver [CHAR LIMIT=NONE] -->
-    <plurals name="data_saver_unrestricted_summary">
-        <item quantity="one">1 app allowed to use unrestricted data when Data Saver is on</item>
-        <item quantity="other"><xliff:g id="count" example="10">%1$d</xliff:g> apps allowed to use unrestricted data when Data Saver is on</item>
-    </plurals>
+    <string name="data_saver_unrestricted_summary">{count, plural,
+      =1      {1 app allowed to use unrestricted data when Data Saver is on}
+      other   {# apps allowed to use unrestricted data when Data Saver is on}
+    }</string>
 
     <!-- Data usage title text [CHAR LIMIT=30] -->
     <string name="data_usage_title">Primary data</string>
@@ -9064,10 +9064,10 @@
     <string name="data_usage_chart_no_data_content_description">No data in this date range</string>
 
     <!-- Informational text about time left in billing cycle [CHAR LIMIT=60] -->
-    <plurals name="billing_cycle_days_left">
-        <item quantity="one">%d day left</item>
-        <item quantity="other">%d days left</item>
-    </plurals>
+    <string name="billing_cycle_days_left">{count, plural,
+      =1      {# day left}
+      other   {# days left}
+    }</string>
 
     <!-- Informational text about time left in billing cycle [CHAR LIMIT=60] -->
     <string name="billing_cycle_none_left">No time remaining</string>
diff --git a/src/com/android/settings/applications/HibernatedAppsPreferenceController.java b/src/com/android/settings/applications/HibernatedAppsPreferenceController.java
index 879903e..eb6edb2 100644
--- a/src/com/android/settings/applications/HibernatedAppsPreferenceController.java
+++ b/src/com/android/settings/applications/HibernatedAppsPreferenceController.java
@@ -21,6 +21,7 @@
 import static com.android.settings.Utils.PROPERTY_APP_HIBERNATION_ENABLED;
 
 import android.content.Context;
+import android.icu.text.MessageFormat;
 import android.permission.PermissionControllerManager;
 import android.provider.DeviceConfig;
 
@@ -35,6 +36,9 @@
 
 import com.google.common.annotations.VisibleForTesting;
 
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
 import java.util.concurrent.Executor;
 
 /**
@@ -67,9 +71,13 @@
 
     @Override
     public CharSequence getSummary() {
+        MessageFormat msgFormat = new MessageFormat(
+                mContext.getResources().getString(R.string.unused_apps_summary),
+                Locale.getDefault());
+        Map<String, Object> arguments = new HashMap<>();
+        arguments.put("count", mUnusedCount);
         return mLoadedUnusedCount
-                ? mContext.getResources().getQuantityString(
-                        R.plurals.unused_apps_summary, mUnusedCount, mUnusedCount)
+                ? msgFormat.format(arguments)
                 : mContext.getResources().getString(R.string.summary_placeholder);
     }
 
diff --git a/src/com/android/settings/applications/OpenSupportedLinks.java b/src/com/android/settings/applications/OpenSupportedLinks.java
index c4e478c..2606a6c 100644
--- a/src/com/android/settings/applications/OpenSupportedLinks.java
+++ b/src/com/android/settings/applications/OpenSupportedLinks.java
@@ -21,6 +21,7 @@
 
 import android.app.settings.SettingsEnums;
 import android.content.pm.PackageManager;
+import android.icu.text.MessageFormat;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.util.Log;
@@ -35,6 +36,9 @@
 import com.android.settingslib.widget.FooterPreference;
 import com.android.settingslib.widget.SelectorWithWidgetPreference;
 
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -89,10 +93,14 @@
         mPreferenceCategory = findPreference(RADIO_GROUP_KEY);
         mAllowOpening = makeRadioPreference(KEY_LINK_OPEN_ALWAYS, R.string.app_link_open_always);
         final int entriesNo = getEntriesNo();
+        MessageFormat msgFormat = new MessageFormat(
+                getResources().getString(R.string.app_link_open_always_summary),
+                Locale.getDefault());
+        Map<String, Object> arguments = new HashMap<>();
+        arguments.put("count", entriesNo);
         //This to avoid the summary line wrap
         mAllowOpening.setAppendixVisibility(View.GONE);
-        mAllowOpening.setSummary(getResources().getQuantityString(
-                R.plurals.app_link_open_always_summary, entriesNo, entriesNo));
+        mAllowOpening.setSummary(msgFormat.format(arguments));
         mAskEveryTime = makeRadioPreference(KEY_LINK_OPEN_ASK, R.string.app_link_open_ask);
         mNotAllowed = makeRadioPreference(KEY_LINK_OPEN_NEVER, R.string.app_link_open_never);
 
diff --git a/src/com/android/settings/applications/ProcessStatsSummary.java b/src/com/android/settings/applications/ProcessStatsSummary.java
index a9f4ade..4044794 100644
--- a/src/com/android/settings/applications/ProcessStatsSummary.java
+++ b/src/com/android/settings/applications/ProcessStatsSummary.java
@@ -17,6 +17,7 @@
 
 import android.app.settings.SettingsEnums;
 import android.content.Context;
+import android.icu.text.MessageFormat;
 import android.os.Bundle;
 import android.text.format.Formatter;
 import android.text.format.Formatter.BytesResult;
@@ -30,6 +31,10 @@
 import com.android.settings.applications.ProcStatsData.MemInfo;
 import com.android.settings.core.SubSettingLauncher;
 
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
 public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenceClickListener {
 
     private static final String KEY_STATUS_HEADER = "status_header";
@@ -94,8 +99,12 @@
         mFree.setSummary(freeString);
         String durationString = getString(sDurationLabels[mDurationIndex]);
         int numApps = mStatsManager.getEntries().size();
-        mAppListPreference.setSummary(getResources().getQuantityString(
-                R.plurals.memory_usage_apps_summary, numApps, numApps, durationString));
+        MessageFormat msgFormat = new MessageFormat(
+                getResources().getString(R.string.memory_usage_apps_summary), Locale.getDefault());
+        Map<String, Object> arguments = new HashMap<>();
+        arguments.put("count", numApps);
+        arguments.put("time", durationString);
+        mAppListPreference.setSummary(msgFormat.format(arguments));
     }
 
     @Override
diff --git a/src/com/android/settings/applications/appinfo/AppNotificationPreferenceController.java b/src/com/android/settings/applications/appinfo/AppNotificationPreferenceController.java
index df0d3549..0f48355 100644
--- a/src/com/android/settings/applications/appinfo/AppNotificationPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppNotificationPreferenceController.java
@@ -19,6 +19,7 @@
 import static com.android.settings.SettingsActivity.EXTRA_FRAGMENT_ARG_KEY;
 
 import android.content.Context;
+import android.icu.text.MessageFormat;
 import android.os.Bundle;
 
 import androidx.preference.Preference;
@@ -31,6 +32,10 @@
 import com.android.settingslib.applications.AppUtils;
 import com.android.settingslib.applications.ApplicationsState;
 
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
 public class AppNotificationPreferenceController extends AppInfoPreferenceControllerBase {
 
     private String mChannelId = null;
@@ -103,10 +108,14 @@
             if (appRow.blockedChannelCount == 0) {
                 return NotificationBackend.getSentSummary(context, appRow.sentByApp, false);
             }
+            MessageFormat msgFormat = new MessageFormat(
+                    context.getString(R.string.notifications_categories_off),
+                    Locale.getDefault());
+            Map<String, Object> arguments = new HashMap<>();
+            arguments.put("count", appRow.blockedChannelCount);
             return context.getString(R.string.notifications_enabled_with_info,
                     NotificationBackend.getSentSummary(context, appRow.sentByApp, false),
-                    context.getResources().getQuantityString(R.plurals.notifications_categories_off,
-                            appRow.blockedChannelCount, appRow.blockedChannelCount));
+                    msgFormat.format(arguments));
         }
     }
 }
diff --git a/src/com/android/settings/applications/appinfo/AppPermissionPreferenceController.java b/src/com/android/settings/applications/appinfo/AppPermissionPreferenceController.java
index 047101d..b7069d9 100644
--- a/src/com/android/settings/applications/appinfo/AppPermissionPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppPermissionPreferenceController.java
@@ -23,6 +23,7 @@
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
 import android.icu.text.ListFormatter;
+import android.icu.text.MessageFormat;
 import android.util.Log;
 
 import androidx.annotation.VisibleForTesting;
@@ -35,7 +36,10 @@
 import com.android.settingslib.core.lifecycle.events.OnStop;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
+import java.util.Map;
 import java.util.Random;
 
 /**
@@ -70,9 +74,12 @@
                 final ArrayList<CharSequence> list = new ArrayList<>(grantedGroupLabels);
                 if (additionalGrantedPermissionCount > 0) {
                     // N additional permissions.
-                    list.add(res.getQuantityString(
-                            R.plurals.runtime_permissions_additional_count,
-                            additionalGrantedPermissionCount, additionalGrantedPermissionCount));
+                    MessageFormat msgFormat = new MessageFormat(
+                            res.getString(R.string.runtime_permissions_additional_count),
+                            Locale.getDefault());
+                    Map<String, Object> arguments = new HashMap<>();
+                    arguments.put("count", additionalGrantedPermissionCount);
+                    list.add(msgFormat.format(arguments));
                 }
                 if (list.size() == 0) {
                     summary = res.getString(
diff --git a/src/com/android/settings/applications/intentpicker/AppLaunchSettings.java b/src/com/android/settings/applications/intentpicker/AppLaunchSettings.java
index cd36000..b1ab1cc 100644
--- a/src/com/android/settings/applications/intentpicker/AppLaunchSettings.java
+++ b/src/com/android/settings/applications/intentpicker/AppLaunchSettings.java
@@ -28,6 +28,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.verify.domain.DomainVerificationManager;
 import android.content.pm.verify.domain.DomainVerificationUserState;
+import android.icu.text.MessageFormat;
 import android.net.Uri;
 import android.os.Bundle;
 import android.util.ArraySet;
@@ -52,7 +53,10 @@
 import com.android.settingslib.widget.MainSwitchPreference;
 import com.android.settingslib.widget.OnMainSwitchChangeListener;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
+import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 
@@ -287,13 +291,21 @@
 
     @VisibleForTesting
     String getVerifiedLinksTitle(int linksNo) {
-        return getResources().getQuantityString(
-                R.plurals.app_launch_verified_links_title, linksNo, linksNo);
+        MessageFormat msgFormat = new MessageFormat(
+                getResources().getString(R.string.app_launch_verified_links_title),
+                Locale.getDefault());
+        Map<String, Object> arguments = new HashMap<>();
+        arguments.put("count", linksNo);
+        return msgFormat.format(arguments);
     }
 
     private String getVerifiedLinksMessage(int linksNo) {
-        return getResources().getQuantityString(
-                R.plurals.app_launch_verified_links_message, linksNo, linksNo);
+        MessageFormat msgFormat = new MessageFormat(
+                getResources().getString(R.string.app_launch_verified_links_message),
+                Locale.getDefault());
+        Map<String, Object> arguments = new HashMap<>();
+        arguments.put("count", linksNo);
+        return msgFormat.format(arguments);
     }
 
     /** Add selected links items */
diff --git a/src/com/android/settings/applications/intentpicker/SupportedLinksDialogFragment.java b/src/com/android/settings/applications/intentpicker/SupportedLinksDialogFragment.java
index e67fa04..cc1241d 100644
--- a/src/com/android/settings/applications/intentpicker/SupportedLinksDialogFragment.java
+++ b/src/com/android/settings/applications/intentpicker/SupportedLinksDialogFragment.java
@@ -22,6 +22,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.verify.domain.DomainVerificationManager;
 import android.content.pm.verify.domain.DomainVerificationUserState;
+import android.icu.text.MessageFormat;
 import android.os.Bundle;
 import android.util.ArraySet;
 import android.util.Log;
@@ -34,7 +35,10 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
+import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 
@@ -84,8 +88,12 @@
 
     private String getSupportedLinksTitle() {
         final int supportedLinksNo = mSupportedLinkWrapperList.size();
-        return getResources().getQuantityString(
-                R.plurals.app_launch_supported_links_title, supportedLinksNo, supportedLinksNo);
+        MessageFormat msgFormat = new MessageFormat(
+                getResources().getString(R.string.app_launch_supported_links_title),
+                Locale.getDefault());
+        Map<String, Object> arguments = new HashMap<>();
+        arguments.put("count", supportedLinksNo);
+        return msgFormat.format(arguments);
     }
 
     private void doSelectedAction() {
diff --git a/src/com/android/settings/datausage/DataSaverSummary.java b/src/com/android/settings/datausage/DataSaverSummary.java
index 1729975..9bd862a 100644
--- a/src/com/android/settings/datausage/DataSaverSummary.java
+++ b/src/com/android/settings/datausage/DataSaverSummary.java
@@ -17,6 +17,7 @@
 import android.app.Application;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
+import android.icu.text.MessageFormat;
 import android.os.Bundle;
 import android.telephony.SubscriptionManager;
 import android.widget.Switch;
@@ -38,6 +39,9 @@
 import com.android.settingslib.widget.OnMainSwitchChangeListener;
 
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
 
 @SearchIndexable
 public class DataSaverSummary extends SettingsPreferenceFragment
@@ -207,8 +211,12 @@
                 count++;
             }
         }
-        mUnrestrictedAccess.setSummary(getResources().getQuantityString(
-                R.plurals.data_saver_unrestricted_summary, count, count));
+        MessageFormat msgFormat = new MessageFormat(
+                getResources().getString(R.string.data_saver_unrestricted_summary),
+                Locale.getDefault());
+        Map<String, Object> arguments = new HashMap<>();
+        arguments.put("count", count);
+        mUnrestrictedAccess.setSummary(msgFormat.format(arguments));
     }
 
     public static boolean isDataSaverVisible(Context context) {
diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreference.java b/src/com/android/settings/datausage/DataUsageSummaryPreference.java
index b6e533b..86e01ed 100644
--- a/src/com/android/settings/datausage/DataUsageSummaryPreference.java
+++ b/src/com/android/settings/datausage/DataUsageSummaryPreference.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.Typeface;
+import android.icu.text.MessageFormat;
 import android.net.ConnectivityManager;
 import android.net.NetworkTemplate;
 import android.os.Bundle;
@@ -46,6 +47,9 @@
 import com.android.settingslib.net.DataUsageController;
 import com.android.settingslib.utils.StringUtil;
 
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
@@ -290,10 +294,14 @@
             cycleTime.setText(getContext().getString(R.string.billing_cycle_none_left));
         } else {
             int daysLeft = (int) (millisLeft / MILLIS_IN_A_DAY);
+            MessageFormat msgFormat = new MessageFormat(
+                    getContext().getResources().getString(R.string.billing_cycle_days_left),
+                    Locale.getDefault());
+            Map<String, Object> arguments = new HashMap<>();
+            arguments.put("count", daysLeft);
             cycleTime.setText(daysLeft < 1
                     ? getContext().getString(R.string.billing_cycle_less_than_one_day_left)
-                    : getContext().getResources().getQuantityString(
-                            R.plurals.billing_cycle_days_left, daysLeft, daysLeft));
+                    : msgFormat.format(arguments));
         }
     }
 
diff --git a/src/com/android/settings/notification/zen/ZenModeVoiceActivity.java b/src/com/android/settings/notification/zen/ZenModeVoiceActivity.java
index e107fdc..af937d5 100644
--- a/src/com/android/settings/notification/zen/ZenModeVoiceActivity.java
+++ b/src/com/android/settings/notification/zen/ZenModeVoiceActivity.java
@@ -22,7 +22,7 @@
 import android.app.NotificationManager;
 import android.content.Context;
 import android.content.Intent;
-import android.content.res.Resources;
+import android.icu.text.MessageFormat;
 import android.media.AudioManager;
 import android.os.UserHandle;
 import android.provider.Settings.Global;
@@ -34,7 +34,9 @@
 import com.android.settings.R;
 import com.android.settings.utils.VoiceSettingsActivity;
 
+import java.util.HashMap;
 import java.util.Locale;
+import java.util.Map;
 
 /**
  * Activity for modifying the Zen mode (Do not disturb) by voice
@@ -87,16 +89,10 @@
      */
     private CharSequence getChangeSummary(int mode, int minutes) {
         int indefinite = -1;
-        int byMinute = -1;
-        int byHour = -1;
-        int byTime = -1;
 
         switch (mode) {
             case Global.ZEN_MODE_ALARMS:
                 indefinite = R.string.zen_mode_summary_alarms_only_indefinite;
-                byMinute = R.plurals.zen_mode_summary_alarms_only_by_minute;
-                byHour = R.plurals.zen_mode_summary_alarms_only_by_hour;
-                byTime = R.string.zen_mode_summary_alarms_only_by_time;
                 break;
             case Global.ZEN_MODE_OFF:
                 indefinite = R.string.zen_mode_summary_always;
@@ -111,15 +107,23 @@
         String skeleton = DateFormat.is24HourFormat(this, UserHandle.myUserId()) ? "Hm" : "hma";
         String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
         CharSequence formattedTime = DateFormat.format(pattern, time);
-        Resources res = getResources();
 
         if (minutes < 60) {
-            return res.getQuantityString(byMinute, minutes, minutes, formattedTime);
+            return buildMessage(R.string.zen_mode_summary_alarms_only_by_minute, minutes, formattedTime);
         } else if (minutes % 60 != 0) {
-            return res.getString(byTime, formattedTime);
+            return getResources().getString(R.string.zen_mode_summary_alarms_only_by_time, formattedTime);
         } else {
             int hours = minutes / 60;
-            return res.getQuantityString(byHour, hours, hours, formattedTime);
+            return buildMessage(R.string.zen_mode_summary_alarms_only_by_hour, hours, formattedTime);
         }
     }
+
+    private CharSequence buildMessage(int resId, int count, CharSequence formattedTime) {
+        MessageFormat msgFormat = new MessageFormat(
+                getResources().getString(resId), Locale.getDefault());
+        Map<String, Object> arguments = new HashMap<>();
+        arguments.put("count", count);
+        arguments.put("time", formattedTime);
+        return msgFormat.format(arguments);
+    }
 }
diff --git a/src/com/android/settings/spa/app/appinfo/AppPermissionSummary.kt b/src/com/android/settings/spa/app/appinfo/AppPermissionSummary.kt
index 58edee6..9b8b0fd 100644
--- a/src/com/android/settings/spa/app/appinfo/AppPermissionSummary.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppPermissionSummary.kt
@@ -24,6 +24,7 @@
 import com.android.settings.R
 import com.android.settingslib.applications.PermissionsSummaryHelper
 import com.android.settingslib.applications.PermissionsSummaryHelper.PermissionsResultCallback
+import com.android.settingslib.spa.framework.util.formatString
 import com.android.settingslib.spaprivileged.framework.common.asUser
 import com.android.settingslib.spaprivileged.model.app.userHandle
 
@@ -91,10 +92,9 @@
         else -> {
             grantedGroupLabels +
                 // N additional permissions.
-                context.resources.getQuantityString(
-                    R.plurals.runtime_permissions_additional_count,
-                    additionalGrantedPermissionCount,
-                    additionalGrantedPermissionCount,
+                context.formatString(
+                    R.string.runtime_permissions_additional_count,
+                    "count" to additionalGrantedPermissionCount,
                 )
         }
     }
diff --git a/tests/robotests/src/com/android/settings/applications/OpenSupportedLinksTest.java b/tests/robotests/src/com/android/settings/applications/OpenSupportedLinksTest.java
index ea2c4ec..7712ae8 100644
--- a/tests/robotests/src/com/android/settings/applications/OpenSupportedLinksTest.java
+++ b/tests/robotests/src/com/android/settings/applications/OpenSupportedLinksTest.java
@@ -36,6 +36,7 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
 
+import com.android.settings.R;
 import com.android.settings.testutils.shadow.ShadowUtils;
 import com.android.settingslib.widget.FooterPreference;
 
@@ -144,8 +145,9 @@
                 anyInt());
         doReturn(mCategory).when(mSettings).findPreference(any(CharSequence.class));
         doReturn(mResources).when(mSettings).getResources();
-        when(mResources.getQuantityString(anyInt(), anyInt(), anyInt())).thenReturn(TEST_SUMMARY);
         doReturn(true).when(mCategory).addPreference(any(Preference.class));
+        when(mResources.getString(R.string.app_link_open_always_summary))
+                .thenReturn("App claims to handle # links");
     }
 
     public static class TestFragment extends OpenSupportedLinks {