/** * galaxy inc. * meetup client for android */ package com.galaxy.picasa.sync; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; /** * * @author sihai * */ public class SyncState { public static final SyncState METADATA = new SyncState(0); public static final SyncState METADATA_MANUAL = new SyncState(1); public static final SyncState PREFETCH_ALBUM_COVER = new SyncState(4); public static final SyncState PREFETCH_FULL_IMAGE = new SyncState(3); public static final SyncState PREFETCH_SCREEN_NAIL = new SyncState(2); private static final String STATE_PROJECTION[] = { "sync_states" }; private static final String USER_TABLE_NAME; private static final ContentValues sValues = new ContentValues(); private static final String sWhereArgs[] = new String[1]; private final int mOffset; static { USER_TABLE_NAME = UserEntry.SCHEMA.getTableName(); } private SyncState(int i) { mOffset = i * 2; } private synchronized boolean compareAndSet(SQLiteDatabase sqlitedatabase, String s, int i, int j) { int k = getStates(sqlitedatabase, s); if(k == -1 || (3 & k >> mOffset) != i) { return false; } writeStates(sqlitedatabase, s, k, j); return true; } private static int getStates(SQLiteDatabase sqlitedatabase, String s) { Cursor cursor = null; sWhereArgs[0] = s; try { cursor = sqlitedatabase.query(USER_TABLE_NAME, STATE_PROJECTION, "account=?", sWhereArgs, null, null, null, "1"); if(cursor.moveToNext()) { return cursor.getInt(0); } return -1; } finally { if(null != cursor) { cursor.close(); } } } private void writeStates(SQLiteDatabase sqlitedatabase, String s, int i, int j) { sWhereArgs[0] = s; int k = i & (-1 ^ 3 << mOffset) | j << mOffset; sValues.put("sync_states", Integer.valueOf(k)); try { sqlitedatabase.beginTransaction(); sqlitedatabase.update(USER_TABLE_NAME, sValues, "account=?", sWhereArgs); sqlitedatabase.setTransactionSuccessful(); } finally { sqlitedatabase.endTransaction(); } } public final int getState(SQLiteDatabase sqlitedatabase, String s) { return 3 & getStates(sqlitedatabase, s) >> mOffset; } public final synchronized boolean isRequested(SQLiteDatabase sqlitedatabase, String s) { int i = getStates(sqlitedatabase, s); return !(i == -1 || (3 & i >> mOffset) != 2); } public final void onSyncFinish(SQLiteDatabase sqlitedatabase, String s) { compareAndSet(sqlitedatabase, s, 1, 0); } public final synchronized boolean onSyncRequested(SQLiteDatabase sqlitedatabase, String s) { int i = getStates(sqlitedatabase, s); if(i == -1 || (3 & i >> mOffset) == 2) { return false; } writeStates(sqlitedatabase, s, i, 2); return true; } public final boolean onSyncStart(SQLiteDatabase sqlitedatabase, String s) { return compareAndSet(sqlitedatabase, s, 2, 1); } public final void resetSyncToDirty(SQLiteDatabase sqlitedatabase, String s) { compareAndSet(sqlitedatabase, s, 1, 2); } }