package com.hacktoolkit.android.utils; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentUris; import android.content.res.AssetFileDescriptor; import android.database.Cursor; import android.net.Uri; import android.os.AsyncTask; import android.provider.ContactsContract; import android.provider.ContactsContract.Contacts; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import com.hacktoolkit.android.adapters.HTKContactsAdapter; import com.hacktoolkit.android.fragments.ContactsFragment; import com.hacktoolkit.android.models.HTKContact; public class ContactsUtils { /** * Wrapper for getContactsWithPhone to offload the work from the main UI activity thread and do it asynchronously * * @param currentActivity * @param adapter the adapter to populate when contacts have been loaded */ public static void getContactsWithPhoneAsync(final Activity currentActivity, final HTKContactsAdapter adapter) { AsyncTask<Void, Void, ArrayList<HTKContact>> getContactsAsyncTask = new AsyncTask<Void, Void, ArrayList<HTKContact>>() { @Override protected ArrayList<HTKContact> doInBackground(Void... v) { if (currentActivity instanceof FragmentActivity) { FragmentManager fragmentManager = ((FragmentActivity) currentActivity).getSupportFragmentManager(); ContactsFragment contactsFragment = (ContactsFragment) fragmentManager.findFragmentByTag("contacts"); if (contactsFragment != null) { contactsFragment.startRetrieving(); } } ArrayList<HTKContact> resultContacts = ContactsUtils.getContactsWithPhone(currentActivity); return resultContacts; } @Override protected void onPostExecute(ArrayList<HTKContact> resultContacts) { if (currentActivity != null) { if (currentActivity instanceof FragmentActivity) { FragmentManager fragmentManager = ((FragmentActivity) currentActivity).getSupportFragmentManager(); ContactsFragment contactsFragment = (ContactsFragment) fragmentManager.findFragmentByTag("contacts"); if (contactsFragment != null) { HTKContactsAdapter adapter = contactsFragment.getAdapter(); if (adapter != null) { adapter.loadContacts(resultContacts); } } } else { adapter.loadContacts(resultContacts); } } } }; getContactsAsyncTask.execute(); } public static ArrayList<HTKContact> getContactsWithPhone(Activity currentActivity) { ContentResolver contentResolver = currentActivity.getContentResolver(); Uri uri = ContactsContract.Contacts.CONTENT_URI; String[] projection = { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER, ContactsContract.Contacts.STARRED, ContactsContract.Contacts.TIMES_CONTACTED, ContactsContract.Contacts.LAST_TIME_CONTACTED, }; String selection = String.format("%s > 0", ContactsContract.Contacts.HAS_PHONE_NUMBER); String[] selectionArgs = null; String sortOrder = String.format( "%s DESC, %s DESC, %S DESC, UPPER(%s) ASC", ContactsContract.Contacts.STARRED, ContactsContract.Contacts.TIMES_CONTACTED, ContactsContract.Contacts.LAST_TIME_CONTACTED, ContactsContract.Contacts.DISPLAY_NAME ); Cursor cursor = contentResolver.query(uri, projection, selection, selectionArgs, sortOrder); ArrayList<HTKContact> contacts = new ArrayList<HTKContact>(); if (cursor.getCount() > 0) { while (cursor.moveToNext()) { HTKContact contact = new HTKContact(); String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); String phone = ""; String phoneType = ""; if (Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { // System.out.println("name : " + name + ", ID : " + id); String[] phoneData = getPhoneForContactId(contentResolver, contactId); phone = phoneData[0]; phoneType = phoneData[1]; contact.setData("id", Integer.valueOf(contactId)); contact.setData("name", name); contact.setData("phone", phone); contact.setData("phoneType", phoneType); contacts.add(contact); } } cursor.close(); } return contacts; } public static String[] getPhoneForContactId(ContentResolver contentResolver, String contactId) { String[] phoneData = null; Cursor phoneCursor = contentResolver.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { contactId }, null ); String phone = ""; String phoneType = ""; while (phoneCursor.moveToNext()) { // grab the first phone number phone = phoneCursor.getString( phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); phoneType = getPhoneType(phoneCursor); break; } phoneCursor.close(); phoneData = new String[] { phone, phoneType }; return phoneData; } public static String getPhoneType(Cursor phoneCursor) { String phoneType = ""; int type = Integer.parseInt(phoneCursor.getString( phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE))); if (type == ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM) { phoneType = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.LABEL)); } else { switch(type) { case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: phoneType = "Home"; break; case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE: phoneType = "Mobile"; break; case ContactsContract.CommonDataKinds.Phone.TYPE_WORK: phoneType = "Work"; break; case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK: phoneType = "Work Fax"; break; case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME: phoneType = "Home Fax"; break; case ContactsContract.CommonDataKinds.Phone.TYPE_PAGER: phoneType = "Pager"; break; case ContactsContract.CommonDataKinds.Phone.TYPE_OTHER: phoneType = "Other"; break; case ContactsContract.CommonDataKinds.Phone.TYPE_CALLBACK: phoneType = "Callback"; break; // other types: //http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Phone.html default: break; } } return phoneType; } public static InputStream openPhoto(Activity currentActivity, long contactId) { if (HTKUtils.getCurrentAPIVersion() < android.os.Build.VERSION_CODES.HONEYCOMB) { return null; } Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); Uri photoUri = Uri.withAppendedPath(contactUri, Contacts.Photo.CONTENT_DIRECTORY); Cursor cursor = currentActivity.getContentResolver().query(photoUri, new String[] { Contacts.Photo.PHOTO}, null, null, null); if (cursor == null) { return null; } try { if (cursor.moveToFirst()) { byte[] data = cursor.getBlob(0); if (data != null) { return new ByteArrayInputStream(data); } } } finally { cursor.close(); } return null; } public static InputStream openDisplayPhoto(Activity currentActivity, long contactId) { if (HTKUtils.getCurrentAPIVersion() < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) { return null; } Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); Uri displayPhotoUri = Uri.withAppendedPath(contactUri, Contacts.Photo.DISPLAY_PHOTO); try { AssetFileDescriptor fd = currentActivity.getContentResolver().openAssetFileDescriptor(displayPhotoUri, "r"); return fd.createInputStream(); } catch (IOException e) { return null; } } }