package com.smartisanos.sidebar.util; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import android.content.Context; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.widget.Toast; import com.smartisanos.sidebar.R; import com.smartisanos.sidebar.receiver.ShortcutReceiver; public class ContactManager extends DataManager{ private static final LOG log = LOG.getInstance(ContactManager.class); private volatile static ContactManager sInstance; public synchronized static ContactManager getInstance(Context context){ if(sInstance == null){ synchronized(ContactManager.class){ if(sInstance == null){ sInstance = new ContactManager(context); } } } return sInstance; } private static final int sMaxNumber = 10; private Context mContext; private List<ContactItem> mContacts = new ArrayList<ContactItem>(); private Handler mHandler; private Toast mLimitToast; private Toast mContactAddedToast; private ContactManager(Context context){ mContext = context; HandlerThread thread = new HandlerThread(ContactManager.class.getName()); thread.start(); mHandler = new ContactManagerHandler(thread.getLooper()); mHandler.obtainMessage(MSG_READ_CONTACTS).sendToTarget(); } public List<ContactItem> getContactList() { List<ContactItem> ret = new ArrayList<ContactItem>(); synchronized (mContacts) { ret.addAll(mContacts); } return ret; } private void readContacts(){ List<ContactItem> list = ContactItem.getContactList(mContext); Collections.sort(list, new ContactComparator()); synchronized(mContacts){ mContacts.clear(); mContacts.addAll(list); } notifyListener(); } public void updateOrder() { synchronized (mContacts) { Collections.sort(mContacts, new ContactComparator()); } notifyListener(); mHandler.obtainMessage(MSG_UPDATE_ORDER).sendToTarget(); } public void removeDoppelgangerShortcut(String pkg) { if (pkg == null) { return; } log.error("removeDoppelgangerShortcut ["+pkg+"]"); mHandler.obtainMessage(MSG_REMOVE_DOPPELGANGER, pkg).sendToTarget(); } public boolean addContact(ContactItem ci) { synchronized (mContacts) { if(mContacts.size() >= sMaxNumber) { showToastDueToLimit(); return false; } for (int i = 0; i < mContacts.size(); ++i) { if (ci.sameContact(mContacts.get(i))) { ci.setIndex(mContacts.get(i).getIndex()); mContacts.set(i, ci); saveContact(ci); showContactAddedToast(); notifyListener(); return true; } } if (mContacts.size() == 0) { ci.setIndex(mContacts.size()); } else { int maxIndex = mContacts.get(0).getIndex(); for (int i = 1; i < mContacts.size(); ++i) { if (mContacts.get(i).getIndex() > maxIndex) { maxIndex = mContacts.get(i).getIndex(); } } ci.setIndex(maxIndex + 1); } ci.newAdded = true; mContacts.add(0, ci); saveContact(ci); showContactAddedToast(); notifyListener(); return true; } } public void remove(ContactItem ci) { synchronized (mContacts) { for (int i = 0; i < mContacts.size(); ++i) { if (ci.sameContact(mContacts.get(i))) { mContacts.remove(i); notifyListener(); deleteContactFromDatabase(ci); return; } } } } private void showToastDueToLimit() { if (mLimitToast != null) { mLimitToast.cancel(); } mLimitToast = Toast.makeText(mContext, mContext.getResources() .getString(R.string.add_at_most_contact_number, sMaxNumber), Toast.LENGTH_SHORT); mLimitToast.show(); } private void showContactAddedToast() { if (mContactAddedToast != null) { mContactAddedToast.cancel(); } mContactAddedToast = Toast.makeText(mContext, R.string.contact_added, Toast.LENGTH_SHORT); mContactAddedToast.show(); } private void saveContact(ContactItem ci){ mHandler.obtainMessage(MSG_SAVE_CONTACT, ci).sendToTarget(); } private void deleteContactFromDatabase(ContactItem ci){ mHandler.obtainMessage(MSG_DELETE_CONTACT, ci).sendToTarget(); } public void onPackageAdded(String packageName){ // NA } public void onPackageRemoved(String packageName) { boolean deleted = false; synchronized (mContacts) { for (int i = 0; i < mContacts.size(); ++i) { ContactItem ci = mContacts.get(i); if (ci.getPackageName().equals(packageName)) { deleted = true; mContacts.remove(i); i--; deleteContactFromDatabase(ci); } } } if (deleted) { notifyListener(); } } public static final class ContactComparator implements Comparator<ContactItem> { @Override public int compare(ContactItem lhs, ContactItem rhs) { if (lhs.getIndex() > rhs.getIndex()) { return -1; } else if (lhs.getIndex() < rhs.getIndex()) { return 1; } else { return 0; } } } private static final int MSG_SAVE_CONTACT = 0; private static final int MSG_DELETE_CONTACT = 1; private static final int MSG_UPDATE_ORDER = 2; private static final int MSG_READ_CONTACTS = 3; private static final int MSG_REMOVE_DOPPELGANGER = 4; private class ContactManagerHandler extends Handler { public ContactManagerHandler(Looper looper) { super(looper, null, false); } @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_SAVE_CONTACT : { ContactItem ci = (ContactItem) msg.obj; ci.save(); break; } case MSG_DELETE_CONTACT : { ContactItem ci = (ContactItem) msg.obj; ci.deleteFromDatabase(); break; } case MSG_UPDATE_ORDER : { synchronized(mContacts){ for(ContactItem cni : mContacts){ cni.save(); } } break; } case MSG_READ_CONTACTS : { readContacts(); break; } case MSG_REMOVE_DOPPELGANGER : { // String pkg = (String) msg.obj; // if (pkg == null) { // break; // } // List<ContactItem> removeList = new ArrayList<ContactItem>(); // if (pkg.equals(ShortcutReceiver.WECHAT)) { // WechatContact.removeDoppelgangerShortcut(mContext); // for (ContactItem item : mContacts) { // if (item instanceof WechatContact) { // WechatContact contact = (WechatContact) item; // if (contact.getUserId() == UserPackage.USER_DOPPELGANGER) { // removeList.add(item); // } // } // } // } else if (pkg.equals(DingDingContact.PKG_NAME)) { // DingDingContact.removeDoppelgangerShortcut(mContext); // for (ContactItem item : mContacts) { // if (item instanceof DingDingContact) { // DingDingContact contact = (DingDingContact) item; // if (contact.systemUid == UserPackage.USER_DOPPELGANGER) { // removeList.add(item); // } // } // } // } // if (removeList.size() > 0) { // synchronized(mContacts) { // for (ContactItem item : removeList) { // mContacts.remove(item); // } // } // } // notifyListener(); break; } } } } }