Make import dialog able to show just SIM options.

Also improve the display of the SIM options in this dialog.

Test
Manual: verify that SIM options are shown on a device with multiple
SIM cards.

Bug 31781331

Change-Id: I967df095b0a4ecf7ec690e5c2e79a6824a35b998
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 18e8e92..5e28fb6 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1370,11 +1370,17 @@
     <string name="import_from_sim">Import from SIM card</string>
 
     <!-- Action string for selecting a SIM subscription for importing contacts -->
-    <string name="import_from_sim_summary">Import from SIM <xliff:g id="sim_name">^1</xliff:g> - <xliff:g id="sim_number">^2</xliff:g></string>
+    <string name="import_from_sim_summary">Import from SIM <xliff:g id="sim_name">^1</xliff:g>\n<xliff:g id="sim_number">^2</xliff:g></string>
 
     <!-- Action string for selecting a SIM subscription for importing contacts, without a phone number -->
     <string name="import_from_sim_summary_no_number">Import from SIM <xliff:g id="sim_name">%1$s</xliff:g></string>
 
+    <!-- Action string for selecting a SIM subscription for importing contacts -->
+    <string name="import_from_sim_summary_by_carrier">Import from <xliff:g id="carrier_name">^1</xliff:g> SIM\n<xliff:g id="sim_number">^2</xliff:g></string>
+
+    <!-- Action string for selecting a SIM subscription for importing contacts -->
+    <string name="import_from_sim_summary_by_carrier_no_number">Import from <xliff:g id="carrier_name">%1$s</xliff:g> SIM</string>
+
     <!-- Action string for selecting a .vcf file to import contacts from [CHAR LIMIT=30] -->
     <string name="import_from_vcf_file" product="default">Import from .vcf file</string>
 
diff --git a/src/com/android/contacts/common/interactions/ImportDialogFragment.java b/src/com/android/contacts/common/interactions/ImportDialogFragment.java
index 991a9c2..30c6603 100644
--- a/src/com/android/contacts/common/interactions/ImportDialogFragment.java
+++ b/src/com/android/contacts/common/interactions/ImportDialogFragment.java
@@ -24,8 +24,11 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.res.Resources;
+import android.os.Build;
 import android.os.Bundle;
 import android.provider.ContactsContract.Contacts;
+import android.support.annotation.RequiresApi;
+import android.support.v4.util.ArraySet;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
@@ -45,10 +48,11 @@
 import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.common.util.AccountSelectionUtil;
 import com.android.contacts.common.util.AccountsListAdapter.AccountListFilter;
-import com.android.contacts.common.vcard.VCardCommonArguments;
 import com.android.contacts.editor.SelectAccountDialogFragment;
 
 import java.util.List;
+import java.util.Locale;
+import java.util.Set;
 
 /**
  * An dialog invoked to import/export contacts.
@@ -60,6 +64,9 @@
     private static final String KEY_RES_ID = "resourceId";
     private static final String KEY_SUBSCRIPTION_ID = "subscriptionId";
 
+    public static final String EXTRA_SIM_ONLY = "extraSimOnly";
+
+    private boolean mSimOnly = false;
 
     private final String[] LOOKUP_PROJECTION = new String[] {
             Contacts.LOOKUP_KEY
@@ -68,15 +75,31 @@
     private SubscriptionManager mSubscriptionManager;
 
     /** Preferred way to show this dialog */
-    public static void show(FragmentManager fragmentManager, Class callingActivity) {
+    public static void show(FragmentManager fragmentManager) {
+        final ImportDialogFragment fragment = new ImportDialogFragment();
+        fragment.show(fragmentManager, TAG);
+    }
+
+    /**
+     * Create an instance that will only have items for the SIM cards (VCF will not be included).
+     */
+    public static void showForSimOnly(FragmentManager fragmentManager) {
         final ImportDialogFragment fragment = new ImportDialogFragment();
         Bundle args = new Bundle();
-        args.putString(VCardCommonArguments.ARG_CALLING_ACTIVITY, callingActivity.getName());
+        args.putBoolean(EXTRA_SIM_ONLY, true);
         fragment.setArguments(args);
         fragment.show(fragmentManager, TAG);
     }
 
     @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        final Bundle args = getArguments();
+        mSimOnly = args != null && args.getBoolean(EXTRA_SIM_ONLY, false);
+    }
+
+    @Override
     public Context getContext() {
         return getActivity();
     }
