/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.iu; import java.util.Iterator; import android.content.ContentResolver; import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.media.ExifInterface; import android.net.Uri; import android.preference.PreferenceManager; import android.util.Log; /** * * @author sihai * */ public class NewMediaTracker { private static final Config ALL_CONFIGS[]; private static final String EXIF_TAGS[] = { "FNumber", "DateTime", "ExposureTime", "Flash", "FocalLength", "GPSAltitude", "GPSAltitudeRef", "GPSDateStamp", "GPSLatitude", "GPSLatitudeRef", "GPSLongitude", "GPSLongitudeRef", "GPSProcessingMethod", "GPSTimeStamp", "ImageLength", "ImageWidth", "ISOSpeedRatings", "Make", "Model", "Orientation" }; private static final String MEDIA_RECORD_TABLE; private static final String PROJECTION_ID[] = { "_id" }; private static final String PROJECTION_MAX_ID[] = { "MAX(_id)" }; private static final String SELECT_MEDIA_NOT_UPLOADED_BY_ACCOUNT; private static final int UPLOAD_ACCOUNT_INDEX; private static final int UPLOAD_REASON_INDEX; private static NewMediaTracker sMediaTracker; private final Context mContext; private final SharedPreferences mPreferences; private boolean mStopProcessing; private final TrackRecord mTrackRecords[]; private final UploadsDatabaseHelper mUploadsDbHelper; static { UPLOAD_REASON_INDEX = MediaRecordEntry.SCHEMA.getColumnIndex("upload_reason"); UPLOAD_ACCOUNT_INDEX = MediaRecordEntry.SCHEMA.getColumnIndex("upload_account"); MEDIA_RECORD_TABLE = MediaRecordEntry.SCHEMA.getTableName(); SELECT_MEDIA_NOT_UPLOADED_BY_ACCOUNT = (new StringBuilder("upload_account IS NULL AND media_id NOT IN ( SELECT media_id FROM ")).append(MEDIA_RECORD_TABLE).append(" WHERE upload_account").append(" = ? )").toString(); Config aconfig[] = new Config[4]; aconfig[0] = new Config("photo", android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "external"); aconfig[1] = new Config("photo", android.provider.MediaStore.Images.Media.getContentUri("phoneStorage"), "phoneStorage"); aconfig[2] = new Config("video", android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI, "external"); aconfig[3] = new Config("video", android.provider.MediaStore.Video.Media.getContentUri("phoneStorage"), "phoneStorage"); ALL_CONFIGS = aconfig; } private NewMediaTracker(Context context) { mContext = context; mPreferences = PreferenceManager.getDefaultSharedPreferences(context); mUploadsDbHelper = UploadsDatabaseHelper.getInstance(context); mTrackRecords = new TrackRecord[ALL_CONFIGS.length]; loadStates(); } public static synchronized void clearPreferences(Context context) { // TODO } private static void clearPreferencesInternal( SharedPreferences sharedpreferences) { android.content.SharedPreferences.Editor editor = sharedpreferences .edit(); Iterator iterator = sharedpreferences.getAll().keySet().iterator(); do { if (!iterator.hasNext()) break; String s = (String) iterator.next(); if (s.startsWith("media_scanner.")) editor.remove(s); } while (true); editor.commit(); } public static synchronized NewMediaTracker getInstance(Context context) { NewMediaTracker newmediatracker; if(sMediaTracker == null) sMediaTracker = new NewMediaTracker(context); newmediatracker = sMediaTracker; return newmediatracker; } private static long getNextMediaId(ContentResolver contentresolver, Config config, long l) { // TODO return 0L; } private static long getOptionalLong(ContentResolver contentresolver, Uri uri, String as[], long l) { Cursor cursor = null; try { cursor = contentresolver.query(uri, as, null, null, null); if(cursor.moveToNext()) { return cursor.getLong(0); } } finally { if(null != cursor) { cursor.close(); } } return 0L; } private static String getOptionalString(ContentResolver contentresolver, Uri uri, String as[]) { Cursor cursor = null; try { cursor = contentresolver.query(uri, as, null, null, null); if(cursor.moveToNext()) { return cursor.getString(0); } } finally { if(null != cursor) { cursor.close(); } } return null; } private static boolean hasExif(ExifInterface exifinterface) { // TODO return false; } private static boolean hasGoogleUploadExif(ContentResolver contentresolver, Uri uri) { // TODO return false; } private static boolean isStorageAvailable(ContentResolver contentresolver, Config config) { // TODO return false; } private void loadStates() { for(int i = -1 + mTrackRecords.length; i >= 0; i--) { Config config = ALL_CONFIGS[i]; TrackRecord trackrecord = new TrackRecord(config); trackrecord.mLastMediaId = mPreferences.getLong(config.mKeyLastMediaId, 0L); mTrackRecords[i] = trackrecord; } } private boolean performSanityChecks(ContentResolver contentresolver, UploadSettings uploadsettings, Uri uri, boolean flag) { // TODO return false; } private synchronized void resetPreferencesInternal() { clearPreferencesInternal(mPreferences); loadStates(); mStopProcessing = false; } private void saveStates() { android.content.SharedPreferences.Editor editor = mPreferences.edit(); TrackRecord atrackrecord[] = mTrackRecords; int i = atrackrecord.length; for(int j = 0; j < i; j++) { TrackRecord trackrecord = atrackrecord[j]; editor.putLong(trackrecord.mConfig.mKeyLastMediaId, trackrecord.mLastMediaId); } editor.commit(); } final void cancelUpload(String s, int i) { Cursor cursor = null; SQLiteDatabase sqlitedatabase = mUploadsDbHelper.getReadableDatabase(); String s1 = MEDIA_RECORD_TABLE; String as[] = MediaRecordEntry.SCHEMA.getProjection(); String as1[] = new String[2]; as1[0] = s; as1[1] = Integer.toString(40); try { cursor = sqlitedatabase.query(s1, as, "upload_account = ? AND upload_reason = ? AND upload_state < 200", as1, null, null, null); while(cursor.moveToNext()) { MediaRecordEntry mediarecordentry = MediaRecordEntry.fromCursor(cursor); MediaRecordEntry.SCHEMA.deleteWithId(mUploadsDbHelper.getWritableDatabase(), mediarecordentry.id); } } finally { if(null != cursor) { cursor.close(); } } } /*final UploadTaskEntry getNextUpload(HashSet hashset, PicasaSyncHelper.SyncContext synccontext) { // TODO return null; }*/ final int getUploadProgress(String s, int i) { // TODO return 0; } final int getUploadTotal(int i) { Cursor cursor = null; try { cursor = mUploadsDbHelper.getReadableDatabase().query(true, MEDIA_RECORD_TABLE, new String[] { "COUNT(*)" }, "upload_account IS NULL", null, null, null, null, null); if(cursor.moveToNext()) { return cursor.getInt(0); } } finally { if(null != cursor) { cursor.close(); } } return 0; } final void onUploadComplete(UploadTaskEntry uploadtaskentry) { MediaRecordEntry mediarecordentry = MediaRecordEntry.fromId(mUploadsDbHelper.getReadableDatabase(), uploadtaskentry.getMediaRecordId()); if(mediarecordentry == null) { Log.w("iu.UploadsManager", (new StringBuilder("Could not get media record for task: ")).append(uploadtaskentry).toString()); } else { mediarecordentry.setState(300); MediaRecordEntry.SCHEMA.insertOrReplace(mUploadsDbHelper.getWritableDatabase(), mediarecordentry); } } public final synchronized int processNewMedia() { // TODO return 0; } final void startUpload(String s, int i) { SQLiteDatabase sqlitedatabase; Cursor cursor = null; sqlitedatabase = mUploadsDbHelper.getWritableDatabase(); try { cursor = mUploadsDbHelper.getReadableDatabase().query(true, MEDIA_RECORD_TABLE, MediaRecordEntry.SCHEMA.getProjection(), SELECT_MEDIA_NOT_UPLOADED_BY_ACCOUNT, new String[] { s }, null, null, null, null); while(cursor.moveToNext()) { MediaRecordEntry mediarecordentry1 = MediaRecordEntry.fromCursor(cursor); mediarecordentry1.id = 0L; mediarecordentry1.setUploadAccount(s); mediarecordentry1.setUploadReason(40); mediarecordentry1.setState(100); MediaRecordEntry.SCHEMA.insertOrReplace(sqlitedatabase, mediarecordentry1); } } finally { if(null != cursor) { cursor.close(); } } } public final String toString() { StringBuilder stringbuilder = new StringBuilder(); stringbuilder.append("NewMediaTracker:"); TrackRecord atrackrecord[] = mTrackRecords; int i = atrackrecord.length; for(int j = 0; j < i; j++) { TrackRecord trackrecord = atrackrecord[j]; stringbuilder.append(";").append(trackrecord.toString()); } return stringbuilder.toString(); } private static final class Config { public final String toString() { return (new StringBuilder()).append(mMediaType).append("-").append(mStorage).toString(); } public final String mKeyLastMediaId; public final Uri mMediaStoreUri; public final String mMediaType; public final String mStorage; public Config(String s, Uri uri, String s1) { mMediaType = s; mStorage = s1; mMediaStoreUri = uri; mKeyLastMediaId = (new StringBuilder("media_scanner.")).append(s1).append(".").append(s).append(".last_media_id").toString(); } } private static final class TrackRecord { public final String toString() { return (new StringBuilder()).append(mConfig).append(",").append(mLastMediaId).toString(); } final Config mConfig; long mLastMediaId; TrackRecord(Config config) { mConfig = config; } } }