/** * galaxy inc. * meetup client for android */ package com.galaxy.picasa.sync; import java.util.HashMap; import android.content.Context; import android.net.Uri; import android.util.Log; import com.android.gallery3d.util.ThreadPool; /** * * @author sihai * */ public class ImmediateSync { private static ImmediateSync sInstance; private final HashMap mCompleteTaskMap = new HashMap(); private final Context mContext; private final HashMap mPendingTaskMap = new HashMap(); private final ThreadPool mThreadPool = new ThreadPool(); private ImmediateSync(Context context) { mContext = context; } private synchronized void completeTask(Task task) { String s; s = task.taskId; if(mPendingTaskMap.remove(s) == task) { mCompleteTaskMap.put(s, task); Uri uri = PicasaFacade.get(mContext).getSyncRequestUri().buildUpon().appendPath(s).build(); mContext.getContentResolver().notifyChange(uri, null, false); if(task.syncResultCode != 0) Log.d("ImmediateSync", (new StringBuilder("sync ")).append(s).append(" incomplete ").append(task.syncResultCode).toString()); } else { Log.d("ImmediateSync", (new StringBuilder("new task added, ignored old:")).append(s).toString()); } } public static synchronized ImmediateSync get(Context context) { ImmediateSync immediatesync = null; if(sInstance == null) sInstance = new ImmediateSync(context); immediatesync = sInstance; return immediatesync; } private void requestSyncAlbumList(final String final_s, String as[]) { // TODO } public final synchronized boolean cancelTask(String s) { boolean flag = true; Log.d("ImmediateSync", (new StringBuilder("cancel sync ")).append(s).toString()); Task task = (Task)mPendingTaskMap.get(s); if(task == null || task.refCount <= 0) { flag = false; } else { int i = -1 + task.refCount; task.refCount = i; if(i == 0) { task.syncResultCode = 1; if(task.syncContext != null) task.syncContext.stopSync(); } } return flag; } public final synchronized int getResult(String s) { int i; Task task; task = (Task)mCompleteTaskMap.get(s); if(task == null) task = (Task)mPendingTaskMap.get(s); if(task != null) { i = task.syncResultCode; } else { i = 3; } return i; } public final String requestSyncAlbum(String s) { // TODO return null; } public final synchronized String requestSyncAlbumListForAccount(String s) { String s1; s1 = String.valueOf(s.hashCode()); Task task = (Task)mPendingTaskMap.get(s1); if(task == null || !task.addRequester()) { mCompleteTaskMap.remove(s1); requestSyncAlbumList(s1, new String[] { s }); } else { Log.d("ImmediateSync", (new StringBuilder("task already exists:")).append(s1).toString()); } return s1; } public final synchronized String requestSyncAlbumListForAllAccounts() { String s; Task task = (Task)mPendingTaskMap.get("all"); if(task == null || !task.addRequester()) { mCompleteTaskMap.remove("all"); requestSyncAlbumList("all", null); s = "all"; } else { Log.d("ImmediateSync", "task already exists:all"); s = "all"; } return s; } private abstract class Task implements com.android.gallery3d.util.ThreadPool.Job { public int refCount; public PicasaSyncHelper.SyncContext syncContext; public int syncResultCode; public final String taskId; Task(String s) { super(); syncResultCode = -1; refCount = 1; taskId = s; } private Void run() { try { int i = doSync(); synchronized(ImmediateSync.this) { if(syncResultCode == -1) syncResultCode = i; } return null; } finally { completeTask(this); } } final boolean addRequester() { boolean flag; if(syncResultCode == -1 || syncResultCode == 0) { refCount = 1 + refCount; flag = true; } else { flag = false; } return flag; } protected abstract int doSync(); public final Object run(com.android.gallery3d.util.ThreadPool.JobContext jobcontext) { return run(); } protected final boolean syncInterrupted() { boolean flag = true; synchronized(ImmediateSync.this) { if(syncResultCode != 1) flag = false; } return flag; } } }