package com.android.mms.data;
import android.content.ContentValues;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.provider.ContactsContract;
import android.util.Log;
public class ContactContentObserber extends ContentObserver {
private static String TAG = "ContactContentObserber";
private static boolean isUpdateThreadsRunning = false;
private static boolean isRunAgain = false;
private Context mContext;
private static Uri THREADS_ALL = Uri.parse("content://mms-sms/threads-all");
private int ID = 0;
private int RECIPIENT_ADDRESSES = 1;
private int RECIPIENT_NAMES = 2;
public ContactContentObserber(Handler handler, Context context) {
super(handler);
mContext = context;
//threadStart(true);
}
public static void init(Context context) {
ContactContentObserber observer = new ContactContentObserber(new Handler(), context);
context.getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI,
true, observer);
observer.threadStart(true);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
threadStart(false);
}
private synchronized void threadStart(final boolean first) {
if (!isUpdateThreadsRunning) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
isUpdateThreadsRunning = true;
updateThreads(first);
if (isRunAgain) {
isRunAgain = false;
threadStart(false);
}
}
});
t.setPriority(Thread.MIN_PRIORITY);
t.start();
} else {
isRunAgain = true;
}
}
private void sleep(Cursor threads) {
int sleepTime = 10000;
if (threads.getCount() > 200) {
sleepTime = 40000;
}
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void updateThreads(boolean first) {
Cursor threads = mContext.getContentResolver().query(THREADS_ALL, null, null, null, null);
if (threads == null) {
return;
}
if (first) {
sleep(threads);
}
try {
threads.moveToPosition(-1);
while (threads.moveToNext()) {
String number = threads.getString(RECIPIENT_ADDRESSES);
String[] numbers = number.split(" ");
String name = threads.getString(RECIPIENT_NAMES);
Log.d(TAG, "thread number size :" + numbers.length);
if (numbers.length > 1) {
String[] names = name.split(" ");
if ( names.length != numbers.length ) {
names = new String[numbers.length];
}
boolean change = false;
for (int i = 0; i < numbers.length; i++) {
String num = numbers[i];
Contact contact = Contact.sync_get(num);
if ( names[i] != null && contact.getName().equals(names[i])) {
continue;
}
change = true;
names[i] = contact.getName();
}
if (change) {
String nameStr = "";
for (int i = 0; i < names.length; i++) {
if (i > 0) {
nameStr += " ";
}
nameStr += names[i];
}
ContentValues values = new ContentValues();
values.put("recipient_names", nameStr);
mContext.getContentResolver().update(THREADS_ALL, values,
"_id = " + threads.getShort(ID), null);
}
} else {
Contact contact = Contact.sync_get(number);
if (contact.getName().equals(name)) {
continue;
}
Log.d(TAG,
"====one phone number--name-b:" + name + ";name-n:"
+ contact.getName());
ContentValues values = new ContentValues();
values.put("recipient_names", contact.getName());
mContext.getContentResolver().update(THREADS_ALL, values,
"_id = " + threads.getShort(ID), null);
}
Thread.yield();
}
} finally {
threads.close();
isUpdateThreadsRunning = false;
}
}
}