@@ -92,8 +115,6 @@
         final Resources res = getActivity().getResources();
         final LayoutInflater dialogInflater = (LayoutInflater)getActivity()
                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        final String callingActivity = getArguments().getString(
-                VCardCommonArguments.ARG_CALLING_ACTIVITY);
 
         // Adapter that shows a list of string resources
         final ArrayAdapter<AdapterEntry> adapter = new ArrayAdapter<AdapterEntry>(getActivity(),
@@ -110,7 +131,7 @@
 
         final TelephonyManager manager =
                 (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
-        if (res.getBoolean(R.bool.config_allow_import_from_vcf_file)) {
+        if (res.getBoolean(R.bool.config_allow_import_from_vcf_file) && !mSimOnly) {
             adapter.add(new AdapterEntry(getString(R.string.import_from_vcf_file),
                     R.string.import_from_vcf_file));
         }
@@ -129,6 +150,11 @@
                     if (subInfoRecords.size() == 1) {
                         adapter.add(new AdapterEntry(getString(R.string.import_from_sim),
                                 R.string.import_from_sim, subInfoRecords.get(0).getSubscriptionId()));
+                    } else if (hasUniqueNonNullCarrierNames(subInfoRecords)) {
+                        for (SubscriptionInfo record : subInfoRecords) {
+                            adapter.add(new AdapterEntry(getSubDescriptionForCarrier(record),
+                                    R.string.import_from_sim, record.getSubscriptionId()));
+                        }
                     } else {
                         for (SubscriptionInfo record : subInfoRecords) {
                             adapter.add(new AdapterEntry(getSubDescription(record),
@@ -234,18 +260,62 @@
         dismiss();
     }
 
+    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)
+    private boolean hasUniqueNonNullCarrierNames(List<SubscriptionInfo> subscriptions) {
+        final Set<CharSequence> names = new ArraySet<>();
+        for (SubscriptionInfo subscription : subscriptions) {
+            final CharSequence name = subscription.getCarrierName();
+            if (name == null) {
+                return false;
+            }
+            if (!names.add(name)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     private CharSequence getSubDescription(SubscriptionInfo record) {
-        CharSequence name = record.getDisplayName();
-        if (TextUtils.isEmpty(record.getNumber())) {
-            // Don't include the phone number in the description, since we don't know the number.
+        final CharSequence name = record.getDisplayName();
+        final CharSequence number = getFormattedNumber(record);
+
+        if (TextUtils.isEmpty(number)) {
             return getString(R.string.import_from_sim_summary_no_number, name);
         }
-        return TextUtils.expandTemplate(
-                getString(R.string.import_from_sim_summary),
-                name,
-                PhoneNumberUtilsCompat.createTtsSpannable(record.getNumber()));
+
+        return TextUtils.expandTemplate(getString(R.string.import_from_sim_summary), name, number);
     }
 
+    private CharSequence getSubDescriptionForCarrier(SubscriptionInfo record) {
+        final CharSequence carrierName = record.getCarrierName();
+        final CharSequence number = getFormattedNumber(record);
+
+        if (TextUtils.isEmpty(number)) {
+            return getString(R.string.import_from_sim_summary_by_carrier_no_number, carrierName);
+        }
+
+        return TextUtils.expandTemplate(
+                getString(R.string.import_from_sim_summary_by_carrier), carrierName, number);
+    }
+
+    private CharSequence getFormattedNumber(SubscriptionInfo subscription) {
+        final String rawNumber = subscription.getNumber();
+        if (rawNumber == null) {
+            return null;
+        }
+        final String country = subscription.getCountryIso();
+        final String number;
+        if (country != null) {
+            number = PhoneNumberUtilsCompat.formatNumber(rawNumber, null,
+                    country.toUpperCase(Locale.US));
+        } else {
+            number = rawNumber;
+        }
+        return PhoneNumberUtilsCompat.createTtsSpannable(number);
+    }
+
+
+
     private static class AdapterEntry {
         public final CharSequence mLabel;
         public final int mChoiceResourceId;
diff --git a/src/com/android/contacts/common/preference/DisplayOptionsPreferenceFragment.java b/src/com/android/contacts/common/preference/DisplayOptionsPreferenceFragment.java
index a6881ed..1b9818f 100644
--- a/src/com/android/contacts/common/preference/DisplayOptionsPreferenceFragment.java
+++ b/src/com/android/contacts/common/preference/DisplayOptionsPreferenceFragment.java
@@ -324,7 +324,7 @@
             ((ContactsPreferenceActivity) getActivity()).showAboutFragment();
             return true;
         } else if (KEY_IMPORT.equals(prefKey)) {
-            ImportDialogFragment.show(getFragmentManager(), ContactsPreferenceActivity.class);
+            ImportDialogFragment.show(getFragmentManager());
             return true;
         } else if (KEY_EXPORT.equals(prefKey)) {
             ExportDialogFragment.show(getFragmentManager(), ContactsPreferenceActivity.class,
diff --git a/src/com/android/contacts/list/ContactsUnavailableFragment.java b/src/com/android/contacts/list/ContactsUnavailableFragment.java
index 518447c..72e6718 100644
--- a/src/com/android/contacts/list/ContactsUnavailableFragment.java
+++ b/src/com/android/contacts/list/ContactsUnavailableFragment.java
@@ -148,7 +148,7 @@
                 ImplicitIntentsUtil.startActivityOutsideApp(getActivity(), intent);
                 break;
             case R.id.import_contacts_button:
-                ImportDialogFragment.show(getFragmentManager(), getActivity().getClass());
+                ImportDialogFragment.show(getFragmentManager());
                 break;
         }
     }