diff options
Diffstat (limited to 'src/com/android/contacts/common/MoreContactUtils.java')
-rw-r--r-- | src/com/android/contacts/common/MoreContactUtils.java | 406 |
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; + } } |