Plurals cleanup in packages/apps/Contacts

Fixes: 199230230
Test: manual

Change-Id: I6abb39c31fff8a25b38b820f5544eaf8a6ed8c53
diff --git a/src/com/android/contacts/ContactSaveService.java b/src/com/android/contacts/ContactSaveService.java
index 9f25726..30e4f82 100755
--- a/src/com/android/contacts/ContactSaveService.java
+++ b/src/com/android/contacts/ContactSaveService.java
@@ -31,6 +31,7 @@
 import android.content.OperationApplicationException;
 import android.database.Cursor;
 import android.database.DatabaseUtils;
+import android.icu.text.MessageFormat;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
@@ -75,8 +76,11 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Locale;
+import java.util.Map;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 /**
@@ -1214,8 +1218,12 @@
                 ContactSaveService.EXTRA_DISPLAY_NAME_ARRAY);
         final String deleteToastMessage;
         if (contactIds.length != names.length || names.length == 0) {
-            deleteToastMessage = getResources().getQuantityString(
-                    R.plurals.contacts_deleted_toast, contactIds.length);
+            MessageFormat msgFormat = new MessageFormat(
+                getResources().getString(R.string.contacts_deleted_toast),
+                Locale.getDefault());
+            Map<String, Object> arguments = new HashMap<>();
+            arguments.put("count", contactIds.length);
+            deleteToastMessage = msgFormat.format(arguments);
         } else if (names.length == 1) {
             deleteToastMessage = getResources().getString(
                     R.string.contacts_deleted_one_named_toast, (Object[]) names);
diff --git a/src/com/android/contacts/interactions/ContactDeletionInteraction.java b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
index 240588b..7438f0d 100644
--- a/src/com/android/contacts/interactions/ContactDeletionInteraction.java
+++ b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
@@ -28,6 +28,7 @@
 import android.content.DialogInterface.OnDismissListener;
 import android.content.Loader;
 import android.database.Cursor;
+import android.icu.text.MessageFormat;
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.ContactsContract.Contacts;
@@ -46,7 +47,10 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Sets;
 
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Locale;
+import java.util.Map;
 
 /**
  * An interaction invoked to delete a contact.
@@ -353,8 +357,12 @@
             final String name = ContactDisplayUtils.getPreferredDisplayName(mDisplayName,
                     mDisplayNameAlt, new ContactsPreferences(mContext));
             if (TextUtils.isEmpty(name)) {
-                deleteToastMessage = getResources().getQuantityString(
-                        R.plurals.contacts_deleted_toast, /* quantity */ 1);
+                MessageFormat msgFormat = new MessageFormat(
+                    getResources().getString(R.string.contacts_deleted_toast),
+                    Locale.getDefault());
+                Map<String, Object> arguments = new HashMap<>();
+                arguments.put("count", 1);
+                deleteToastMessage = msgFormat.format(arguments);
             } else {
                 deleteToastMessage = getResources().getString(
                         R.string.contacts_deleted_one_named_toast, name);
diff --git a/src/com/android/contacts/interactions/ImportDialogFragment.java b/src/com/android/contacts/interactions/ImportDialogFragment.java
index 41b1c71..693536a 100644
--- a/src/com/android/contacts/interactions/ImportDialogFragment.java
+++ b/src/com/android/contacts/interactions/ImportDialogFragment.java
@@ -25,6 +25,7 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.res.Resources;
+import android.icu.text.MessageFormat;
 import android.os.Bundle;
 import androidx.core.text.BidiFormatter;
 import androidx.core.text.TextDirectionHeuristicsCompat;
@@ -50,7 +51,10 @@
 import com.android.contacts.util.AccountSelectionUtil;
 import com.google.common.util.concurrent.Futures;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
+import java.util.Map;
 import java.util.concurrent.Future;
 
 /**
@@ -171,17 +175,22 @@
 
                 if (count != -1 && phone != null) {
                     // We use a template instead of format string so that the TTS span is preserved
-                    final CharSequence template = getResources()
-                            .getQuantityString(R.plurals.import_from_sim_secondary_template, count);
-                    return TextUtils.expandTemplate(template, String.valueOf(count), phone);
+                    MessageFormat msgFormat = new MessageFormat(
+                        getResources().getString(R.string.import_from_sim_secondary_template),
+                        Locale.getDefault());
+                    Map<String, Object> arguments = new HashMap<>();
+                    arguments.put("count", count);
+                    return TextUtils.expandTemplate(msgFormat.format(arguments), phone);
                 } else if (phone != null) {
                     return phone;
                 } else if (count != -1) {
-                    // count != -1
-                    return getResources()
-                            .getQuantityString(
-                                    R.plurals.import_from_sim_secondary_contact_count_fmt, count,
-                                    count);
+                    MessageFormat msgFormat = new MessageFormat(
+                        getResources()
+                            .getString(R.string.import_from_sim_secondary_contact_count_fmt),
+                        Locale.getDefault());
+                    Map<String, Object> arguments = new HashMap<>();
+                    arguments.put("count", count);
+                    return msgFormat.format(arguments);
                 } else {
                     return null;
                 }
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index 9851d2b..2aacabe 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -31,6 +31,7 @@
 import android.graphics.PorterDuff;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
+import android.icu.text.MessageFormat;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
@@ -80,8 +81,10 @@
 import com.android.contactsbind.experiments.Flags;
 import com.google.common.util.concurrent.Futures;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.concurrent.Future;
 
 /**
@@ -1123,8 +1126,12 @@
         intent.setType(ContactsContract.Contacts.CONTENT_VCARD_TYPE);
         intent.putExtra(Intent.EXTRA_STREAM, uri);
         try {
-            startActivityForResult(Intent.createChooser(intent, getResources().getQuantityString(
-                    R.plurals.title_share_via,/* quantity */ getSelectedContactIds().size()))
+            MessageFormat msgFormat = new MessageFormat(
+                getResources().getString(R.string.title_share_via),
+                Locale.getDefault());
+            Map<String, Object> arguments = new HashMap<>();
+            arguments.put("count", getSelectedContactIds().size());
+            startActivityForResult(Intent.createChooser(intent, msgFormat.format(arguments))
                     , ACTIVITY_REQUEST_CODE_SHARE);
         } catch (final ActivityNotFoundException ex) {
             Toast.makeText(getContext(), R.string.share_error, Toast.LENGTH_SHORT).show();
diff --git a/src/com/android/contacts/list/MultiSelectContactsListFragment.java b/src/com/android/contacts/list/MultiSelectContactsListFragment.java
index 5e7f9e8..83b1ec9 100644
--- a/src/com/android/contacts/list/MultiSelectContactsListFragment.java
+++ b/src/com/android/contacts/list/MultiSelectContactsListFragment.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.database.Cursor;
 import android.graphics.drawable.Drawable;
+import android.icu.text.MessageFormat;
 import android.os.Bundle;
 import android.provider.ContactsContract;
 import androidx.core.view.ViewCompat;
@@ -46,7 +47,10 @@
 import com.android.contacts.model.account.GoogleAccountType;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
+import java.util.Map;
 import java.util.TreeSet;
 
 /**
@@ -345,12 +349,21 @@
         // Set text of count of contacts and account name
         final TextView accountFilterHeader = (TextView) accountFilterContainer.findViewById(
                 R.id.account_filter_header);
-        final String headerText = shouldShowAccountName(accountType)
-                ? String.format(context.getResources().getQuantityString(
-                        R.plurals.contacts_count_with_account, memberCount),
-                                memberCount, accountWithDataSet.name)
-                : context.getResources().getQuantityString(
-                        R.plurals.contacts_count, memberCount, memberCount);
+        String headerText;
+        Map<String, Object> arguments = new HashMap<>();
+        arguments.put("count", memberCount);
+        if (shouldShowAccountName(accountType)) {
+            arguments.put("account", accountWithDataSet.name);
+            MessageFormat msgFormat = new MessageFormat(
+                getResources().getString(R.string.contacts_count_with_account),
+                Locale.getDefault());
+            headerText = msgFormat.format(arguments);
+        } else {
+            MessageFormat msgFormat = new MessageFormat(
+                getResources().getString(R.string.contacts_count),
+                Locale.getDefault());
+            headerText = msgFormat.format(arguments);
+        }
         accountFilterHeader.setText(headerText);
         accountFilterHeader.setAllCaps(false);
 
diff --git a/src/com/android/contacts/preference/DisplayOptionsPreferenceFragment.java b/src/com/android/contacts/preference/DisplayOptionsPreferenceFragment.java
index 69abf05..fd358aa 100644
--- a/src/com/android/contacts/preference/DisplayOptionsPreferenceFragment.java
+++ b/src/com/android/contacts/preference/DisplayOptionsPreferenceFragment.java
@@ -27,6 +27,7 @@
 import android.content.Loader;
 import android.content.res.Resources;
 import android.database.Cursor;
+import android.icu.text.MessageFormat;
 import android.net.Uri;
 import android.os.Bundle;
 import android.preference.Preference;
@@ -63,7 +64,10 @@
 import com.android.contacts.util.ImplicitIntentsUtil;
 import com.android.contactsbind.HelpUtils;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
+import java.util.Map;
 
 /**
  * This fragment shows the preferences for "display options"
@@ -429,8 +433,12 @@
                     SimImportService.RESULT_UNKNOWN);
             final int count = intent.getIntExtra(SimImportService.EXTRA_RESULT_COUNT, -1);
             if (code == SimImportService.RESULT_SUCCESS && count > 0) {
-                Snackbar.make(mRootView, getResources().getQuantityString(
-                        R.plurals.sim_import_success_toast_fmt, count, count),
+                MessageFormat msgFormat = new MessageFormat(
+                    getResources().getString(R.string.sim_import_success_toast_fmt),
+                    Locale.getDefault());
+                Map<String, Object> arguments = new HashMap<>();
+                arguments.put("count", count);
+                Snackbar.make(mRootView, msgFormat.format(arguments),
                         Snackbar.LENGTH_LONG).show();
             } else if (code == SimImportService.RESULT_FAILURE) {
                 Snackbar.make(mRootView, R.string.sim_import_failed_toast,
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 53dbf15..5b144e1 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -45,6 +45,7 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
+import android.icu.text.MessageFormat;
 import android.media.RingtoneManager;
 import android.net.Uri;
 import android.os.AsyncTask;
@@ -175,6 +176,7 @@
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 
 /**
@@ -2221,8 +2223,12 @@
         intent.putExtra(Intent.EXTRA_STREAM, shareUri);
 
         // Launch chooser to share contact via
-        final CharSequence chooseTitle = getResources().getQuantityString(
-                R.plurals.title_share_via, /* quantity */ 1);
+        MessageFormat msgFormat = new MessageFormat(
+            getResources().getString(R.string.title_share_via),
+            Locale.getDefault());
+        Map<String, Object> arguments = new HashMap<>();
+        arguments.put("count", 1);
+        CharSequence chooseTitle = msgFormat.format(arguments);
         final Intent chooseIntent = Intent.createChooser(intent, chooseTitle);
 
         try {