BluetoothPbapVcardManager.java revision 2c282d5898ac0916470ebfa9ff26ba784cf4bb24
12c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 22c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanpackage com.android.bluetooth.pbap; 32c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 42c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanimport com.android.bluetooth.R; 52c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 62c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanimport android.content.ContentResolver; 72c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanimport android.content.Context; 82c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanimport android.database.Cursor; 92c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanimport android.net.Uri; 102c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanimport android.provider.Contacts; 112c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanimport android.provider.CallLog.Calls; 122c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanimport android.provider.Contacts.Organizations; 132c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanimport android.provider.CallLog; 142c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanimport android.provider.Contacts.People; 152c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanimport android.provider.Contacts.Phones; 162c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanimport android.syncml.pim.vcard.ContactStruct; 172c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanimport android.syncml.pim.vcard.VCardComposer; 182c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanimport android.syncml.pim.vcard.VCardException; 192c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanimport android.syncml.pim.vcard.VCardParser; 202c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanimport android.util.Log; 212c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 222c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanimport java.util.ArrayList; 232c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 242c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fanpublic class BluetoothPbapVcardManager { 252c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan static private final String TAG = "BluetoothPbapVcardManager"; 262c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 272c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan private ContentResolver mResolver; 282c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 292c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan private Context mContext; 302c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 312c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan private String mDefaultName = null; 322c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 332c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan private String mDefaultNumber = null; 342c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 352c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan /** The projection to use when querying the call log table */ 362c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final String[] CALL_LOG_PROJECTION = new String[] { 372c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Calls._ID, Calls.NUMBER, Calls.DATE, Calls.DURATION, Calls.TYPE, Calls.CACHED_NAME, 382c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Calls.CACHED_NUMBER_TYPE, Calls.CACHED_NUMBER_LABEL 392c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan }; 402c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 412c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int ID_COLUMN_INDEX = 0; 422c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 432c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int NUMBER_COLUMN_INDEX = 1; 442c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 452c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int DATE_COLUMN_INDEX = 2; 462c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 472c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int DURATION_COLUMN_INDEX = 3; 482c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 492c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int CALL_TYPE_COLUMN_INDEX = 4; 502c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 512c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int CALLER_NAME_COLUMN_INDEX = 5; 522c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 532c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int CALLER_NUMBERTYPE_COLUMN_INDEX = 6; 542c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 552c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int CALLER_NUMBERLABEL_COLUMN_INDEX = 7; 562c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 572c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan /** The projection to use when querying the phone book table */ 582c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final String[] CONTACT_PROJECTION = new String[] { 592c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People._ID, // 0 602c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.NAME, // 1 612c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.NOTES, // 2 622c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.PRIMARY_PHONE_ID, // 3 632c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.PRESENCE_STATUS, // 4 642c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.STARRED, // 5 652c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.CUSTOM_RINGTONE, // 6 662c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.SEND_TO_VOICEMAIL, // 7 672c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.PHONETIC_NAME, // 8 682c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan }; 692c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 702c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int CONTACT_ID_COLUMN = 0; 712c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 722c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int CONTACT_NAME_COLUMN = 1; 732c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 742c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int CONTACT_NOTES_COLUMN = 2; 752c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 762c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int CONTACT_PREFERRED_PHONE_COLUMN = 3; 772c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 782c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int CONTACT_SERVER_STATUS_COLUMN = 4; 792c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 802c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int CONTACT_STARRED_COLUMN = 5; 812c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 822c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int CONTACT_CUSTOM_RINGTONE_COLUMN = 6; 832c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 842c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int CONTACT_SEND_TO_VOICEMAIL_COLUMN = 7; 852c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 862c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int CONTACT_PHONETIC_NAME_COLUMN = 8; 872c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 882c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final String[] PHONES_PROJECTION = new String[] { 892c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.Phones._ID, // 0 902c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.Phones.NUMBER, // 1 912c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.Phones.TYPE, // 2 922c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.Phones.LABEL, // 3 932c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.Phones.ISPRIMARY, // 4 942c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan }; 952c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 962c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int PHONES_ID_COLUMN = 0; 972c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 982c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int PHONES_NUMBER_COLUMN = 1; 992c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1002c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int PHONES_TYPE_COLUMN = 2; 1012c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1022c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int PHONES_LABEL_COLUMN = 3; 1032c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1042c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int PHONES_ISPRIMARY_COLUMN = 4; 1052c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1062c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final String[] METHODS_PROJECTION = new String[] { 1072c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.ContactMethods._ID, // 0 1082c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.ContactMethods.KIND, // 1 1092c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.ContactMethods.DATA, // 2 1102c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.ContactMethods.TYPE, // 3 1112c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.ContactMethods.LABEL, // 4 1122c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.ContactMethods.ISPRIMARY, // 5 1132c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.ContactMethods.AUX_DATA, // 6 1142c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan }; 1152c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1162c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int METHODS_ID_COLUMN = 0; 1172c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1182c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int METHODS_KIND_COLUMN = 1; 1192c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1202c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int METHODS_DATA_COLUMN = 2; 1212c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1222c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int METHODS_TYPE_COLUMN = 3; 1232c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1242c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int METHODS_LABEL_COLUMN = 4; 1252c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1262c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int METHODS_ISPRIMARY_COLUMN = 5; 1272c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1282c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int METHODS_AUX_DATA_COLUMN = 6; 1292c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1302c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int METHODS_STATUS_COLUMN = 7; 1312c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1322c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final String[] ORGANIZATIONS_PROJECTION = new String[] { 1332c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Organizations._ID, // 0 1342c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Organizations.TYPE, // 1 1352c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Organizations.LABEL, // 2 1362c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Organizations.COMPANY, // 3 1372c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Organizations.TITLE, // 4 1382c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Organizations.ISPRIMARY, // 5 1392c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan }; 1402c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1412c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int ORGANIZATIONS_ID_COLUMN = 0; 1422c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1432c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int ORGANIZATIONS_TYPE_COLUMN = 1; 1442c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1452c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int ORGANIZATIONS_LABEL_COLUMN = 2; 1462c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1472c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int ORGANIZATIONS_COMPANY_COLUMN = 3; 1482c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1492c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int ORGANIZATIONS_TITLE_COLUMN = 4; 1502c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1512c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public static final int ORGANIZATIONS_ISPRIMARY_COLUMN = 5; 1522c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1532c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public BluetoothPbapVcardManager(final Context context) { 1542c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan mContext = context; 1552c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan mResolver = mContext.getContentResolver(); 1562c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan mDefaultName = context.getString(android.R.string.unknownName); 1572c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan mDefaultNumber = context.getString(R.string.defaultnumber); 1582c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 1592c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1602c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan private String getThisPhoneName() { 1612c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan String name = ""; 1622c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan name = BluetoothPbapService.getLocalPhoneName(); 1632c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (name == null || name.trim().length() == 0) { 1642c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan name = mDefaultName; 1652c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 1662c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return name; 1672c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 1682c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1692c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan private String getThisPhoneNumber() { 1702c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan String number = ""; 1712c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan number = BluetoothPbapService.getLocalPhoneNum(); 1722c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (number == null || number.trim().length() == 0) { 1732c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan number = mDefaultNumber; 1742c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 1752c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return number; 1762c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 1772c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1782c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public final int getPhonebookSize() { 1792c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Uri myUri = Contacts.People.CONTENT_URI; 1802c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan int mPhonebookSize = 0; 1812c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Cursor contactC = mResolver.query(myUri, null, null, null, null); 1822c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (contactC != null) { 1832c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan mPhonebookSize = contactC.getCount() + 1; // always has the 0.vcf 1842c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 1852c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return mPhonebookSize; 1862c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 1872c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 1882c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public final String getPhonebook(final int pos, final boolean vCard21) { 1892c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan int size = getPhonebookSize(); 1902c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan long id = 0; 1912c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan try { 1922c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (pos >= 0 && pos < size) { 1932c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Uri myUri = Contacts.People.CONTENT_URI; 1942c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan // Individual Contact may be deleted,but Uri in database is also 1952c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan // removed.So we need to calculate the actual Uri 1962c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (pos > 0) { 1972c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Cursor personCursor = mResolver.query(myUri, CONTACT_PROJECTION, null, null, 1982c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan null); 1992c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (personCursor != null) { 2002c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan personCursor.moveToPosition(pos - 1); 2012c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan id = personCursor.getLong(CONTACT_ID_COLUMN); 2022c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan personCursor.close(); 2032c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 2042c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan String sPos = String.valueOf(id); 2052c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan myUri = Uri.withAppendedPath(myUri, sPos); 2062c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 2072c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return loadPhonebook(myUri, pos, vCard21); 2082c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } else { 2092c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Log.w(TAG, "pos invalid"); 2102c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 2112c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } catch (Exception e) { 2122c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Log.e(TAG, "catch exception" + e.toString()); 2132c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 2142c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return null; 2152c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 2162c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 2172c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public final int getCallHistorySize(final int type) { 2182c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan int size = 0; 2192c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Uri myUri = CallLog.Calls.CONTENT_URI; 2202c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan String selection = null; 2212c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan switch (type) { 2222c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan case BluetoothPbapObexServer.NEED_INCOMING_CALL_NUMBER: 2232c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan selection = Calls.TYPE + "=" + CallLog.Calls.INCOMING_TYPE; 2242c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan break; 2252c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan case BluetoothPbapObexServer.NEED_OUTGOING_CALL_NUMBER: 2262c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan selection = Calls.TYPE + "=" + CallLog.Calls.OUTGOING_TYPE; 2272c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan break; 2282c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan case BluetoothPbapObexServer.NEED_MISSED_CALL_NUMBER: 2292c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan selection = Calls.TYPE + "=" + CallLog.Calls.MISSED_TYPE; 2302c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan break; 2312c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan default: 2322c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan break; 2332c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 2342c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Cursor callCursor = mResolver.query(myUri, null, selection, null, 2352c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan CallLog.Calls.DEFAULT_SORT_ORDER); 2362c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (callCursor != null) { 2372c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan size = callCursor.getCount(); 2382c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan callCursor.close(); 2392c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 2402c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return size; 2412c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 2422c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 2432c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public final String getCallHistory(final int pos, final int type, final boolean vCard21) { 2442c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan int size = 0; 2452c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan String selection = null; 2462c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan switch (type) { 2472c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan case BluetoothPbapObexServer.NEED_INCOMING_CALL_NUMBER: 2482c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan selection = Calls.TYPE + "=" + CallLog.Calls.INCOMING_TYPE; 2492c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan break; 2502c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan case BluetoothPbapObexServer.NEED_OUTGOING_CALL_NUMBER: 2512c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan selection = Calls.TYPE + "=" + CallLog.Calls.OUTGOING_TYPE; 2522c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan break; 2532c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan case BluetoothPbapObexServer.NEED_MISSED_CALL_NUMBER: 2542c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan selection = Calls.TYPE + "=" + CallLog.Calls.MISSED_TYPE; 2552c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan break; 2562c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan default: 2572c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan break; 2582c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 2592c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan size = getCallHistorySize(type); 2602c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan try { 2612c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (pos >= 0 && pos < size) { 2622c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Uri myUri = CallLog.Calls.CONTENT_URI; 2632c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return loadCallHistory(myUri, pos, selection, vCard21); 2642c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } else { 2652c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Log.w(TAG, "pos invalid"); 2662c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 2672c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } catch (Exception e) { 2682c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Log.e(TAG, "catch exception e" + e.toString()); 2692c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 2702c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 2712c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return null; 2722c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 2732c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 2742c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public final ArrayList<String> loadNameList() { 2752c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan ArrayList<String> nameList = new ArrayList<String>(); 2762c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan int size = getPhonebookSize(); 2772c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Uri myUri = Contacts.People.CONTENT_URI; 2782c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Cursor contactC = mResolver.query(myUri, null, null, null, null); 2792c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan for (int pos = 0; pos < size; pos++) { 2802c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (pos == 0) { 2812c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan nameList.add(getThisPhoneName()); 2822c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } else { 2832c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (contactC != null) { 2842c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan contactC.moveToPosition(pos - 1); 2852c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan String name = contactC.getString(contactC 2862c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan .getColumnIndexOrThrow(Contacts.People.NAME)); 2872c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (name == null || name.trim().length() == 0) { 2882c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan name = mDefaultName; 2892c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 2902c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan nameList.add(name); 2912c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 2922c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 2932c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 2942c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (contactC != null) { 2952c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan contactC.close(); 2962c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 2972c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return nameList; 2982c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 2992c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 3002c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public final ArrayList<String> loadNumberList() { 3012c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan ArrayList<String> numberList = new ArrayList<String>(); 3022c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (numberList.size() > 0) { 3032c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan numberList.clear(); 3042c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 3052c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan int size = getPhonebookSize(); 3062c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Uri myUri = Contacts.People.CONTENT_URI; 3072c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Cursor contactC = mResolver.query(myUri, null, null, null, null); 3082c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan for (int pos = 0; pos < size; pos++) { 3092c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (pos == 0) { 3102c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan numberList.add(getThisPhoneNumber()); 3112c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } else { 3122c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan contactC.moveToPosition(pos - 1); 3132c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan String number = contactC.getString(contactC 3142c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan .getColumnIndexOrThrow(Contacts.People.PRIMARY_PHONE_ID)); 3152c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (number == null || number.trim().length() == 0) { 3162c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan number = mDefaultNumber; 3172c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 3182c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan numberList.add(number); 3192c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 3202c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 3212c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return numberList; 3222c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 3232c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 3242c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan public final ArrayList<String> loadCallHistoryList(final int type) { 3252c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan int size = 0; 3262c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan String selection = null; 3272c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Uri myUri = CallLog.Calls.CONTENT_URI; 3282c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan ArrayList<String> list = new ArrayList<String>(); 3292c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan switch (type) { 3302c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan case BluetoothPbapObexServer.NEED_INCOMING_CALL_NUMBER: 3312c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan selection = Calls.TYPE + "=" + CallLog.Calls.INCOMING_TYPE; 3322c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan break; 3332c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan case BluetoothPbapObexServer.NEED_OUTGOING_CALL_NUMBER: 3342c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan selection = Calls.TYPE + "=" + CallLog.Calls.OUTGOING_TYPE; 3352c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan break; 3362c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan case BluetoothPbapObexServer.NEED_MISSED_CALL_NUMBER: 3372c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan selection = Calls.TYPE + "=" + CallLog.Calls.MISSED_TYPE; 3382c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan break; 3392c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan default: 3402c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan break; 3412c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 3422c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan size = getCallHistorySize(type); 3432c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Cursor callCursor = mResolver.query(myUri, CALL_LOG_PROJECTION, selection, null, 3442c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan CallLog.Calls.DEFAULT_SORT_ORDER); 3452c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (callCursor != null) { 3462c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan for (int pos = 0; pos < size; pos++) { 3472c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan callCursor.moveToPosition(pos); 3482c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan String name = callCursor.getString(CALLER_NAME_COLUMN_INDEX); 3492c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (name == null || name.trim().length() == 0) { 3502c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan // name not found,use number instead 3512c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan name = callCursor.getString(NUMBER_COLUMN_INDEX); 3522c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 3532c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan list.add(name); 3542c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 3552c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan callCursor.close(); 3562c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 3572c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return list; 3582c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 3592c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 3602c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan private final String loadCallHistory(final Uri mUri, final int pos, final String selection, 3612c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan final boolean vCard21) { 3622c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan ContactStruct contactStruct = new ContactStruct(); 3632c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Cursor callCursor = mResolver.query(mUri, CALL_LOG_PROJECTION, selection, null, 3642c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan CallLog.Calls.DEFAULT_SORT_ORDER); 3652c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (callCursor != null) { 3662c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (callCursor.moveToPosition(pos)) { 3672c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan contactStruct.name = callCursor.getString(CALLER_NAME_COLUMN_INDEX); 3682c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (contactStruct.name == null || contactStruct.name.trim().length() == 0) { 3692c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan contactStruct.name = callCursor.getString(NUMBER_COLUMN_INDEX); 3702c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 3712c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan String number = callCursor.getString(NUMBER_COLUMN_INDEX); 3722c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan int type = callCursor.getInt(CALLER_NUMBERTYPE_COLUMN_INDEX); 3732c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan String label = callCursor.getString(CALLER_NUMBERLABEL_COLUMN_INDEX); 3742c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (label == null || label.trim().length() == 0) { 3752c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan label = Integer.toString(type); 3762c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 3772c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan contactStruct.addPhone(type, number, label, true); 3782c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 3792c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan callCursor.close(); 3802c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 3812c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan try { 3822c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan VCardComposer composer = new VCardComposer(); 3832c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (vCard21) { 3842c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return composer.createVCard(contactStruct, VCardParser.VERSION_VCARD21_INT); 3852c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } else { 3862c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return composer.createVCard(contactStruct, VCardParser.VERSION_VCARD30_INT); 3872c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 3882c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } catch (VCardException e) { 3892c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Log.e(TAG, "catch exception" + e.toString()); 3902c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return null; 3912c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 3922c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 3932c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 3942c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan private final String loadPhonebook(final Uri mUri, final int pos, final boolean vCard21) { 3952c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan // Build up the phone entries 3962c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan ContactStruct contactStruct = new ContactStruct(); 3972c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Cursor personCursor = mResolver.query(mUri, CONTACT_PROJECTION, null, null, null); 3982c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (personCursor == null) { 3992c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return null; 4002c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 4012c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (pos == 0) { 4022c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan contactStruct.name = getThisPhoneName(); 4032c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan contactStruct.addPhone(Contacts.PhonesColumns.TYPE_MOBILE, getThisPhoneNumber(), "", 4042c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan true); 4052c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } else if (personCursor.moveToNext()) { 4062c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan contactStruct.name = personCursor.getString(CONTACT_NAME_COLUMN); 4072c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (contactStruct.name == null || contactStruct.name.trim().length() == 0) { 4082c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan contactStruct.name = mDefaultName; 4092c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 4102c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan contactStruct.notes.add(checkStrEnd(personCursor.getString(CONTACT_NOTES_COLUMN), 4112c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan vCard21)); 4122c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan final Uri phonesUri = Uri.withAppendedPath(mUri, People.Phones.CONTENT_DIRECTORY); 4132c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan final Cursor phonesCursor = mResolver.query(phonesUri, PHONES_PROJECTION, null, null, 4142c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Phones.ISPRIMARY + " DESC"); 4152c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (phonesCursor != null) { 4162c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan while (phonesCursor.moveToNext()) { 4172c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan int type = phonesCursor.getInt(PHONES_TYPE_COLUMN); 4182c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan String number = phonesCursor.getString(PHONES_NUMBER_COLUMN); 4192c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan String label = phonesCursor.getString(PHONES_LABEL_COLUMN); 4202c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan contactStruct.addPhone(type, number, label, true); 4212c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 4222c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan phonesCursor.close(); 4232c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 4242c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan // Build the contact method entries 4252c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan final Uri methodsUri = Uri.withAppendedPath(mUri, 4262c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan People.ContactMethods.CONTENT_DIRECTORY); 4272c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Cursor methodsCursor = mResolver 4282c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan .query(methodsUri, METHODS_PROJECTION, null, null, null); 4292c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (methodsCursor != null) { 4302c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan while (methodsCursor.moveToNext()) { 4312c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan int kind = methodsCursor.getInt(METHODS_KIND_COLUMN); 4322c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan String label = methodsCursor.getString(METHODS_LABEL_COLUMN); 4332c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan String data = methodsCursor.getString(METHODS_DATA_COLUMN); 4342c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan int type = methodsCursor.getInt(METHODS_TYPE_COLUMN); 4352c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan boolean isPrimary = methodsCursor.getInt(METHODS_ISPRIMARY_COLUMN) == 1 ? true 4362c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan : false; 4372c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan // TODO 4382c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan // Below code is totally depend on the implementation of 4392c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan // package android.syncml.pim.vcard 4402c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan // VcardComposer shall throw null pointer exception when 4412c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan // label is not set 4422c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan // function appendContactMethodStr is weak and shall be 4432c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan // improved in the future 4442c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (kind == Contacts.KIND_EMAIL) { 4452c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (type == Contacts.ContactMethodsColumns.TYPE_OTHER) { 4462c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (label == null || label.trim().length() == 0) { 4472c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan label = Integer.toString(type); 4482c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 4492c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 4502c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 4512c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (kind == Contacts.KIND_POSTAL) { 4522c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan data = checkStrEnd(data, vCard21); 4532c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 4542c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan contactStruct.addContactmethod(kind, type, data, label, isPrimary); 4552c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 4562c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan methodsCursor.close(); 4572c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 4582c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 4592c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan // Build the organization entries 4602c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan final Uri organizationsUri = Uri 4612c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan .withAppendedPath(mUri, Organizations.CONTENT_DIRECTORY); 4622c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Cursor organizationsCursor = mResolver.query(organizationsUri, 4632c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan ORGANIZATIONS_PROJECTION, "isprimary", null, null); 4642c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 4652c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (organizationsCursor != null) { 4662c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan while (organizationsCursor.moveToNext()) { 4672c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan int type = organizationsCursor.getInt(ORGANIZATIONS_TYPE_COLUMN); 4682c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan String company = organizationsCursor.getString(ORGANIZATIONS_COMPANY_COLUMN); 4692c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan String title = checkStrEnd(organizationsCursor 4702c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan .getString(ORGANIZATIONS_TITLE_COLUMN), vCard21); 4712c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan boolean isPrimary = organizationsCursor.getInt(ORGANIZATIONS_ISPRIMARY_COLUMN) == 1 ? true 4722c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan : false; 4732c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan contactStruct.addOrganization(type, company, title, isPrimary); 4742c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 4752c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan organizationsCursor.close(); 4762c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 4772c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 4782c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan personCursor.close(); 4792c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan // Generate vCard data. 4802c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan try { 4812c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan VCardComposer composer = new VCardComposer(); 4822c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (vCard21) { 4832c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return composer.createVCard(contactStruct, VCardParser.VERSION_VCARD21_INT); 4842c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } else { 4852c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return composer.createVCard(contactStruct, VCardParser.VERSION_VCARD30_INT); 4862c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 4872c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } catch (VCardException e) { 4882c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan Log.e(TAG, "catch exception in loadPhonebook" + e.toString()); 4892c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return null; 4902c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 4912c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 4922c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 4932c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan /** 4942c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan * This function is to check the string end to avoid function 4952c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan * foldingString's returning null in package android.syncml.pim.vcard 4962c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan */ 4972c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan private final String checkStrEnd(String str, final boolean vCard21) { 4982c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (str == null) { 4992c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return str; 5002c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 5012c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (str.charAt(str.length() - 1) != '\n') { 5022c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan if (vCard21) { 5032c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan str += "\r\n"; 5042c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } else { 5052c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan str += "\n"; 5062c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 5072c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 5082c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan return str; 5092c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan } 5102c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan 5112c282d5898ac0916470ebfa9ff26ba784cf4bb24Jackson Fan} 512