package cn.edu.tsinghua.hpc.tcontacts.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.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.ContactsContract.Contacts; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; import cn.edu.tsinghua.hpc.syncbroker.ElementNotFound; import cn.edu.tsinghua.hpc.tcontacts.Preferences; import cn.edu.tsinghua.hpc.tcontacts.provider.ContactsDatabaseHelper; import cn.edu.tsinghua.hpc.tcontacts.syncaction.ContactsUtility; import cn.edu.tsinghua.hpc.tcontacts.syncaction.SyncState; import cn.edu.tsinghua.hpc.tcontacts.syncaction.TaskExecuter; import cn.edu.tsinghua.hpc.tcontacts.util.TContactsContract.TRawContacts; import cn.edu.tsinghua.hpc.tcontacts.util.TIntent; import cn.edu.tsinghua.hpc.tcontacts.util.TContactsContract.TContacts; public class TContactSyncService extends Service { private static final String TAG = "TContactSyncService"; private ConnectionListener connectionListener; private Timer syncTimer; private SyncTask syncTask; private static final long SYNC_DELAY = 3000; public static final Uri CONTENT_QUERY_URI = Uri.withAppendedPath( TContacts.CONTENT_URI, "query"); @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { super.onCreate(); Log.d(TAG,"Service create"); 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() { try { if (Preferences.isTSyncEnabled(TContactSyncService.this)) { // if (TContactSyncHelper.tryLock(TContactSyncService.this)) // { Intent broadcastIntent = new Intent(); broadcastIntent .setAction(TIntent.ACTION_SYNC_STATE_CHANGED); broadcastIntent.putExtra("active", true); sendBroadcast(broadcastIntent); //android.os.Debug.waitForDebugger(); Log.d(TAG, "addContacts"); addContacts(); Log.d(TAG, "updateContacts"); updateContacts(); Log.d(TAG, "recoverContacts"); recoverContacts(); Log.d(TAG, "deleteContacts"); deleteContacts(); Log.d(TAG, "removeContacts"); removeContacts(); broadcastIntent.putExtra("active", false); sendBroadcast(broadcastIntent); // } } else { executeOfflineSync(); } } catch (Exception e) { Log.d("TContact", e.getMessage()); } finally { TContactSyncHelper.releaseLock(TContactSyncService.this); } } private void executeOfflineSync() { /** * TODO add offline sync as the ContactsProvider does now it just do * nothing and wait for TSyncEnable */ } private void addContacts() { Context ctx = TContactSyncService.this; //add by chenqiang // Uri CONTENT_QUERY_URI = TRawContacts.CONTENT_URI; Cursor c = ctx.getContentResolver().query(CONTENT_QUERY_URI, new String[] { Contacts._ID, "guid", "sync_state" }, "guid IS NULL OR guid = -1", null, null); if (c != null && c.moveToFirst()) { // Log.d(TAG, "-----------"+c.getCount()); do { String id = c.getString(c.getColumnIndex(Contacts._ID)); Uri resultUri = Uri.withAppendedPath( TContacts.CONTENT_URI, id); //// //add by chenqiang // Uri resultUri = Uri.withAppendedPath( // TRawContacts.CONTENT_URI, id); try { // int guid = TaskExecuter.executeAddTask(id, ctx); // Uri resultUri = Uri.withAppendedPath( // TContacts.CONTENT_URI, id); // ContactsUtility.setGuid(ctx, resultUri, guid); ContactsUtility.setGuid(ctx, resultUri, -999); int guid = TaskExecuter.executeAddTask(id, ctx); ContactsUtility.setGuid(ctx, resultUri, guid); } catch (ClientProtocolException e) { Log.d(TAG, "ClientProtocolException"); ContactsUtility.setGuid(ctx, resultUri, -1); } catch (ElementNotFound e) { Log.d(TAG, "ElementNotFound"); ContactsUtility.setGuid(ctx, resultUri, -1); } catch (IOException e) { Log.d(TAG, "IOException"); ContactsUtility.setGuid(ctx, resultUri, -1); } } while (c.moveToNext()); c.close(); } } private void updateContacts() { Context ctx = TContactSyncService.this; Cursor c = ctx.getContentResolver().query(CONTENT_QUERY_URI, new String[] { Contacts._ID, "guid", "sync_state" }, "sync_state = '" + SyncState.SYNC_STATE_UPDATED + "'", null, null); if (c != null && c.moveToFirst()) { do { String id = c.getString(c.getColumnIndex(Contacts._ID)); String guid = c.getString(c.getColumnIndex("guid")); try { TaskExecuter.executeUpdateTask(id, guid, ctx); Uri resultUri = Uri.withAppendedPath( TContacts.CONTENT_URI, id); ContactsUtility.markContact(ctx, resultUri, SyncState.SYNC_STATE_PRESENT); } catch (ClientProtocolException e) { Log.d(TAG, "ClientProtocolException"); } catch (ElementNotFound e) { Log.d(TAG, "ElementNotFound"); } catch (IOException e) { Log.d(TAG, "IOException"); } } while (c.moveToNext()); c.close(); } } private void recoverContacts() { Context ctx = TContactSyncService.this; Cursor c = ctx.getContentResolver().query(CONTENT_QUERY_URI, new String[] { Contacts._ID, "guid", "sync_state" }, "sync_state = '" + SyncState.SYNC_STATE_RECOVER + "'", null, null); if (c != null && c.moveToFirst()) { do { String id = c.getString(c.getColumnIndex(Contacts._ID)); String guid = c.getString(c.getColumnIndex("guid")); try { // if (TaskExecuter.executeUpdateTask(id, guid, ctx)) { if (TaskExecuter.executeRecoverTask(guid, ctx)) { //ע�͵� ����Ҫ��������״̬ �������������ʾ��ͬ����һ�µ����⣡ added by boern Uri resultUri = Uri.withAppendedPath( TContacts.CONTENT_URI, id); ContactsUtility.markContact(ctx, resultUri, SyncState.SYNC_STATE_PRESENT); } // } } catch (ClientProtocolException e) { } catch (ElementNotFound e) { } catch (IOException e) { } } while (c.moveToNext()); c.close(); } } private void deleteContacts() { Context ctx = TContactSyncService.this; Cursor c = ctx.getContentResolver().query(CONTENT_QUERY_URI, new String[] { Contacts._ID, "guid", "sync_state" }, "sync_state = '" + SyncState.SYNC_STATE_DELETE + "'", null, null); if (c != null && c.moveToFirst()) { do { String id = c.getString(c.getColumnIndex(Contacts._ID)); String guid = c.getString(c.getColumnIndex("guid")); try { // if (TaskExecuter.executeUpdateTask(id, guid, ctx)) { if (TaskExecuter.executeDeleteTask(guid, ctx)) { //ע�͵� ����Ҫ��������״̬ �������������ʾ��ͬ����һ�µ����⣡ added by boern Uri resultUri = Uri.withAppendedPath( TContacts.CONTENT_URI, id); ContactsUtility.markContact(ctx, resultUri, SyncState.SYNC_STATE_DELETED); } // } } catch (ClientProtocolException e) { } catch (ElementNotFound e) { } catch (IOException e) { } } while (c.moveToNext()); c.close(); } } private void removeContacts() { Context ctx = TContactSyncService.this; //add by chenqiang // Uri CONTENT_QUERY_URI = TRawContacts.CONTENT_URI; Cursor c = ctx.getContentResolver().query(CONTENT_QUERY_URI, new String[] { Contacts._ID, "guid", "sync_state" }, "sync_state = '" + SyncState.SYNC_STATE_REMOVE + "'", null, null); if (c != null && c.moveToFirst()) { do { String id = c.getString(c.getColumnIndex(Contacts._ID)); String guid = c.getString(c.getColumnIndex("guid")); try { // if (TaskExecuter.executeUpdateTask(id, guid, ctx)) { if (TaskExecuter.executeFinalDelete(guid, ctx)) { Uri resultUri = Uri.withAppendedPath( TContacts.CONTENT_URI, id); ctx.getContentResolver().delete(resultUri, null, null); //add by chenqiang // int row = ctx.getContentResolver().delete(TRawContacts.CONTENT_URI, // "sync_state='"+SyncState.SYNC_STATE_REMOVE+"'", null); // Log.v(TAG, "*-----------********"+row); //add by chenqiang // SQLiteOpenHelper mOpenHelper = ContactsDatabaseHelper.getInstance(ctx); // SQLiteDatabase db = mOpenHelper.getWritableDatabase(); // db.delete("raw_contacts","sync_state='"+SyncState.SYNC_STATE_REMOVE+"'", null); } // } } catch (ClientProtocolException e) { } catch (ElementNotFound e) { } catch (IOException e) { } } while (c.moveToNext()); c.close(); } } } }