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