From 3250987bd014d1c5463b8a39bbe988165ab1cc3f Mon Sep 17 00:00:00 2001 From: Angus Kong Date: Wed, 2 Oct 2013 16:53:40 -0700 Subject: Don't allow actions on items in progress. bug:11049529 Change-Id: Id6bd0f912f153b8b8e6b1a525a383ad8cadbe3dd --- src/com/android/camera/CameraActivity.java | 10 ++ .../android/camera/data/InProgressDataWrapper.java | 188 +++++++++++++++++++++ src/com/android/camera/data/LocalData.java | 14 +- src/com/android/camera/data/LocalMediaData.java | 29 ++-- src/com/android/camera/data/RotationTask.java | 2 +- src/com/android/camera/data/SimpleViewData.java | 6 +- 6 files changed, 227 insertions(+), 22 deletions(-) create mode 100644 src/com/android/camera/data/InProgressDataWrapper.java (limited to 'src/com') diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java index f306f1eda..c38b13031 100644 --- a/src/com/android/camera/CameraActivity.java +++ b/src/com/android/camera/CameraActivity.java @@ -70,6 +70,7 @@ import com.android.camera.data.CameraDataAdapter; import com.android.camera.data.CameraPreviewData; import com.android.camera.data.FixedFirstDataAdapter; import com.android.camera.data.FixedLastDataAdapter; +import com.android.camera.data.InProgressDataWrapper; import com.android.camera.data.LocalData; import com.android.camera.data.LocalDataAdapter; import com.android.camera.data.LocalMediaObserver; @@ -563,6 +564,7 @@ public class CameraActivity extends Activity } int supported = 0; + switch (type) { case LocalData.LOCAL_IMAGE: supported |= SUPPORT_DELETE | SUPPORT_ROTATE | SUPPORT_INFO @@ -660,6 +662,14 @@ public class CameraActivity extends Activity @Override public void run() { notifyNewMedia(imageUri); + int dataID = mDataAdapter.findDataByContentUri(imageUri); + if (dataID != -1) { + // Don't allow special UI actions (swipe to + // delete, for example) on in-progress data. + LocalData d = mDataAdapter.getLocalData(dataID); + InProgressDataWrapper newData = new InProgressDataWrapper(d); + mDataAdapter.updateData(dataID, newData); + } } }); } diff --git a/src/com/android/camera/data/InProgressDataWrapper.java b/src/com/android/camera/data/InProgressDataWrapper.java new file mode 100644 index 000000000..7de617bae --- /dev/null +++ b/src/com/android/camera/data/InProgressDataWrapper.java @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.camera.data; + +import android.app.Activity; +import android.content.ContentResolver; +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.view.View; + +import com.android.camera.util.PhotoSphereHelper; + +/** + * A wrapper class for in-progress data. Data that's still being processed + * should not supporting any actions. Only methods related to actions like + * {@link #isDataActionSupported(int)} and + * {@link #isUIActionSupported(int)} are implemented by this class. + */ +public class InProgressDataWrapper implements LocalData { + + final LocalData mLocalData; + + public InProgressDataWrapper(LocalData wrappedData) { + mLocalData = wrappedData; + } + + @Override + public View getView( + Activity a, int width, int height, + Drawable placeHolder, LocalDataAdapter adapter) { + return mLocalData.getView(a, width, height, placeHolder, adapter); + } + + @Override + public long getDateTaken() { + return mLocalData.getDateTaken(); + } + + @Override + public long getDateModified() { + return mLocalData.getLocalDataType(); + } + + @Override + public String getTitle() { + return mLocalData.getTitle(); + } + + @Override + public boolean isDataActionSupported(int actions) { + return false; + } + + @Override + public boolean delete(Context c) { + // No actions are allowed to modify the wrapped data. + return false; + } + + @Override + public boolean rotate90Degrees( + Context context, LocalDataAdapter adapter, + int currentDataId, boolean clockwise) { + // No actions are allowed to modify the wrapped data. + return false; + } + + @Override + public void onFullScreen(boolean fullScreen) { + mLocalData.onFullScreen(fullScreen); + } + + @Override + public boolean canSwipeInFullScreen() { + return mLocalData.canSwipeInFullScreen(); + } + + @Override + public String getPath() { + return mLocalData.getPath(); + } + + @Override + public String getMimeType() { + return mLocalData.getMimeType(); + } + + @Override + public MediaDetails getMediaDetails(Context context) { + return mLocalData.getMediaDetails(context); + } + + @Override + public int getLocalDataType() { + // Force the data type to be in-progress data. + return LOCAL_IN_PROGRESS_DATA; + } + + @Override + public long getSizeInBytes() { + return mLocalData.getSizeInBytes(); + } + + @Override + public LocalData refresh(ContentResolver resolver) { + return mLocalData.refresh(resolver); + } + + @Override + public long getContentId() { + return mLocalData.getContentId(); + } + + @Override + public int getWidth() { + return mLocalData.getWidth(); + } + + @Override + public int getHeight() { + return mLocalData.getHeight(); + } + + @Override + public int getOrientation() { + return mLocalData.getOrientation(); + } + + @Override + public int getViewType() { + return mLocalData.getViewType(); + } + + @Override + public double[] getLatLong() { + return mLocalData.getLatLong(); + } + + @Override + public boolean isUIActionSupported(int action) { + return false; + } + + @Override + public void prepare() { + mLocalData.prepare(); + } + + @Override + public void recycle() { + mLocalData.recycle(); + } + + @Override + public void isPhotoSphere(Context context, PanoramaSupportCallback callback) { + mLocalData.isPhotoSphere(context, callback); + } + + @Override + public void viewPhotoSphere(PhotoSphereHelper.PanoramaViewHelper helper) { + mLocalData.viewPhotoSphere(helper); + } + + @Override + public boolean isPhoto() { + return mLocalData.isPhoto(); + } + + @Override + public Uri getContentUri() { + return mLocalData.getContentUri(); + } +} diff --git a/src/com/android/camera/data/LocalData.java b/src/com/android/camera/data/LocalData.java index cfdcfa459..da64fee30 100644 --- a/src/com/android/camera/data/LocalData.java +++ b/src/com/android/camera/data/LocalData.java @@ -67,6 +67,12 @@ public interface LocalData extends FilmStripView.ImageData { * Constant for denoting a still image, with valid 360 PhotoSphere metadata. */ public static final int LOCAL_360_PHOTO_SPHERE = 6; + /** + * Constant for denoting an in-progress item which should not be touched + * before the related task is done. Data of this type should not support + * any actions like sharing, editing, etc. + */ + public static final int LOCAL_IN_PROGRESS_DATA = 7; View getView(Activity a, int width, int height, Drawable placeHolder, LocalDataAdapter adapter); @@ -110,8 +116,10 @@ public interface LocalData extends FilmStripView.ImageData { * @param adapter Used to update the view. * @param currentDataId Used to update the view. * @param clockwise True if the rotation goes clockwise. + * + * @return Whether the rotation is supported. */ - void rotate90Degrees(Context context, LocalDataAdapter adapter, + boolean rotate90Degrees(Context context, LocalDataAdapter adapter, int currentDataId, boolean clockwise); void onFullScreen(boolean fullScreen); @@ -187,8 +195,8 @@ public interface LocalData extends FilmStripView.ImageData { } /** - * @return the Id of the data. + * @return the {@link android.content.ContentResolver} Id of the data. */ - long getId(); + long getContentId(); } diff --git a/src/com/android/camera/data/LocalMediaData.java b/src/com/android/camera/data/LocalMediaData.java index 9b61fc38d..8e4b2f280 100644 --- a/src/com/android/camera/data/LocalMediaData.java +++ b/src/com/android/camera/data/LocalMediaData.java @@ -55,7 +55,7 @@ import java.util.Locale; * return a bitmap. */ public abstract class LocalMediaData implements LocalData { - protected final long mId; + protected final long mContentId; protected final String mTitle; protected final String mMimeType; protected final long mDateTakenInSeconds; @@ -80,11 +80,11 @@ public abstract class LocalMediaData implements LocalData { */ protected Boolean mUsing = false; - public LocalMediaData (long id, String title, String mimeType, + public LocalMediaData (long contentId, String title, String mimeType, long dateTakenInSeconds, long dateModifiedInSeconds, String path, int width, int height, long sizeInBytes, double latitude, double longitude) { - mId = id; + mContentId = contentId; mTitle = new String(title); mMimeType = new String(mimeType); mDateTakenInSeconds = dateTakenInSeconds; @@ -95,7 +95,6 @@ public abstract class LocalMediaData implements LocalData { mSizeInBytes = sizeInBytes; mLatitude = latitude; mLongitude = longitude; - return; } @Override @@ -109,8 +108,8 @@ public abstract class LocalMediaData implements LocalData { } @Override - public long getId() { - return mId; + public long getContentId() { + return mContentId; } @Override @@ -368,7 +367,7 @@ public abstract class LocalMediaData implements LocalData { Log.w(TAG, "Dimension decode failed for " + path); Bitmap b = BitmapFactory.decodeFile(path); if (b == null) { - Log.w(TAG, "PhotoData skipeped." + Log.w(TAG, "PhotoData skipped." + " Decoding " + path + "failed."); return null; } @@ -424,14 +423,14 @@ public abstract class LocalMediaData implements LocalData { @Override public boolean delete(Context c) { ContentResolver cr = c.getContentResolver(); - cr.delete(CONTENT_URI, MediaStore.Images.ImageColumns._ID + "=" + mId, null); + cr.delete(CONTENT_URI, MediaStore.Images.ImageColumns._ID + "=" + mContentId, null); return super.delete(c); } @Override public Uri getContentUri() { Uri baseUri = CONTENT_URI; - return baseUri.buildUpon().appendPath(String.valueOf(mId)).build(); + return baseUri.buildUpon().appendPath(String.valueOf(mContentId)).build(); } @Override @@ -571,12 +570,12 @@ public abstract class LocalMediaData implements LocalData { } @Override - public void rotate90Degrees(Context context, LocalDataAdapter adapter, + public boolean rotate90Degrees(Context context, LocalDataAdapter adapter, int currentDataId, boolean clockwise) { RotationTask task = new RotationTask(context, adapter, currentDataId, clockwise); task.execute(this); - return; + return true; } } @@ -717,14 +716,14 @@ public abstract class LocalMediaData implements LocalData { @Override public boolean delete(Context ctx) { ContentResolver cr = ctx.getContentResolver(); - cr.delete(CONTENT_URI, MediaStore.Video.VideoColumns._ID + "=" + mId, null); + cr.delete(CONTENT_URI, MediaStore.Video.VideoColumns._ID + "=" + mContentId, null); return super.delete(ctx); } @Override public Uri getContentUri() { Uri baseUri = CONTENT_URI; - return baseUri.buildUpon().appendPath(String.valueOf(mId)).build(); + return baseUri.buildUpon().appendPath(String.valueOf(mContentId)).build(); } @Override @@ -830,11 +829,11 @@ public abstract class LocalMediaData implements LocalData { } @Override - public void rotate90Degrees(Context context, LocalDataAdapter adapter, + public boolean rotate90Degrees(Context context, LocalDataAdapter adapter, int currentDataId, boolean clockwise) { // We don't support rotation for video data. Log.e(TAG, "Unexpected call in rotate90Degrees()"); - return; + return false; } } diff --git a/src/com/android/camera/data/RotationTask.java b/src/com/android/camera/data/RotationTask.java index 66134d44c..950ae9371 100644 --- a/src/com/android/camera/data/RotationTask.java +++ b/src/com/android/camera/data/RotationTask.java @@ -141,7 +141,7 @@ public class RotationTask extends AsyncTask { longitude = latLong[1]; } - result = new PhotoData(data.getId(), data.getTitle(), + result = new PhotoData(data.getContentId(), data.getTitle(), data.getMimeType(), data.getDateTaken(), data.getDateModified(), data.getPath(), newOrientation, newWidth, newHeight, data.getSizeInBytes(), latitude, longitude); diff --git a/src/com/android/camera/data/SimpleViewData.java b/src/com/android/camera/data/SimpleViewData.java index 2391f0f95..ba4459415 100644 --- a/src/com/android/camera/data/SimpleViewData.java +++ b/src/com/android/camera/data/SimpleViewData.java @@ -177,11 +177,11 @@ public class SimpleViewData implements LocalData { } @Override - public void rotate90Degrees(Context context, LocalDataAdapter adapter, + public boolean rotate90Degrees(Context context, LocalDataAdapter adapter, int currentDataId, boolean clockwise) { // We don't support rotation for SimpleViewData. Log.w(TAG, "Unexpected call in rotate90Degrees()"); - return; + return false; } @Override @@ -190,7 +190,7 @@ public class SimpleViewData implements LocalData { } @Override - public long getId() { + public long getContentId() { return -1; } } -- cgit v1.2.3