summaryrefslogtreecommitdiffstats
path: root/src/com/android/contacts/common/MoreContactUtils.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/contacts/common/MoreContactUtils.java')
-rw-r--r--src/com/android/contacts/common/MoreContactUtils.java406
1 files changed, 391 insertions, 15 deletions
diff --git a/src/com/android/contacts/common/MoreContactUtils.java b/src/com/android/contacts/common/MoreContactUtils.java
index c6dd3329..520efd8a 100644
--- a/src/com/android/contacts/common/MoreContactUtils.java
+++ b/src/com/android/contacts/common/MoreContactUtils.java
@@ -22,21 +22,44 @@ import com.google.i18n.phonenumbers.NumberParseException;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import android.content.Context;
+import android.content.ContentProviderOperation;
+import android.content.ContentProviderResult;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.ComponentName;
+import android.content.DialogInterface;
import android.content.Intent;
+import android.content.OperationApplicationException;
+import android.database.Cursor;
import android.graphics.Rect;
import android.net.Uri;
+import android.os.RemoteException;
+import android.os.ServiceManager;
import android.os.SystemProperties;
import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.Email;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.provider.ContactsContract.Data;
+import android.provider.ContactsContract.RawContacts;
import android.provider.Settings;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
+import android.util.Log;
import android.view.View;
import android.widget.TextView;
-import com.android.contacts.common.model.account.AccountType;
import com.android.internal.telephony.PhoneConstants;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.SimAccountType;
+import com.android.internal.telephony.uicc.AdnRecord;
+import com.android.internal.telephony.uicc.IccConstants;
+import com.android.internal.telephony.IIccPhoneBook;
+
+import java.util.ArrayList;
+import java.util.List;
/**
* Shared static contact utility methods.
@@ -44,6 +67,19 @@ import com.android.internal.telephony.PhoneConstants;
public class MoreContactUtils {
private static final String WAIT_SYMBOL_AS_STRING = String.valueOf(PhoneNumberUtils.WAIT);
+ private static final boolean DBG = true;
+ private static final String TAG = "MoreContactUtils";
+ public static final int MAX_LENGTH_NAME_IN_SIM = 14;
+ public static final int MAX_LENGTH_NAME_WITH_CHINESE_IN_SIM = 6;
+ public static final int MAX_LENGTH_NUMBER_IN_SIM = 20;
+ public static final int MAX_LENGTH_EMAIL_IN_SIM = 40;
+ private static final int NAME_POS = 0;
+ private static final int NUMBER_POS = 1;
+ private static final int EMAIL_POS = 2;
+ private static final int ANR_POS = 3;
+ private static final String PHONEBOOK = "simphonebook";
+ public static final String[] MULTI_SIM_NAME = { "perferred_name_sub1",
+ "perferred_name_sub2" };
/**
* Returns true if two data with mimetypes which represent values in contact entries are
@@ -254,9 +290,6 @@ public class MoreContactUtils {
StringBuilder simFilter = new StringBuilder("");
for (int i = 0; i < count; i++) {
- if (!TelephonyManager.getDefault().hasIccCard(i)) {
- continue;
- }
if (TelephonyManager.SIM_STATE_UNKNOWN == TelephonyManager
.getDefault().getSimState(i)) {
simFilter.append(getSimAccountName(i) + ',');
@@ -303,42 +336,385 @@ public class MoreContactUtils {
return subscription;
}
+ public static int getAnrCount(int slot) {
+ int anrCount = 0;
+ /*int[] subId = SubscriptionManager.getSubId(slot);
+ try {
+ IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
+ ServiceManager.getService("simphonebook"));
+
+ if (iccIpb != null) {
+ if (subId != null
+ && TelephonyManager.getDefault().isMultiSimEnabled()) {
+ anrCount = iccIpb.getAnrCountUsingSubId(subId[0]);
+ } else {
+ anrCount = iccIpb.getAnrCount();
+ }
+ }
+ } catch (RemoteException ex) {
+ // ignore it
+ }*/
+
+ return anrCount;
+ }
+
+ public static int getAdnCount(int slot) {
+ int adnCount = 250;
+ /*int[] subId = SubscriptionManager.getSubId(slot);
+ try {
+ IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
+ ServiceManager.getService("simphonebook"));
+
+ if (iccIpb != null) {
+ if (subId != null
+ && TelephonyManager.getDefault().isMultiSimEnabled()) {
+ adnCount = iccIpb.getAdnCountUsingSubId(subId[0]);
+ } else {
+ adnCount = iccIpb.getAdnCount();
+ }
+ }
+ } catch (RemoteException ex) {
+ // ignore it
+ }*/
+
+ return adnCount;
+ }
+
+ public static int getEmailCount(int slot) {
+ int emailCount = 0;
+ /*int[] subId = SubscriptionManager.getSubId(slot);
+ try {
+ IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
+ ServiceManager.getService("simphonebook"));
+
+ if (iccIpb != null) {
+ if (subId != null
+ && TelephonyManager.getDefault().isMultiSimEnabled()) {
+ emailCount = iccIpb.getEmailCountUsingSubId(subId[0]);
+ } else {
+ emailCount = iccIpb.getEmailCount();
+ }
+ }
+ } catch (RemoteException ex) {
+ // ignore it
+ }*/
+
+ return emailCount;
+ }
+
/**
* Returns the subscription's card can save anr or not.
*/
- public static boolean canSaveAnr(int subscription) {
- return false;
- //return getAnrCount(subscription) > 0 ? true : false;
+ public static boolean canSaveAnr(int slot) {
+ return getAnrCount(slot) > 0 ? true : false;
}
/**
* Returns the subscription's card can save email or not.
*/
public static boolean canSaveEmail(int subscription) {
- return false;
- //return getEmailCount(subscription) > 0 ? true : false;
+ return getEmailCount(subscription) > 0 ? true : false;
}
public static int getOneSimAnrCount(int sub) {
int count = 0;
- /*int anrCount = getAnrCount(sub);
+ int anrCount = getAnrCount(sub);
int adnCount = getAdnCount(sub);
if (adnCount > 0) {
count = anrCount % adnCount != 0 ? (anrCount / adnCount + 1)
: (anrCount / adnCount);
- }*/
+ }
return count;
}
public static int getOneSimEmailCount(int sub) {
int count = 0;
- /*int emailCount = getEmailCount(sub);
+ int emailCount = getEmailCount(sub);
int adnCount = getAdnCount(sub);
if (adnCount > 0) {
- count = emailCount % adnCount != 0 ? (emailCount
- / adnCount + 1)
+ count = emailCount % adnCount != 0 ? (emailCount / adnCount + 1)
: (emailCount / adnCount);
- }*/
+ }
return count;
}
+
+ public static boolean insertToPhone(String[] values, final ContentResolver resolver,int sub) {
+ Account account = getAcount(sub);
+ final String name = values[NAME_POS];
+ final String phoneNumber = values[NUMBER_POS];
+ final String emailAddresses = values[EMAIL_POS];
+ final String anrs = values[ANR_POS];
+
+ final String[] emailAddressArray;
+ final String[] anrArray;
+ boolean success = true;
+ if (!TextUtils.isEmpty(emailAddresses)) {
+ emailAddressArray = emailAddresses.split(",");
+ } else {
+ emailAddressArray = null;
+ }
+ if (!TextUtils.isEmpty(anrs)) {
+ anrArray = anrs.split(SimContactsConstants.ANR_SEP);
+ } else {
+ anrArray = null;
+ }
+ if (DBG) {
+ Log.d(TAG, "insertToPhone: name= " + name + ", phoneNumber= " + phoneNumber
+ + ", emails= " + emailAddresses + ", anrs= " + anrs + ", account= " + account);
+ }
+ final ArrayList<ContentProviderOperation> operationList =
+ new ArrayList<ContentProviderOperation>();
+ ContentProviderOperation.Builder builder = ContentProviderOperation
+ .newInsert(RawContacts.CONTENT_URI);
+ builder.withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED);
+
+ if (account != null) {
+ builder.withValue(RawContacts.ACCOUNT_NAME, account.name);
+ builder.withValue(RawContacts.ACCOUNT_TYPE, account.type);
+ }
+ operationList.add(builder.build());
+
+ // do not allow empty value insert into database.
+ if (!TextUtils.isEmpty(name)) {
+ builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
+ builder.withValueBackReference(StructuredName.RAW_CONTACT_ID, 0);
+ builder.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
+ builder.withValue(StructuredName.DISPLAY_NAME, name);
+ operationList.add(builder.build());
+ }
+
+ if (!TextUtils.isEmpty(phoneNumber)) {
+ builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
+ builder.withValueBackReference(Phone.RAW_CONTACT_ID, 0);
+ builder.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
+ builder.withValue(Phone.TYPE, Phone.TYPE_MOBILE);
+ builder.withValue(Phone.NUMBER, phoneNumber);
+ builder.withValue(Data.IS_PRIMARY, 1);
+ operationList.add(builder.build());
+ }
+
+ if (anrArray != null) {
+ for (String anr : anrArray) {
+ if (!TextUtils.isEmpty(anr)) {
+ builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
+ builder.withValueBackReference(Phone.RAW_CONTACT_ID, 0);
+ builder.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
+ builder.withValue(Phone.TYPE, Phone.TYPE_HOME);
+ builder.withValue(Phone.NUMBER, anr);
+ operationList.add(builder.build());
+ }
+ }
+ }
+
+ if (emailAddressArray != null) {
+ for (String emailAddress : emailAddressArray) {
+ if (!TextUtils.isEmpty(emailAddress)) {
+ builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
+ builder.withValueBackReference(Email.RAW_CONTACT_ID, 0);
+ builder.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
+ builder.withValue(Email.TYPE, Email.TYPE_MOBILE);
+ builder.withValue(Email.ADDRESS, emailAddress);
+ operationList.add(builder.build());
+ }
+ }
+ }
+
+ try {
+ ContentProviderResult[] results =
+ resolver.applyBatch(ContactsContract.AUTHORITY, operationList);
+ for (ContentProviderResult result: results) {
+ if (result.uri == null) {
+ success = false;
+ break;
+ }
+ }
+ return success;
+ } catch (RemoteException e) {
+ Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
+ return false;
+ } catch (OperationApplicationException e) {
+ Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
+ return false;
+ }
+ }
+
+ public static Uri insertToCard(Context context, String name, String number, String emails,
+ String anrNumber, int subscription) {
+ // add the max count limit of Chinese code or not
+ if (!TextUtils.isEmpty(name)) {
+ final int maxLen = hasChinese(name) ? MAX_LENGTH_NAME_WITH_CHINESE_IN_SIM
+ : MAX_LENGTH_NAME_IN_SIM;
+ if (name.length() > maxLen) {
+ name = name.substring(0, maxLen);
+ }
+ }
+ Uri result;
+ ContentValues mValues = new ContentValues();
+ mValues.clear();
+ mValues.put(SimContactsConstants.STR_TAG, name);
+ if (!TextUtils.isEmpty(number)) {
+ number = PhoneNumberUtils.stripSeparators(number);
+ if (number.length() > MAX_LENGTH_NUMBER_IN_SIM) {
+ number = number.substring(0, MAX_LENGTH_NUMBER_IN_SIM);
+ }
+
+ mValues.put(SimContactsConstants.STR_NUMBER, number);
+ }
+ if (!TextUtils.isEmpty(emails)) {
+ mValues.put(SimContactsConstants.STR_EMAILS, emails);
+ }
+ if (!TextUtils.isEmpty(anrNumber)) {
+ anrNumber = anrNumber.replaceAll("[^0123456789PWN\\,\\;\\*\\#\\+\\:]", "");
+ mValues.put(SimContactsConstants.STR_ANRS, anrNumber);
+ }
+
+ SimContactsOperation mSimContactsOperation = new SimContactsOperation(context);
+ result = mSimContactsOperation.insert(mValues, subscription);
+
+ if (result != null) {
+ // we should import the contact to the sim account at the same time.
+ String[] value = new String[] {
+ name, number, emails, anrNumber
+ };
+ insertToPhone(value, context.getContentResolver(),subscription);
+ } else {
+ Log.e(TAG, "export contact: [" + name + ", " + number + ", " + emails + "] to slot "
+ + subscription + " failed");
+ }
+ return result;
+ }
+
+ public static Account getAcount(int sub) {
+ Account account = null;
+ if (TelephonyManager.getDefault().isMultiSimEnabled()) {
+ if (sub == PhoneConstants.SUB1) {
+ account = new Account(SimContactsConstants.SIM_NAME_1,
+ SimContactsConstants.ACCOUNT_TYPE_SIM);
+ } else if (sub == PhoneConstants.SUB2) {
+ account = new Account(SimContactsConstants.SIM_NAME_2,
+ SimContactsConstants.ACCOUNT_TYPE_SIM);
+ }
+ } else {
+ if (sub == PhoneConstants.SUB1) {
+ account = new Account(SimContactsConstants.SIM_NAME,
+ SimContactsConstants.ACCOUNT_TYPE_SIM);
+ }
+ }
+ if (account == null) {
+ account = new Account(SimContactsConstants.PHONE_NAME,
+ SimContactsConstants.ACCOUNT_TYPE_PHONE);
+ }
+ return account;
+ }
+
+ public static int getEnabledSimCount() {
+ int mPhoneCount = TelephonyManager.getDefault().getPhoneCount();
+ int enabledSimCount = 0;
+ for (int i = 0; i < mPhoneCount; i++) {
+ if (TelephonyManager.SIM_STATE_READY == TelephonyManager
+ .getDefault().getSimState(i)) {
+ enabledSimCount++;
+ }
+ }
+ return enabledSimCount;
+ }
+
+ public static int getSimFreeCount(Context context, int sub) {
+ String accountName = getAcount(sub).name;
+ int count = 0;
+
+ if (context == null) {
+ return 0;
+ }
+
+ Cursor queryCursor = context.getContentResolver().query(
+ RawContacts.CONTENT_URI,
+ new String[] {
+ RawContacts._ID
+ },
+ RawContacts.ACCOUNT_NAME + " = '" + accountName + "' AND " + RawContacts.DELETED
+ + " = 0", null, null);
+ if (queryCursor != null) {
+ try {
+ count = queryCursor.getCount();
+ } finally {
+ queryCursor.close();
+ }
+ }
+ return getAdnCount(sub) - count;
+ }
+
+ public static int getSpareAnrCount(int sub) {
+ int anrCount = 0;
+ /*int[] subId=SubscriptionManager.getSubId(sub);
+ try {
+ IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(ServiceManager
+ .getService(PHONEBOOK));
+ if (iccIpb != null) {
+ if (subId != null
+ && TelephonyManager.getDefault().isMultiSimEnabled()) {
+ anrCount = iccIpb.getSpareEmailCountUsingSubId(subId[0]);
+ } else {
+ anrCount = iccIpb.getSpareEmailCount();
+ }
+ }
+ } catch (RemoteException ex) {
+ // ignore it
+ } catch (SecurityException ex) {
+ Log.i(TAG, ex.toString());
+ } catch (Exception ex) {
+ }
+ if (DBG) {
+ Log.d(TAG, "getSpareAnrCount(" + sub + ") = " + anrCount);
+ }*/
+ return anrCount;
+ }
+
+ public static int getSpareEmailCount(int sub) {
+ int emailCount = 0;
+ /*int[] subId=SubscriptionManager.getSubId(sub);
+ try {
+ IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(ServiceManager
+ .getService(PHONEBOOK));
+ if (iccIpb != null) {
+ if (subId != null
+ && TelephonyManager.getDefault().isMultiSimEnabled()) {
+ emailCount = iccIpb.getSpareEmailCountUsingSubId(subId[0]);
+ } else {
+ emailCount = iccIpb.getSpareEmailCount();
+ }
+ }
+ } catch (RemoteException ex) {
+ // ignore it
+ } catch (SecurityException ex) {
+ Log.i(TAG, ex.toString());
+ } catch (Exception ex) {
+ }
+ if (DBG) {
+ Log.d(TAG, "getSpareEmailCount(" + sub + ") = " + emailCount);
+ }*/
+ return emailCount;
+ }
+
+ private static boolean hasChinese(String name) {
+ return name != null && name.getBytes().length > name.length();
+ }
+
+ /**
+ * Get SIM card aliases name, which defined in Settings
+ */
+ public static String getMultiSimAliasesName(Context context, int subscription) {
+ if (context == null || subscription < 0) {
+ return null;
+ }
+ String name = "";
+ if (TelephonyManager.getDefault().isMultiSimEnabled()) {
+ name = Settings.System.getString(context.getContentResolver(),
+ MULTI_SIM_NAME[subscription]);
+ }
+ if (TextUtils.isEmpty(name)) {
+ name = getSimAccountName(subscription);
+ }
+ return name;
+ }
}