Use SimCard class in ImportDialogFragment
This simplifies the ImportDialogFragment and makes reading of the SIMs more
consistent in the App.
Test
manual: open ImportDialog fragment on phones with 1 and 2 SIM cards
Change-Id: Ie0f2ead2d29c2b7c208a060bee1292533c51b967
diff --git a/res/values/strings.xml b/res/values/strings.xml
index cdea367..b6bfafb 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1373,16 +1373,7 @@
<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>\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>
+ <string name="import_from_sim_summary_fmt">Import from SIM <xliff:g id="sim_name">%1$s</xliff:g></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/database/SimContactDao.java b/src/com/android/contacts/common/database/SimContactDao.java
index d55a70f..f5880a8 100644
--- a/src/com/android/contacts/common/database/SimContactDao.java
+++ b/src/com/android/contacts/common/database/SimContactDao.java
@@ -234,9 +234,10 @@
new SimContact(1, "Sim One", "15095550111", null),
new SimContact(2, "Sim Two", "15095550112", null),
new SimContact(3, "Sim Three", "15095550113", null),
- new SimContact(4, "Sim Four", "15095550114", null)
+ new SimContact(4, "Sim Four", "15095550114", null),
+ new SimContact(5, "411 & more", "411", null)
))
- .addSimCard(new SimCard("fake-sim-id2", 1, "Carrier Two", "Card 2",
+ .addSimCard(new SimCard("fake-sim-id2", 2, "Carrier Two", "Card 2",
"15095550102", "us").withContacts(
new SimContact(1, "John Sim", "15095550121", null),
new SimContact(2, "Bob Sim", "15095550122", null),
diff --git a/src/com/android/contacts/common/interactions/ImportDialogFragment.java b/src/com/android/contacts/common/interactions/ImportDialogFragment.java
index 30c6603..2268854 100644
--- a/src/com/android/contacts/common/interactions/ImportDialogFragment.java
+++ b/src/com/android/contacts/common/interactions/ImportDialogFragment.java
@@ -24,14 +24,10 @@
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;
+import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
@@ -44,15 +40,15 @@
import com.android.contacts.common.R;
import com.android.contacts.common.compat.CompatUtils;
import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
+import com.android.contacts.common.database.SimContactDao;
import com.android.contacts.common.model.AccountTypeManager;
+import com.android.contacts.common.model.SimCard;
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.editor.SelectAccountDialogFragment;
import java.util.List;
-import java.util.Locale;
-import java.util.Set;
/**
* An dialog invoked to import/export contacts.
@@ -67,6 +63,7 @@
public static final String EXTRA_SIM_ONLY = "extraSimOnly";
private boolean mSimOnly = false;
+ private SimContactDao mSimDao;
private final String[] LOOKUP_PROJECTION = new String[] {
Contacts.LOOKUP_KEY
@@ -97,6 +94,7 @@
final Bundle args = getArguments();
mSimOnly = args != null && args.getBoolean(EXTRA_SIM_ONLY, false);
+ mSimDao = SimContactDao.create(getContext());
}
@Override
@@ -112,7 +110,6 @@
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Wrap our context to inflate list items using the correct theme
- final Resources res = getActivity().getResources();
final LayoutInflater dialogInflater = (LayoutInflater)getActivity()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
@@ -129,48 +126,7 @@
}
};
- final TelephonyManager manager =
- (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
- 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));
- }
-
- if (CompatUtils.isMSIMCompatible()) {
- mSubscriptionManager = SubscriptionManager.from(getActivity());
- if (manager != null && res.getBoolean(R.bool.config_allow_sim_import)) {
- List<SubscriptionInfo> subInfoRecords = null;
- try {
- subInfoRecords = mSubscriptionManager.getActiveSubscriptionInfoList();
- } catch (SecurityException e) {
- Log.w(TAG, "SecurityException thrown, lack permission for"
- + " getActiveSubscriptionInfoList", e);
- }
- if (subInfoRecords != null) {
- 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),
- R.string.import_from_sim, record.getSubscriptionId()));
- }
- }
- }
- }
- } else {
- if (manager != null && manager.hasIccCard()
- && res.getBoolean(R.bool.config_allow_sim_import)) {
- adapter.add(new AdapterEntry(getString(R.string.import_from_sim),
- R.string.import_from_sim, -1));
- }
- }
-
+ addItems(adapter);
final DialogInterface.OnClickListener clickListener =
new DialogInterface.OnClickListener() {
@@ -201,6 +157,25 @@
.create();
}
+ private void addItems(ArrayAdapter<AdapterEntry> adapter) {
+ final Resources res = getActivity().getResources();
+ 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));
+ }
+ final List<SimCard> sims = mSimDao.getSimCards();
+
+ if (sims.size() == 1) {
+ adapter.add(new AdapterEntry(getString(R.string.import_from_sim),
+ R.string.import_from_sim, SimCard.NO_SUBSCRIPTION_ID));
+ return;
+ }
+ for (SimCard sim : sims) {
+ adapter.add(new AdapterEntry(getSimDescription(sim), R.string.import_from_sim,
+ sim.getSubscriptionId()));
+ }
+ }
+
private boolean handleSimImportRequest(int subscriptionId) {
SimImportFragment.newInstance(subscriptionId).show(getFragmentManager(), "SimImport");
return true;
@@ -260,62 +235,23 @@
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;
- }
+ private CharSequence getSimDescription(SimCard sim) {
+ final CharSequence name = sim.getDisplayName();
+ CharSequence number = sim.getFormattedPhone();
+ // If formatting fails use the raw phone number
+ if (number == null) {
+ number = sim.getPhone();
}
- return true;
- }
-
- private CharSequence getSubDescription(SubscriptionInfo record) {
- final CharSequence name = record.getDisplayName();
- final CharSequence number = getFormattedNumber(record);
-
+ if (number != null) {
+ number = PhoneNumberUtilsCompat.createTtsSpannable(number);
+ }
if (TextUtils.isEmpty(number)) {
- return getString(R.string.import_from_sim_summary_no_number, name);
+ return getString(R.string.import_from_sim_summary_fmt, name);
}
-
- return TextUtils.expandTemplate(getString(R.string.import_from_sim_summary), name, number);
+ return new SpannableStringBuilder(getString(R.string.import_from_sim_summary_fmt, name))
+ .append('\n').append(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/model/SimCard.java b/src/com/android/contacts/common/model/SimCard.java
index ad91546..9b5486b 100644
--- a/src/com/android/contacts/common/model/SimCard.java
+++ b/src/com/android/contacts/common/model/SimCard.java
@@ -17,6 +17,7 @@
import android.os.Build;
import android.support.annotation.RequiresApi;
+import android.telephony.PhoneNumberUtils;
import android.telephony.SubscriptionInfo;
import android.telephony.TelephonyManager;
import android.util.Log;
@@ -26,6 +27,7 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Locale;
import java.util.Objects;
/**
@@ -73,7 +75,7 @@
mCarrierName = carrierName;
mDisplayName = displayName;
mPhoneNumber = phoneNumber;
- mCountryCode = countryCode;
+ mCountryCode = countryCode != null ? countryCode.toUpperCase(Locale.US) : null;
}
public SimCard(String simId, CharSequence carrierName,
@@ -89,6 +91,21 @@
return mSubscriptionId;
}
+ public CharSequence getDisplayName() {
+ return mDisplayName;
+ }
+
+ public String getPhone() {
+ return mPhoneNumber;
+ }
+
+ public CharSequence getFormattedPhone() {
+ if (mPhoneNumber == null) {
+ return null;
+ }
+ return PhoneNumberUtils.formatNumber(mPhoneNumber, mCountryCode);
+ }
+
public boolean hasContacts() {
if (mContacts == null) {
throw new IllegalStateException("Contacts not loaded.");