package cn.edu.tsinghua.hpc.tmms.service; import java.io.IOException; import java.util.Timer; import java.util.TimerTask; import org.apache.http.client.ClientProtocolException; import android.app.Service; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; import android.os.IBinder; import android.provider.Telephony.Mms; import android.provider.Telephony.Sms; import android.provider.Telephony.Threads; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; import cn.edu.tsinghua.hpc.google.tmms.InvalidHeaderValueException; import cn.edu.tsinghua.hpc.syncbroker.ElementNotFound; import cn.edu.tsinghua.hpc.tmms.MmsConfig; import cn.edu.tsinghua.hpc.tmms.provider.MmsSmsDatabaseHelper; import cn.edu.tsinghua.hpc.tmms.syncaction.MmsUtils; import cn.edu.tsinghua.hpc.tmms.syncaction.SyncAction; import cn.edu.tsinghua.hpc.tmms.syncaction.SyncState; import cn.edu.tsinghua.hpc.tmms.syncaction.TaskExecuter; import cn.edu.tsinghua.hpc.tmms.ui.MessageUtils; import cn.edu.tsinghua.hpc.tmms.ui.RecoverThreadActivity; import cn.edu.tsinghua.hpc.tmms.util.TIntent; import cn.edu.tsinghua.hpc.tmms.util.TTelephony.TMms; import cn.edu.tsinghua.hpc.tmms.util.TTelephony.TMmsSms; import cn.edu.tsinghua.hpc.tmms.util.TTelephony.TSms; import cn.edu.tsinghua.hpc.tmms.util.TTelephony.TThreads; public class TMmsSyncService extends Service { private ConnectionListener connectionListener; private Timer syncTimer; private SyncTask syncTask; private static final long SYNC_DELAY = 3000; // private static final long SYNC_DELAY = 1000; public static final String TAG = "TMmsService"; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { super.onCreate(); connectionListener = new ConnectionListener(this .getApplicationContext()); TelephonyManager mTelephonyMgr = (TelephonyManager) this .getSystemService(Context.TELEPHONY_SERVICE); mTelephonyMgr.listen(connectionListener, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE); syncTimer = new Timer(); syncTask = new SyncTask(); } @Override public void onStart(Intent intent, int startId) { syncTask.cancel(); syncTimer.purge(); syncTask = new SyncTask(); syncTimer.schedule(syncTask, SYNC_DELAY); } @Override public void onDestroy() { } private class SyncTask extends TimerTask { @Override public void run() { synchronized (this) { if (MmsConfig.isTSyncEnabled()) { // try to lock the db for other service if (TMessageSyncHelper.tryLock(TMmsSyncService.this)) { try { Intent broadcastIntent = new Intent(); broadcastIntent .setAction(TIntent.ACTION_SYNC_STATE_CHANGED); broadcastIntent.putExtra("active", true); sendBroadcast(broadcastIntent); executeDeSyncThreadTasks(); executeSyncThreadTasks(); executeDeSyncSMSTasks(); executeDeSyncMMSTasks(); executeSyncSMSTasks(); executeSyncMMSTasks(); executeAutoArchiveSMSTasks(); executeAutoArchiveMmsTasks(); executeAddSMSTasks(); executeAddMmsTasks(); executeUpdateSMSTasks(); executeUpdateMMSTasks(); executeDeleteThreadTasks(); executeRemoveThreadTasks(); executeRecoverSMSTasks(); executeRecoverMMSTasks(); executeDeleteSMSTasks(); executeDeleteMMSTasks(); executeRemoveSMSTasks(); executeRemoveMMSTasks(); broadcastIntent.putExtra("active", false); sendBroadcast(broadcastIntent); } catch (InvalidHeaderValueException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { // FIXME: if release failed, then ?? TMessageSyncHelper .releaseLock(TMmsSyncService.this); } } } else { executeFakedTasks(); } } } private void executeDeSyncThreadTasks() { Context ctx = TMmsSyncService.this; Cursor c = ctx.getContentResolver().query( Uri.withAppendedPath(TMmsSms.AUTHORITY_URI, "all-threads"),//Uri.parse("content://mms-sms/all-threads/"), new String[] { Threads._ID, Threads.RECIPIENT_IDS, "sync_state", "sync_enable" }, "sync_enable = " + SyncState.SYNC_DISABLE, null, null); if (c != null && c.moveToFirst()) { do { long localId = c.getLong(c.getColumnIndex(Threads._ID)); String address = MessageUtils.getAddressByThreadId(ctx, localId); Uri uri = Uri.withAppendedPath(Uri.withAppendedPath(TMmsSms.AUTHORITY_URI, "threads")//Uri.parse("content://mms-sms/threads/") , String .valueOf(localId)); if (SyncAction.finalDeleteThread(ctx, address)) { // mark the thread sync disabled MmsUtils.enableMessageOrThreadSyncInternal(ctx, uri, false); Uri threadUri = Uri.withAppendedPath( TThreads.CONTENT_URI, String.valueOf(localId)); MmsUtils.enableMessageOrThreadSyncInternal(ctx, threadUri, false); // mark the thread MmsUtils.markMessageOrThread(ctx, uri, SyncState.SYNC_STATE_NOT_SYNC); // mark all the messages of the thread MmsUtils.markMessageOrThread(ctx, Uri.withAppendedPath( TThreads.CONTENT_URI, String.valueOf(localId)), SyncState.SYNC_STATE_NOT_SYNC); // Set the guids to -1 MmsUtils.setGuid(ctx, Uri.withAppendedPath( TThreads.CONTENT_URI, String.valueOf(localId)), -1); } } while (c.moveToNext()); } } private void executeSyncThreadTasks() { Context ctx = TMmsSyncService.this; Cursor c = ctx.getContentResolver().query( Uri.withAppendedPath(TMmsSms.AUTHORITY_URI, "all-threads"), //Uri.parse("content://mms-sms/all-threads/"), new String[] { Threads._ID, Threads.RECIPIENT_IDS, "sync_state", "sync_enable" }, "sync_enable = " + SyncState.SYNC_ENABLE, null, null); if (c != null && c.moveToFirst()) { do { long localId = c.getLong(c.getColumnIndex(Threads._ID)); Uri uri = Uri.withAppendedPath(Uri.withAppendedPath(TMmsSms.AUTHORITY_URI, "threads"), //Uri.parse("content://mms-sms/threads/"), String.valueOf(localId)); // mark the thread sync enabled MmsUtils.enableMessageOrThreadSyncInternal(ctx, uri, true); Uri threadUri = Uri.withAppendedPath(TThreads.CONTENT_URI, String.valueOf(localId)); MmsUtils.enableMessageOrThreadSyncInternal(ctx, threadUri, true); } while (c.moveToNext()); } } private void executeAutoArchiveSMSTasks() { Context ctx = TMmsSyncService.this; Cursor mSmsCursor = ctx.getContentResolver() .query( TSms.CONTENT_URI, new String[] { Sms._ID, "guid", "sync_state", "sync_enable" }, "sync_enable = 1 AND guid IS NOT NULL AND guid <> -1 AND sync_state = '" + SyncState.SYNC_STATE_ARCHIVED + "'", null, Sms.DATE + " ASC"); if (mSmsCursor != null && mSmsCursor.moveToFirst()) { do { String guid = mSmsCursor.getString(mSmsCursor .getColumnIndex("guid")); try { if (TaskExecuter.executeAchieveTask(guid, ctx)) { long localId = mSmsCursor.getLong(mSmsCursor .getColumnIndex(Sms._ID)); Uri uri = Uri.withAppendedPath(TSms.CONTENT_URI, String.valueOf(localId)); ctx.getContentResolver().delete(uri, null, null); } } catch (ClientProtocolException e) { } catch (ElementNotFound e) { } catch (IOException e) { } } while (mSmsCursor.moveToNext()); mSmsCursor.close(); } } private void executeAutoArchiveMmsTasks() { Context ctx = TMmsSyncService.this; Cursor mMmsCursor = ctx.getContentResolver() .query( TMms.CONTENT_URI, new String[] { Mms._ID, "guid", "sync_state", "sync_enable" }, "sync_enable = 1 AND guid IS NOT NULL AND guid <> -1 AND sync_state = '" + SyncState.SYNC_STATE_ARCHIVED + "'", null, Mms.DATE + " ASC"); if (mMmsCursor != null && mMmsCursor.moveToFirst()) { do { String guid = mMmsCursor.getString(mMmsCursor .getColumnIndex("guid")); try { if (TaskExecuter.executeAchieveTask(guid, ctx)) { long localId = mMmsCursor.getLong(mMmsCursor .getColumnIndex(Mms._ID)); Uri uri = Uri.withAppendedPath(TMms.CONTENT_URI, String.valueOf(localId)); ctx.getContentResolver().delete(uri, null, null); } } catch (ClientProtocolException e) { } catch (ElementNotFound e) { } catch (IOException e) { } } while (mMmsCursor.moveToNext()); mMmsCursor.close(); } } private void executeDeSyncSMSTasks() { Context ctx = TMmsSyncService.this; Cursor c = ctx.getContentResolver() .query( TSms.CONTENT_URI, new String[] { Sms._ID, "guid", "sync_state", "sync_enable" }, "sync_enable = " + SyncState.SYNC_DISABLE, null, null); if (c != null && c.moveToFirst()) { do { long localId = c.getLong(c.getColumnIndex(Sms._ID)); String guid = c.getString(c.getColumnIndex("guid")); Uri uri = Uri.withAppendedPath(TSms.CONTENT_URI, String .valueOf(localId)); try { if (TaskExecuter.executeFinalDelete(guid, ctx)) { MmsUtils.enableMessageOrThreadSyncInternal(ctx, uri, false); MmsUtils.markMessageOrThread(ctx, uri, SyncState.SYNC_STATE_NOT_SYNC); MmsUtils.setGuid(ctx, uri, -1); } } catch (ClientProtocolException e) { } catch (ElementNotFound e) { } catch (IOException e) { } } while (c.moveToNext()); } } private void executeDeSyncMMSTasks() { Context ctx = TMmsSyncService.this; Cursor c = ctx.getContentResolver() .query( TMms.CONTENT_URI, new String[] { Mms._ID, "guid", "sync_state", "sync_enable" }, "sync_enable = " + SyncState.SYNC_DISABLE, null, null); if (c != null && c.moveToFirst()) { do { long localId = c.getLong(c.getColumnIndex(Mms._ID)); String guid = c.getString(c.getColumnIndex("guid")); Uri uri = Uri.withAppendedPath(TMms.CONTENT_URI, String .valueOf(localId)); try { if (TaskExecuter.executeFinalDelete(guid, ctx)) { MmsUtils.enableMessageOrThreadSyncInternal(ctx, uri, false); MmsUtils.markMessageOrThread(ctx, uri, SyncState.SYNC_STATE_NOT_SYNC); MmsUtils.setGuid(ctx, uri, -1); } } catch (ClientProtocolException e) { } catch (ElementNotFound e) { } catch (IOException e) { } } while (c.moveToNext()); } } private void executeSyncSMSTasks() { Context ctx = TMmsSyncService.this; Cursor c = ctx.getContentResolver() .query( TSms.CONTENT_URI, new String[] { Sms._ID, "guid", "sync_state", "sync_enable" }, "sync_enable = " + SyncState.SYNC_ENABLE, null, null); if (c != null && c.moveToFirst()) { do { long localId = c.getLong(c.getColumnIndex(Sms._ID)); Uri uri = Uri.withAppendedPath(TSms.CONTENT_URI, String .valueOf(localId)); MmsUtils.enableMessageOrThreadSyncInternal(ctx, uri, true); } while (c.moveToNext()); } } private void executeSyncMMSTasks() { Context ctx = TMmsSyncService.this; Cursor c = ctx.getContentResolver() .query( TMms.CONTENT_URI, new String[] { Mms._ID, "guid", "sync_state", "sync_enable" }, "sync_enable = " + SyncState.SYNC_ENABLE, null, null); if (c != null && c.moveToFirst()) { do { long localId = c.getLong(c.getColumnIndex(Mms._ID)); Uri uri = Uri.withAppendedPath(TMms.CONTENT_URI, String .valueOf(localId)); MmsUtils.enableMessageOrThreadSyncInternal(ctx, uri, true); } while (c.moveToNext()); } } private void executeFakedTasks() { Log.d(TAG, "executeFakedTasks"); Context ctx = TMmsSyncService.this; ctx.getContentResolver().delete( TMmsSms.CONTENT_URI, "sync_state = '" + SyncState.SYNC_STATE_DELETED + "'" + " OR sync_state = '" + SyncState.SYNC_STATE_REMOVED + "'" + " OR sync_state = '" + SyncState.SYNC_STATE_TMP + "'", null); } private void executeDeleteThreadTasks() { Context ctx = TMmsSyncService.this; Cursor c = ctx.getContentResolver().query( Uri.withAppendedPath(TMmsSms.AUTHORITY_URI, "all-threads"), //Uri.parse("content://mms-sms/all-threads/"), new String[] { Threads._ID, Threads.RECIPIENT_IDS, "sync_state" }, "sync_state = '" + SyncState.SYNC_STATE_DELETED + "'", null, null); if (c != null && c.moveToFirst()) { do { long threadId = c.getLong(c.getColumnIndex(Threads._ID)); String address = MessageUtils.getAddressByThreadId(ctx, threadId); Log.d(TAG, "executeDeleteThreadTasks local address " + address); // Uri uri = Uri.withAppendedPath(TThreads.CONTENT_URI, String // .valueOf(localId)); Uri uri = ContentUris.withAppendedId(Uri.withAppendedPath(TMmsSms.AUTHORITY_URI, "threads"), threadId); if (!MmsUtils.isThreadSyncable(ctx, threadId)) { // ctx.getContentResolver().delete(uri, null, null); // //add by chenqiang // SQLiteOpenHelper mOpenHelper = MmsSmsDatabaseHelper.getInstance(ctx); // SQLiteDatabase db = mOpenHelper.getWritableDatabase(); // ContentValues values = new ContentValues(); // values.put("sync_state", SyncState.SYNC_STATE_DELETED); // db.update("sms", values, "thread_id="+localId, null); // add by chenqiang MmsUtils.markMessageOrThread(ctx,uri,SyncState.SYNC_STATE_REMOTE_DELETE); } else if (SyncAction.deleteThread(ctx, address)) { // ctx.getContentResolver().delete(uri, null, null); // add by chenqiang MmsUtils.markMessageOrThread(ctx,uri,SyncState.SYNC_STATE_REMOTE_DELETE); } } while (c.moveToNext()); } } private void executeRemoveThreadTasks() { Context ctx = TMmsSyncService.this; Cursor c = ctx.getContentResolver().query( Uri.withAppendedPath(TMmsSms.AUTHORITY_URI, "all-threads"), //Uri.parse("content://mms-sms/all-threads/"), new String[] { Threads._ID, Threads.RECIPIENT_IDS, "sync_state" }, "sync_state = '" + SyncState.SYNC_STATE_REMOVED + "'", null, null); if (c != null && c.moveToFirst()) { do { long localId = c.getLong(c.getColumnIndex(Threads._ID)); String address = MessageUtils.getAddressByThreadId(ctx, localId); Log.d(TAG, "executeRemoveThreadTasks address is " + address); Uri uri = Uri.withAppendedPath(TThreads.CONTENT_URI, String .valueOf(localId)); if (!MmsUtils.isThreadSyncable(ctx, localId)) { ctx.getContentResolver().delete(uri, null, null); } else if (SyncAction.finalDeleteThread(ctx, address)) { ctx.getContentResolver().delete(uri, null, null); } } while (c.moveToNext()); } } private void executeAddMmsTasks() throws InvalidHeaderValueException { Context ctx = TMmsSyncService.this; Cursor c = ctx.getContentResolver().query( TMms.CONTENT_URI, new String[] { "guid", Mms._ID, "sync_state", Mms.MESSAGE_BOX }, "( guid IS NULL OR guid = -1 ) AND sync_enable = 1", null, null); if (c != null && c.moveToFirst()) { do { String localId = c.getString(c.getColumnIndex(Mms._ID)); try { int guid = TaskExecuter.executeAddMmsTask(localId, ctx); Uri resultUri = Uri.withAppendedPath(TMms.CONTENT_URI, localId); Log.d(TAG, "executeAddMmsTasks resultUri :"+resultUri); MmsUtils.setGuid(ctx, resultUri, guid); MmsUtils.markMessageOrThread(ctx, resultUri, SyncState.SYNC_STATE_PRESENT); if (c.getInt(c.getColumnIndex(Mms.MESSAGE_BOX)) == Mms.MESSAGE_BOX_INBOX) { Uri dataUri = Uri.withAppendedPath( Uri.withAppendedPath(TMms.AUTHORITY_URI, "data"), //Uri.parse("content://mms/data"), localId); // ctx.getContentResolver() // .delete(dataUri, null, null); } } catch (ClientProtocolException e) { Log.d(TAG, "ClientProtocolException " + localId); } catch (ElementNotFound e) { Log.d(TAG, "ElementNotFound " + localId); } catch (IOException e) { Log.d(TAG, "IOException " + localId); } } while (c.moveToNext()); } } private void executeAddSMSTasks() { Context ctx = TMmsSyncService.this; Cursor c = ctx.getContentResolver().query(TSms.CONTENT_URI, new String[] { "guid", Sms._ID, "sync_state" }, "( guid IS NULL OR guid = -1 ) AND sync_enable = 1", null, null); if (c != null && c.moveToFirst()) { do { String localId = c.getString(c.getColumnIndex(Sms._ID)); try { int guid = TaskExecuter.executeAddSMSTask(localId, ctx); Uri resultUri = Uri.withAppendedPath(TSms.CONTENT_URI, localId); Log.d(TAG, "executeAddSMSTasks resultUri :"+resultUri); MmsUtils.setGuid(ctx, resultUri, guid); MmsUtils.markMessageOrThread(ctx, resultUri, SyncState.SYNC_STATE_PRESENT); } catch (ClientProtocolException e) { } catch (ElementNotFound e) { } catch (IOException e) { } } while (c.moveToNext()); } } private void executeRecoverSMSTasks() { //Log.d(TAG,"executeRecoverSMSTasks----------start"); Context ctx = TMmsSyncService.this; // Cursor c = ctx.getContentResolver().query( // TSms.CONTENT_URI, // new String[] { "guid", Sms._ID, "sync_state" }, // "guid IS NOT NULL AND sync_state = '" // + SyncState.SYNC_STATE_RECOVER + "'", null, null); Cursor c = ctx.getContentResolver().query( TSms.CONTENT_URI, new String[] { "guid", Sms._ID, "sync_state" }, "guid !=-1 AND sync_state = '" + SyncState.SYNC_STATE_RECOVER + "'", null, null); if (c != null && c.moveToFirst()) { do { String localId = c.getString(c.getColumnIndex(Sms._ID)); String guid = c.getString(c.getColumnIndex("guid")); try { if (TaskExecuter.executeRecoverTask(guid, ctx)) { Uri resultUri = Uri.withAppendedPath( TSms.CONTENT_URI, localId); Log.d(TAG, "executeRecoverSMSTasks resultUri :"+resultUri); MmsUtils.markMessageOrThread(ctx, resultUri, SyncState.SYNC_STATE_PRESENT); } } catch (ClientProtocolException e) { } catch (ElementNotFound e) { } catch (IOException e) { } } while (c.moveToNext()); } } private void executeRecoverMMSTasks() { Context ctx = TMmsSyncService.this; Cursor c = ctx.getContentResolver().query( TMms.CONTENT_URI, new String[] { "guid", Mms._ID, "sync_state" }, "guid IS NOT NULL AND sync_state = '" + SyncState.SYNC_STATE_RECOVER + "'", null, null); if (c != null && c.moveToFirst()) { do { String localId = c.getString(c.getColumnIndex(Mms._ID)); String guid = c.getString(c.getColumnIndex("guid")); try { if (TaskExecuter.executeRecoverTask(guid, ctx)) { Uri resultUri = Uri.withAppendedPath( TMms.CONTENT_URI, localId); Log.d(TAG, "executeRecoverMMSTasks resultUri :"+resultUri); MmsUtils.markMessageOrThread(ctx, resultUri, SyncState.SYNC_STATE_PRESENT); MmsUtils.markMessageSyncDirty(ctx, resultUri, 0); } } catch (ClientProtocolException e) { } catch (ElementNotFound e) { } catch (IOException e) { } } while (c.moveToNext()); } } private void executeUpdateSMSTasks() { Context ctx = TMmsSyncService.this; Cursor c = ctx .getContentResolver() .query( TSms.CONTENT_URI, new String[] { "guid", Sms._ID, "sync_state" }, "guid IS NOT NULL AND guid <> -1 AND sync_dirty = 1 AND sync_enable = 1", null, null); if (c != null && c.moveToFirst()) { do { String localId = c.getString(c.getColumnIndex(Sms._ID)); String guid = c.getString(c.getColumnIndex("guid")); try { if (TaskExecuter.executeUpdateSMSTask(localId, ctx)) { Uri resultUri = Uri.withAppendedPath( TSms.CONTENT_URI, localId); Log.d(TAG, "executeUpdateSMSTasks resultUri :"+resultUri); MmsUtils.markMessageSyncDirty(ctx, resultUri, 0); } } catch (ClientProtocolException e) { } catch (ElementNotFound e) { } catch (IOException e) { } } while (c.moveToNext()); } } private void executeUpdateMMSTasks() throws InvalidHeaderValueException { Context ctx = TMmsSyncService.this; Cursor c = ctx .getContentResolver() .query( TSms.CONTENT_URI, new String[] { "guid", Mms._ID, "sync_state" }, "guid IS NOT NULL AND guid <> -1 AND sync_dirty = 1 AND sync_enable = 1", null, null); if (c != null && c.moveToFirst()) { do { String localId = c.getString(c.getColumnIndex(Mms._ID)); String guid = c.getString(c.getColumnIndex("guid")); try { if (TaskExecuter.executeUpdateMMSTask(localId, ctx)) { Uri resultUri = Uri.withAppendedPath( TMms.CONTENT_URI, localId); Log.d(TAG, "executeUpdateMMSTasks resultUri :"+resultUri); MmsUtils.markMessageSyncDirty(ctx, resultUri, 0); } } catch (ClientProtocolException e) { } catch (ElementNotFound e) { } catch (IOException e) { } } while (c.moveToNext()); } } private void executeDeleteSMSTasks() { Context ctx = TMmsSyncService.this; Cursor c = ctx.getContentResolver().query( TSms.CONTENT_URI, new String[] { "guid", Sms._ID, "sync_state" }, "guid IS NOT NULL AND sync_state = '" + SyncState.SYNC_STATE_DELETED + "'", null, null); if (c != null && c.moveToFirst()) { do { String localId = c.getString(c.getColumnIndex(Sms._ID)); String guid = c.getString(c.getColumnIndex("guid")); try { Uri resultUri = Uri.withAppendedPath(TSms.CONTENT_URI, localId); Log.d(TAG, "executeDeleteSMSTasks resultUri :"+resultUri); //todo: ��Ҫ��֤�Ƿ�ͬ���ɹ���Ҫɾ���������ݡ� if (TaskExecuter.executeDeleteTask(guid, ctx)) { // ctx.getContentResolver().delete(resultUri, null, // null); //add by chenqiang MmsUtils.markMessageOrThread(ctx, resultUri, SyncState.SYNC_STATE_REMOTE_DELETE); } } catch (ClientProtocolException e) { } catch (ElementNotFound e) { } catch (IOException e) { } } while (c.moveToNext()); } } private void executeRemoveSMSTasks() { Context ctx = TMmsSyncService.this; Cursor c = ctx.getContentResolver().query( TSms.CONTENT_URI, new String[] { "guid", Sms._ID, "sync_state" }, "guid IS NOT NULL AND sync_state = '" + SyncState.SYNC_STATE_REMOVED + "'", null, null); if (c != null && c.moveToFirst()) { do { String localId = c.getString(c.getColumnIndex(Sms._ID)); String guid = c.getString(c.getColumnIndex("guid")); try { Uri resultUri = Uri.withAppendedPath(TSms.CONTENT_URI, localId); Log.d(TAG, "executeRemoveSMSTasks resultUri :"+resultUri); if (TaskExecuter.executeFinalDelete(guid, ctx)) { ctx.getContentResolver().delete(resultUri, null, null); } } catch (ClientProtocolException e) { } catch (ElementNotFound e) { } catch (IOException e) { } } while (c.moveToNext()); } } private void executeDeleteMMSTasks() { Context ctx = TMmsSyncService.this; Cursor c = ctx.getContentResolver().query( TMms.CONTENT_URI, new String[] { "guid", Mms._ID, "sync_state" }, "guid IS NOT NULL AND sync_state = '" + SyncState.SYNC_STATE_DELETED + "'", null, null); if (c != null && c.moveToFirst()) { do { String localId = c.getString(c.getColumnIndex(Mms._ID)); String guid = c.getString(c.getColumnIndex("guid")); try { Uri resultUri = Uri.withAppendedPath(TMms.CONTENT_URI, localId); Log.d(TAG, "executeDeleteMMSTasks resultUri :"+resultUri); if (TaskExecuter.executeDeleteTask(guid, ctx)) { // ctx.getContentResolver().delete(resultUri, null, // null); //add by chenqiang MmsUtils.markMessageOrThread(ctx, resultUri, SyncState.SYNC_STATE_REMOTE_DELETE); } } catch (ClientProtocolException e) { } catch (ElementNotFound e) { } catch (IOException e) { } } while (c.moveToNext()); } } private void executeRemoveMMSTasks() { Context ctx = TMmsSyncService.this; Cursor c = ctx.getContentResolver().query( TMms.CONTENT_URI, new String[] { "guid", Mms._ID, "sync_state" }, "guid IS NOT NULL AND sync_state = '" + SyncState.SYNC_STATE_REMOVED + "'", null, null); if (c != null && c.moveToFirst()) { do { String localId = c.getString(c.getColumnIndex(Mms._ID)); String guid = c.getString(c.getColumnIndex("guid")); try { Uri resultUri = Uri.withAppendedPath(TMms.CONTENT_URI, localId); Log.d(TAG, "executeRemoveMMSTasks resultUri :"+resultUri); if (TaskExecuter.executeFinalDelete(guid, ctx)) { ctx.getContentResolver().delete(resultUri, null, null); } } catch (ClientProtocolException e) { } catch (ElementNotFound e) { } catch (IOException e) { } } while (c.moveToNext()); } } } }