package com.smartisanos.sidebar.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract;
import android.text.TextUtils;
public class MailContactsHelper {
private volatile static MailContactsHelper sInstance;
public synchronized static MailContactsHelper getInstance(Context context){
if(sInstance == null){
synchronized(MailContactsHelper.class){
if(sInstance == null){
sInstance = new MailContactsHelper(context);
}
}
}
return sInstance;
}
private Context mContext = null;
private ContentObserver mContentObserver = null;
private Map<String, List<Contact>> mContactsMap = new HashMap<String, List<Contact>>();
private ContactRefreshAsyncTask mGenerateContactTask;
private MailContactsHelper(Context context) {
mContext = context;
sendLoadingContactMessage();
registerContentObserver();
}
private void registerContentObserver() {
mContentObserver = new ContactsObserver(mHandler);
mContext.getContentResolver().registerContentObserver(ContactsContract.CommonDataKinds.Email.CONTENT_URI, true, mContentObserver);
}
public boolean isContact(String address) {
synchronized (MailContactsHelper.class) {
return mContactsMap.containsKey(address);
}
}
public long getContactId(String address) {
synchronized (MailContactsHelper.class) {
if (TextUtils.isEmpty(address) || mContactsMap.isEmpty()
|| !mContactsMap.containsKey(address))
return -1;
return getContectNameList(address).get(0).id;
}
}
private List<Contact> getContectNameList(String address) {
synchronized (MailContactsHelper.class) {
return mContactsMap.get(address);
}
}
private void sendLoadingContactMessage() {
mHandler.removeMessages(MSG_CONTACTS_CHANGED);
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CONTACTS_CHANGED), 500);
}
private void setContactsMap(Map<String, List<Contact>> contactsMap) {
synchronized (MailContactsHelper.class) {
mContactsMap.clear();
mContactsMap.putAll(contactsMap);
}
}
private static final int MSG_CONTACTS_CHANGED = 1;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_CONTACTS_CHANGED:
if (mGenerateContactTask != null) {
mGenerateContactTask.cancel(true);
}
mGenerateContactTask = new ContactRefreshAsyncTask();
mGenerateContactTask.execute();
break;
default:
break;
}
}
};
private Map<String, List<Contact>> getAllContactsWithEmail() {
Map<String, List<Contact>> contactsMap = new HashMap<String, List<Contact>>();
Cursor cursor = null;
try {
cursor = mContext.getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
new String[] {
ContactsContract.Contacts._ID, ContactsContract.Contacts.LOOKUP_KEY,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Email.ADDRESS
}, null, null, null);
if(cursor != null && cursor.moveToFirst()){
do{
Contact contact = new Contact();
contact.id = cursor.getLong(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
contact.email = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Email.ADDRESS));
contact.name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
if (contactsMap.containsKey(contact.email)) {
contactsMap.get(contact.email).add(contact);
} else {
List<Contact> list = new ArrayList<Contact>();
list.add(contact);
contactsMap.put(contact.email, list);
}
}while(cursor.moveToNext());
}
return contactsMap;
} finally {
if (cursor != null) {
cursor.close();
}
}
}
class Contact {
public long id;
public String email;
public String name;
}
private class ContactsObserver extends ContentObserver {
public ContactsObserver(final Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
mHandler.obtainMessage(MSG_CONTACTS_CHANGED).sendToTarget();
}
}
private class ContactRefreshAsyncTask extends AsyncTask<Object, Object, Void> {
@Override
protected Void doInBackground(Object... params) {
setContactsMap(getAllContactsWithEmail());
return null;
}
}
}