diff options
Diffstat (limited to 'src/com/android/camera/data')
-rw-r--r-- | src/com/android/camera/data/CameraDataAdapter.java | 59 | ||||
-rw-r--r-- | src/com/android/camera/data/LocalData.java | 88 |
2 files changed, 131 insertions, 16 deletions
diff --git a/src/com/android/camera/data/CameraDataAdapter.java b/src/com/android/camera/data/CameraDataAdapter.java index 609e812fc..0788c1a7a 100644 --- a/src/com/android/camera/data/CameraDataAdapter.java +++ b/src/com/android/camera/data/CameraDataAdapter.java @@ -57,6 +57,7 @@ public class CameraDataAdapter implements FilmStripView.DataAdapter { private int mSuggestedHeight = DEFAULT_DECODE_SIZE; private boolean mCameraPreviewLocked; + private LocalData mLocalDataToDelete; public CameraDataAdapter(Drawable placeHolder) { mPlaceHolder = placeHolder; @@ -86,6 +87,10 @@ public class CameraDataAdapter implements FilmStripView.DataAdapter { @Override public ImageData getImageData(int id) { + return getData(id); + } + + public LocalData getData(int id) { if (mImages == null || id >= mImages.size() || id < 0) { return null; } @@ -133,9 +138,12 @@ public class CameraDataAdapter implements FilmStripView.DataAdapter { return false; } - public void removeData(int dataID) { + public void removeData(Context c, int dataID) { if (dataID >= mImages.size()) return; LocalData d = mImages.remove(dataID); + // Delete previously removed data first. + executeDeletion(c); + mLocalDataToDelete = d; mListener.onDataRemoved(dataID, d); } @@ -177,6 +185,23 @@ public class CameraDataAdapter implements FilmStripView.DataAdapter { } } + public boolean undoDataRemoval() { + if (mLocalDataToDelete == null) return false; + LocalData d = mLocalDataToDelete; + mLocalDataToDelete = null; + insertData(d); + return true; + } + + public boolean executeDeletion(Context c) { + if (mLocalDataToDelete == null) return false; + + DeletionTask task = new DeletionTask(c); + task.execute(mLocalDataToDelete); + mLocalDataToDelete = null; + return true; + } + // Update all the data but keep the camera data if already set. private void replaceData(List<LocalData> list) { boolean changed = (list != mImages); @@ -343,6 +368,26 @@ public class CameraDataAdapter implements FilmStripView.DataAdapter { } } + private class DeletionTask extends AsyncTask<LocalData, Void, Void> { + Context mContext; + + DeletionTask(Context context) { + mContext = context; + } + + @Override + protected Void doInBackground(LocalData... data) { + for (int i = 0; i < data.length; i++) { + if (!data[i].isDataActionSupported(LocalData.ACTION_DELETE)) { + Log.v(TAG, "Deletion is not supported:" + data[i]); + continue; + } + data[i].delete(mContext); + } + return null; + } + } + private class CameraPreviewData implements LocalData { private int width; private int height; @@ -385,7 +430,17 @@ public class CameraDataAdapter implements FilmStripView.DataAdapter { } @Override - public boolean isActionSupported(int action) { + public boolean isUIActionSupported(int action) { + return false; + } + + @Override + public boolean isDataActionSupported(int action) { + return false; + } + + @Override + public boolean delete(Context c) { return false; } diff --git a/src/com/android/camera/data/LocalData.java b/src/com/android/camera/data/LocalData.java index 704e8edc9..0ccc63950 100644 --- a/src/com/android/camera/data/LocalData.java +++ b/src/com/android/camera/data/LocalData.java @@ -16,6 +16,7 @@ package com.android.camera.data; +import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; @@ -42,19 +43,26 @@ import com.android.camera.Util; import com.android.camera.ui.FilmStripView; import com.android.gallery3d.R; +import java.io.File; import java.util.Comparator; import java.util.Date; /* An abstract interface that represents the local media data. Also implements * Comparable interface so we can sort in DataAdapter. */ -public abstract interface LocalData extends FilmStripView.ImageData { - static final String TAG = "LocalData"; +public interface LocalData extends FilmStripView.ImageData { + static final String TAG = "CAM_LocalData"; - abstract View getView(Context c, int width, int height, Drawable placeHolder); - abstract long getDateTaken(); - abstract long getDateModified(); - abstract String getTitle(); + public static final int ACTION_NONE = 0; + public static final int ACTION_PLAY = 1; + public static final int ACTION_DELETE = (1 << 1); + + View getView(Context c, int width, int height, Drawable placeHolder); + long getDateTaken(); + long getDateModified(); + String getTitle(); + boolean isDataActionSupported(int action); + boolean delete(Context c); static class NewestFirstComparator implements Comparator<LocalData> { @@ -83,6 +91,8 @@ public abstract interface LocalData extends FilmStripView.ImageData { } } + // Implementations below. + /* * A base class for all the local media files. The bitmap is loaded in background * thread. Subclasses should implement their own background loading thread by @@ -128,10 +138,21 @@ public abstract interface LocalData extends FilmStripView.ImageData { } @Override - public boolean isActionSupported(int action) { + public boolean isUIActionSupported(int action) { + return false; + } + + @Override + public boolean isDataActionSupported(int action) { return false; } + @Override + public boolean delete(Context c) { + File f = new File(path); + return f.delete(); + } + protected View fillViewBackground(Context c, View v, int decodeWidth, int decodeHeight, Drawable placeHolder) { v.setBackground(placeHolder); @@ -225,9 +246,11 @@ public abstract interface LocalData extends FilmStripView.ImageData { ImageColumns.HEIGHT, // 8, int }; - private static final int mSupportedActions = + private static final int mSupportedUIActions = FilmStripView.ImageData.ACTION_DEMOTE | FilmStripView.ImageData.ACTION_PROMOTE; + private static final int mSupportedDataActions = + LocalData.ACTION_DELETE; // 32K buffer. private static final byte[] DECODE_TEMP_STORAGE = new byte[32 * 1024]; @@ -284,8 +307,20 @@ public abstract interface LocalData extends FilmStripView.ImageData { } @Override - public boolean isActionSupported(int action) { - return ((action & mSupportedActions) != 0); + public boolean isUIActionSupported(int action) { + return ((action & mSupportedUIActions) == action); + } + + @Override + public boolean isDataActionSupported(int action) { + return ((action & mSupportedDataActions) == action); + } + + @Override + public boolean delete(Context c) { + ContentResolver cr = c.getContentResolver(); + cr.delete(CONTENT_URI, ImageColumns._ID + "=" + id, null); + return super.delete(c); } @Override @@ -355,9 +390,12 @@ public abstract interface LocalData extends FilmStripView.ImageData { static final Uri CONTENT_URI = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; - private static final int mSupportedActions = + private static final int mSupportedUIActions = FilmStripView.ImageData.ACTION_DEMOTE | FilmStripView.ImageData.ACTION_PROMOTE; + private static final int mSupportedDataActions = + LocalData.ACTION_DELETE + | LocalData.ACTION_PLAY; static final String QUERY_ORDER = VideoColumns.DATE_TAKEN + " DESC, " + VideoColumns._ID + " DESC"; @@ -418,8 +456,20 @@ public abstract interface LocalData extends FilmStripView.ImageData { } @Override - public boolean isActionSupported(int action) { - return ((action & mSupportedActions) != 0); + public boolean isUIActionSupported(int action) { + return ((action & mSupportedUIActions) == action); + } + + @Override + public boolean isDataActionSupported(int action) { + return ((action & mSupportedDataActions) == action); + } + + @Override + public boolean delete(Context c) { + ContentResolver cr = c.getContentResolver(); + cr.delete(CONTENT_URI, VideoColumns._ID + "=" + id, null); + return super.delete(c); } @Override @@ -531,7 +581,17 @@ public abstract interface LocalData extends FilmStripView.ImageData { } @Override - public boolean isActionSupported(int action) { + public boolean isUIActionSupported(int action) { + return false; + } + + @Override + public boolean isDataActionSupported(int action) { + return false; + } + + @Override + public boolean delete(Context c) { return false; } |