package com.owwlo.courier.s;
import org.json.JSONArray;
import com.owwlo.courier.s.Constants.SMS;
import com.owwlo.courier.s.data.Contact;
import com.owwlo.courier.s.data.MessageItem;
import com.owwlo.courier.s.data.MessagePack;
import com.owwlo.courier.s.utils.Utils;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.ContentObserver;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.util.Log;
class SMSObserver extends ContentObserver {
private static final String TAG = "CourierSSMSObserver";
private static final int SMS_ALL_ID = 0;
private static final UriMatcher sURIMatcher = new UriMatcher(
UriMatcher.NO_MATCH);
static {
sURIMatcher.addURI("sms", "#", SMS_ALL_ID);
}
private ContentResolver mResolver;
private Handler mHandler;
private Context mContext;
public SMSObserver(Context context, ContentResolver resolver,
Handler handler) {
super(handler);
mResolver = resolver;
mHandler = handler;
mContext = context;
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
if (sURIMatcher.match(uri) != SMS_ALL_ID) {
return;
}
Log.i(TAG, uri.toString());
long newID = ContentUris.parseId(uri);
Cursor cursor = mResolver.query(SMS.CONTENT_URI,
Constants.SMS_PROJECTION,
String.format(Constants.SMS_SELECTION, newID), null, null);
cursor.moveToFirst();
Log.i(TAG, "" + cursor.getCount());
// 发送短信会触发,但此时TYPE为送出短信值为2
if (cursor.getCount() < 1) {
return;
}
do {
int msgRead = cursor.getInt(cursor.getColumnIndex(SMS.READ));
int threadId = cursor.getInt(cursor.getColumnIndex(SMS.THREAD_ID));
String senderAddress = cursor.getString(cursor
.getColumnIndex(SMS.ADDRESS));
// 表示此条短信是程序启动后接到的
if (msgRead == SMS.MESSAGE_UNREAD
/*
* && Math.abs(date - System.currentTimeMillis()) <
* Constants.SMS_SYSTEM_RESPONSE_ERROR_TIME
*/) {
Uri conUri = Uri.withAppendedPath(SMS.SMS_CONVERSION, "/"
+ threadId);
Cursor threadCursor = mResolver.query(conUri,
Constants.SMS_PROJECTION, null, null, SMS.ID
+ " desc limit " + Constants.THREAD_MAX_FETCH_NUM);
MessagePack msgPack = new MessagePack();
msgPack.senderAddress = senderAddress;
msgPack.senderThreadId = threadId;
threadCursor.moveToFirst();
do {
int id = threadCursor.getInt(threadCursor
.getColumnIndex(SMS.ID));
int type = threadCursor.getInt(threadCursor
.getColumnIndex(SMS.TYPE));
String address = threadCursor.getString(threadCursor
.getColumnIndex(SMS.ADDRESS));
String body = threadCursor.getString(threadCursor
.getColumnIndex(SMS.BODY));
long date = threadCursor.getLong(threadCursor
.getColumnIndex(SMS.DATE));
int read = threadCursor.getInt(threadCursor
.getColumnIndex(SMS.READ));
long dateSent = threadCursor.getLong(threadCursor
.getColumnIndex(SMS.DATE_SENT));
int deleted = threadCursor.getInt(threadCursor
.getColumnIndex(SMS.DELETED));
int protocol = threadCursor.getInt(threadCursor
.getColumnIndex(SMS.PROTOCOL));
int seen = threadCursor.getInt(threadCursor
.getColumnIndex(SMS.SEEN));
int status = threadCursor.getInt(threadCursor
.getColumnIndex(SMS.STATUS));
Log.i(TAG, body + " " + address + " " + threadId);
MessageItem item = new MessageItem();
if (SMS.MESSAGE_TYPE_INBOX == type) {
item.setAddress(address);
}
item.setBody(body);
item.setDate(date);
item.setDateSent(dateSent);
item.setDeleted(deleted);
item.setId(id);
item.setProtocol(protocol);
item.setRead(read);
item.setSeen(seen);
item.setStatus(status);
item.setThreadId(threadId);
item.setType(type);
msgPack.addMessage(item);
Log.d(TAG, item.toString());
} while (threadCursor.moveToNext());
threadCursor.close();
Message message = new Message();
message.obj = msgPack;
mHandler.sendMessage(message);
}
} while (cursor.moveToNext());
cursor.close();
}
}