/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.iu; import java.util.HashSet; import java.util.Set; import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.OnAccountsUpdateListener; import android.content.Context; import android.content.SyncResult; import android.database.sqlite.SQLiteDatabase; import android.os.Handler; import android.os.HandlerThread; import android.os.Message; import android.util.Log; import com.galaxy.meetup.client.util.EsLog; import com.galaxy.picasa.sync.PicasaSyncHelper; import com.galaxy.picasa.sync.SyncTask; import com.galaxy.picasa.sync.SyncTaskProvider; import com.galaxy.picasa.sync.UserEntry; /** * * @author sihai * */ public class InstantUploadSyncManager { private static final String PROJECTION_ENABLE_ACCOUNT[] = { "auto_upload_enabled", "auto_upload_account_name", "instant_share_eventid", "instant_share_starttime", "instant_share_endtime" }; private static final String UPLOAD_TASK_CLEANUP_DELETE_WHERE; private static InstantUploadSyncManager sInstance; private boolean mBackgroundData; private final Context mContext; private volatile SyncSession mCurrentSession; private boolean mHasWifiConnectivity; private final Set mInvalidAccounts = new HashSet(); private boolean mIsPlugged; private boolean mIsRoaming; SyncTaskProvider mProvider; private final Handler mSyncHandler; private final PicasaSyncHelper mSyncHelper; static { UPLOAD_TASK_CLEANUP_DELETE_WHERE = (new StringBuilder("media_record_id NOT IN ( SELECT _id FROM ")).append(MediaRecordEntry.SCHEMA.getTableName()).append(" WHERE upload_account").append(" == ? AND ").append("upload_state < ").append(200).append(" )").toString(); } private InstantUploadSyncManager(Context context) { mHasWifiConnectivity = false; mIsRoaming = false; mIsPlugged = false; mBackgroundData = false; mContext = context.getApplicationContext(); mSyncHelper = PicasaSyncHelper.getInstance(mContext); HandlerThread handlerthread = new HandlerThread("picasa-sync-manager", 10); handlerthread.start(); mSyncHandler = new Handler(handlerthread.getLooper()) ; mSyncHandler.sendEmptyMessage(1); mSyncHandler.sendEmptyMessage(4); mSyncHandler.sendEmptyMessage(2); mSyncHandler.sendEmptyMessage(5); OnAccountsUpdateListener onaccountsupdatelistener = new OnAccountsUpdateListener() { public final void onAccountsUpdated(Account aaccount[]) { if(EsLog.isLoggable("iu.SyncManager", 4)) Log.i("iu.SyncManager", "account change detect - update database"); mSyncHandler.sendEmptyMessage(4); } }; AccountManager.get(mContext).addOnAccountsUpdatedListener(onaccountsupdatelistener, null, false); } public static synchronized InstantUploadSyncManager getInstance(Context context) { InstantUploadSyncManager instantuploadsyncmanager; if(sInstance == null) sInstance = new InstantUploadSyncManager(context); instantuploadsyncmanager = sInstance; return instantuploadsyncmanager; } public final void onEnvironmentChanged() { mSyncHandler.sendEmptyMessage(2); } public final synchronized void onAccountActivated(String s) { if(mSyncHelper.findUser(s) == null) { SQLiteDatabase sqlitedatabase = mSyncHelper.getWritableDatabase(); UserEntry userentry = new UserEntry(s); UserEntry.SCHEMA.insertOrReplace(sqlitedatabase, userentry); } } public final void onBatteryStateChanged(boolean flag) { Handler handler = mSyncHandler; Boolean boolean1; Message message; if(flag) boolean1 = Boolean.TRUE; else boolean1 = Boolean.FALSE; message = Message.obtain(handler, 5, boolean1); mSyncHandler.sendMessage(message); } public final synchronized void onAccountDeactivated(String s) { SQLiteDatabase sqlitedatabase = UploadsDatabaseHelper.getInstance(mContext).getWritableDatabase(); String as[] = { s }; sqlitedatabase.delete(MediaRecordEntry.SCHEMA.getTableName(), "upload_account == ?", as); } public final void updateTasks(long l) { mSyncHandler.sendEmptyMessageDelayed(3, l); } public static final class SyncSession { public final String account; SyncTask mCurrentTask; boolean mSyncCancelled; public final SyncResult result; public SyncSession(String s, SyncResult syncresult) { account = s; result = syncresult; } public final synchronized void cancelSync() { mSyncCancelled = true; if(mCurrentTask != null) { mCurrentTask.cancelSync(); mCurrentTask = null; } } public final synchronized boolean isSyncCancelled() { boolean flag = mSyncCancelled; return flag; } } }