summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAngus Kong <shkong@google.com>2013-12-16 15:02:34 -0800
committerAngus Kong <shkong@google.com>2013-12-18 15:53:17 -0800
commit8a2350a3d557465b53445685db0f9ac838cf90c5 (patch)
treefe1c44b730cc03cb1976da14b70d054898b32bf3
parent7485451166805efa4de46930cc60f2822e62d882 (diff)
downloadandroid_packages_apps_Camera2-8a2350a3d557465b53445685db0f9ac838cf90c5.tar.gz
android_packages_apps_Camera2-8a2350a3d557465b53445685db0f9ac838cf90c5.tar.bz2
android_packages_apps_Camera2-8a2350a3d557465b53445685db0f9ac838cf90c5.zip
Refactor the photosphere/refocus metadata loading.
1. Metadata added to allow for different attributes to describe LocalData. 2. Move the metadata loading process to image data loading. 3. LocalData.view() removed. The invocation of external viewer is moved back to the activity. bug:12197251 Change-Id: I496b018186f7a4b4818b976201703b966103a636
-rw-r--r--src/com/android/camera/CameraActivity.java90
-rw-r--r--src/com/android/camera/app/CameraAppUI.java2
-rw-r--r--src/com/android/camera/app/FilmstripBottomControls.java4
-rw-r--r--src/com/android/camera/data/AbstractLocalDataAdapterWrapper.java16
-rw-r--r--src/com/android/camera/data/CameraDataAdapter.java29
-rw-r--r--src/com/android/camera/data/InProgressDataWrapper.java23
-rw-r--r--src/com/android/camera/data/LocalData.java58
-rw-r--r--src/com/android/camera/data/LocalDataAdapter.java22
-rw-r--r--src/com/android/camera/data/LocalMediaData.java187
-rw-r--r--src/com/android/camera/data/PanoramaMetadataLoader.java89
-rw-r--r--src/com/android/camera/data/RgbzMetadataLoader.java99
-rw-r--r--src/com/android/camera/data/SimpleViewData.java23
-rw-r--r--src/com/android/camera/filmstrip/FilmstripContentPanel.java4
-rw-r--r--src/com/android/camera/filmstrip/FilmstripController.java8
-rw-r--r--src/com/android/camera/filmstrip/ImageData.java6
-rw-r--r--src/com/android/camera/widget/FilmstripView.java3
16 files changed, 250 insertions, 413 deletions
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index 8579b3d8d..b5b68ad34 100644
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -81,6 +81,8 @@ import com.android.camera.data.InProgressDataWrapper;
import com.android.camera.data.LocalData;
import com.android.camera.data.LocalDataAdapter;
import com.android.camera.data.LocalMediaObserver;
+import com.android.camera.data.PanoramaMetadataLoader;
+import com.android.camera.data.RgbzMetadataLoader;
import com.android.camera.data.SimpleViewData;
import com.android.camera.filmstrip.FilmstripContentPanel;
import com.android.camera.filmstrip.FilmstripController;
@@ -221,10 +223,23 @@ public class CameraActivity extends Activity
* panorama viewer.
*/
@Override
- public void onView() {
- LocalData data = getCurrentLocalData();
- if (data != null) {
- data.view(mPanoramaViewHelper);
+ public void onExternalViewer() {
+ if (mPanoramaViewHelper == null) {
+ return;
+ }
+ final LocalData data = getCurrentLocalData();
+ if (data == null) {
+ return;
+ }
+ final Uri contentUri = data.getContentUri();
+ if (contentUri == Uri.EMPTY) {
+ return;
+ }
+
+ if (PanoramaMetadataLoader.isPanorama(data)) {
+ mPanoramaViewHelper.showPanorama(contentUri);
+ } else if (RgbzMetadataLoader.hasRGBZData(data)) {
+ mPanoramaViewHelper.showRgbz(contentUri);
}
}
@@ -294,7 +309,7 @@ public class CameraActivity extends Activity
private Intent getShareIntentByData(final LocalData data) {
Intent intent = null;
final Uri contentUri = data.getContentUri();
- if (data.getLocalDataType() == LocalData.LOCAL_360_PHOTO_SPHERE &&
+ if (PanoramaMetadataLoader.isPanorama360(data) &&
data.getContentUri() != Uri.EMPTY) {
intent = new Intent(Intent.ACTION_SEND);
intent.setType("application/vnd.google.panorama360+jpg");
@@ -482,6 +497,14 @@ public class CameraActivity extends Activity
}
@Override
+ public void onDataUpdated(int dataId) {
+ if (!mFilmstripVisible) {
+ return;
+ }
+ updateUiByData(mFilmstripController.getCurrentId());
+ }
+
+ @Override
public void onEnterZoomView(int dataID) {
if (mFilmstripVisible) {
CameraActivity.this.setFilmstripUiVisibility(false);
@@ -617,7 +640,7 @@ public class CameraActivity extends Activity
hideSessionProgress();
updateSessionProgress(0);
}
- mDataAdapter.refresh(getContentResolver(), uri, /* isInProgress */ false);
+ mDataAdapter.refresh(CameraActivity.this, uri, /* isInProgress */ false);
}
@Override
@@ -638,7 +661,7 @@ public class CameraActivity extends Activity
@Override
public void onSessionUpdated(Uri uri) {
- mDataAdapter.refresh(getContentResolver(), uri, /* isInProgress */ true);
+ mDataAdapter.refresh(CameraActivity.this, uri, /* isInProgress */ true);
}
};
@@ -755,12 +778,12 @@ public class CameraActivity extends Activity
String mimeType = cr.getType(uri);
if (mimeType.startsWith("video/")) {
sendBroadcast(new Intent(CameraUtil.ACTION_NEW_VIDEO, uri));
- mDataAdapter.addNewVideo(cr, uri);
+ mDataAdapter.addNewVideo(this, uri);
} else if (mimeType.startsWith("image/")) {
CameraUtil.broadcastNewPicture(this, uri);
- mDataAdapter.addNewPhoto(cr, uri);
+ mDataAdapter.addNewPhoto(this, uri);
} else if (mimeType.startsWith(PlaceholderManager.PLACEHOLDER_MIME_TYPE)) {
- mDataAdapter.addNewPhoto(cr, uri);
+ mDataAdapter.addNewPhoto(this, uri);
} else {
android.util.Log.w(TAG, "Unknown new media with MIME type:"
+ mimeType + ", uri:" + uri);
@@ -954,7 +977,7 @@ public class CameraActivity extends Activity
if (!mSecureCamera) {
mFilmstripController.setDataAdapter(mDataAdapter);
if (!isCaptureIntent()) {
- mDataAdapter.requestLoad(getContentResolver());
+ mDataAdapter.requestLoad(this);
}
} else {
// Put a lock placeholder as the last image by setting its date to
@@ -1095,7 +1118,7 @@ public class CameraActivity extends Activity
// If it's secure camera, requestLoad() should not be called
// as it will load all the data.
if (!mFilmstripVisible) {
- mDataAdapter.requestLoad(getContentResolver());
+ mDataAdapter.requestLoad(this);
}
}
}
@@ -1645,38 +1668,17 @@ public class CameraActivity extends Activity
/* View button */
// We need to add this to a separate DB.
- // TODO: Redesign this.
- currentData.requestAuxInfo(this, new LocalData.AuxInfoSupportCallback() {
- @Override
- public void auxInfoAvailable(final boolean isPanorama,
- final boolean isPanorama360, boolean isRgbz) {
- // Make sure the returned data is for the current image.
- if (dataId != mFilmstripController.getCurrentId()) {
- return;
- }
-
- // If this is a photo sphere, show the button to view it. If it's a full
- // 360 photo sphere, show the tiny planet button.
- final int viewButtonVisibility;
- if (isPanorama) {
- viewButtonVisibility = CameraAppUI.BottomControls.VIEW_PHOTO_SPHERE;
- } else if (isRgbz) {
- viewButtonVisibility = CameraAppUI.BottomControls.VIEW_RGBZ;
- } else {
- viewButtonVisibility = CameraAppUI.BottomControls.VIEW_NONE;
- }
-
- runOnUiThread(new Runnable() {
+ final int viewButtonVisibility;
+ if (PanoramaMetadataLoader.isPanorama(currentData)) {
+ viewButtonVisibility = CameraAppUI.BottomControls.VIEW_PHOTO_SPHERE;
+ } else if (RgbzMetadataLoader.hasRGBZData(currentData)) {
+ viewButtonVisibility = CameraAppUI.BottomControls.VIEW_RGBZ;
+ } else {
+ viewButtonVisibility = CameraAppUI.BottomControls.VIEW_NONE;
+ }
- @Override
- public void run() {
- if (mFilmstripController.getCurrentId() == dataId) {
- filmstripBottomControls.setTinyPlanetButtonVisibility(isPanorama360);
- filmstripBottomControls.setViewButtonVisibility(viewButtonVisibility);
- }
- }
- });
- }
- });
+ filmstripBottomControls.setTinyPlanetButtonVisibility(
+ PanoramaMetadataLoader.isPanorama360(currentData));
+ filmstripBottomControls.setViewButtonVisibility(viewButtonVisibility);
}
}
diff --git a/src/com/android/camera/app/CameraAppUI.java b/src/com/android/camera/app/CameraAppUI.java
index 169a31cf3..9d1ca1239 100644
--- a/src/com/android/camera/app/CameraAppUI.java
+++ b/src/com/android/camera/app/CameraAppUI.java
@@ -146,7 +146,7 @@ public class CameraAppUI implements ModeListView.ModeSwitchListener,
* Called when the user pressed the "view" button to e.g. view a photo
* sphere or RGBZ image.
*/
- public void onView();
+ public void onExternalViewer();
/**
* Called when the "edit" button is pressed.
diff --git a/src/com/android/camera/app/FilmstripBottomControls.java b/src/com/android/camera/app/FilmstripBottomControls.java
index 7a52cbfb1..c1f686fd2 100644
--- a/src/com/android/camera/app/FilmstripBottomControls.java
+++ b/src/com/android/camera/app/FilmstripBottomControls.java
@@ -16,8 +16,6 @@
package com.android.camera.app;
-import android.content.Context;
-import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
@@ -174,7 +172,7 @@ class FilmstripBottomControls implements CameraAppUI.BottomControls {
@Override
public void onClick(View view) {
if (mListener != null) {
- mListener.onView();
+ mListener.onExternalViewer();
}
}
});
diff --git a/src/com/android/camera/data/AbstractLocalDataAdapterWrapper.java b/src/com/android/camera/data/AbstractLocalDataAdapterWrapper.java
index 097426f9c..3b3a9082d 100644
--- a/src/com/android/camera/data/AbstractLocalDataAdapterWrapper.java
+++ b/src/com/android/camera/data/AbstractLocalDataAdapterWrapper.java
@@ -60,18 +60,18 @@ public abstract class AbstractLocalDataAdapterWrapper implements LocalDataAdapte
}
@Override
- public void requestLoad(ContentResolver resolver) {
- mAdapter.requestLoad(resolver);
+ public void requestLoad(Context context) {
+ mAdapter.requestLoad(context);
}
@Override
- public void addNewVideo(ContentResolver resolver, Uri uri) {
- mAdapter.addNewVideo(resolver, uri);
+ public void addNewVideo(Context context, Uri uri) {
+ mAdapter.addNewVideo(context, uri);
}
@Override
- public void addNewPhoto(ContentResolver resolver, Uri uri) {
- mAdapter.addNewPhoto(resolver, uri);
+ public void addNewPhoto(Context context, Uri uri) {
+ mAdapter.addNewPhoto(context, uri);
}
@Override
@@ -95,7 +95,7 @@ public abstract class AbstractLocalDataAdapterWrapper implements LocalDataAdapte
}
@Override
- public void refresh(ContentResolver resolver, Uri uri, boolean isInProgressSession) {
- mAdapter.refresh(resolver, uri, isInProgressSession);
+ public void refresh(Context context, Uri uri, boolean isInProgressSession) {
+ mAdapter.refresh(context, uri, isInProgressSession);
}
}
diff --git a/src/com/android/camera/data/CameraDataAdapter.java b/src/com/android/camera/data/CameraDataAdapter.java
index efd45123a..68fb3fdf6 100644
--- a/src/com/android/camera/data/CameraDataAdapter.java
+++ b/src/com/android/camera/data/CameraDataAdapter.java
@@ -58,9 +58,9 @@ public class CameraDataAdapter implements LocalDataAdapter {
}
@Override
- public void requestLoad(ContentResolver resolver) {
- QueryTask qtask = new QueryTask();
- qtask.execute(resolver);
+ public void requestLoad(Context context) {
+ QueryTask qtask = new QueryTask(context);
+ qtask.execute(context.getContentResolver());
}
@Override
@@ -133,8 +133,8 @@ public class CameraDataAdapter implements LocalDataAdapter {
// TODO: put the database query on background thread
@Override
- public void addNewVideo(ContentResolver cr, Uri uri) {
- Cursor c = cr.query(uri,
+ public void addNewVideo(Context context, Uri uri) {
+ Cursor c = context.getContentResolver().query(uri,
LocalMediaData.VideoData.QUERY_PROJECTION,
MediaStore.Images.Media.DATA + " like ? ", CAMERA_PATH,
LocalMediaData.VideoData.QUERY_ORDER);
@@ -154,8 +154,8 @@ public class CameraDataAdapter implements LocalDataAdapter {
// TODO: put the database query on background thread
@Override
- public void addNewPhoto(ContentResolver cr, Uri uri) {
- Cursor c = cr.query(uri,
+ public void addNewPhoto(Context context, Uri uri) {
+ Cursor c = context.getContentResolver().query(uri,
LocalMediaData.PhotoData.QUERY_PROJECTION,
MediaStore.Images.Media.DATA + " like ? ", CAMERA_PATH,
LocalMediaData.PhotoData.QUERY_ORDER);
@@ -165,7 +165,7 @@ public class CameraDataAdapter implements LocalDataAdapter {
if (c == null || !c.moveToFirst()) {
return;
}
- newData = LocalMediaData.PhotoData.buildFromCursor(c);
+ newData = LocalMediaData.PhotoData.buildFromCursor(context, c);
} finally {
// Ensure cursor is closed before returning
if (c != null) {
@@ -216,14 +216,15 @@ public class CameraDataAdapter implements LocalDataAdapter {
}
@Override
- public void refresh(ContentResolver resolver, Uri contentUri, boolean isInProgressSession) {
+ public void refresh(Context context, Uri contentUri,
+ boolean isInProgressSession) {
int pos = findDataByContentUri(contentUri);
if (pos == -1) {
return;
}
LocalData data = mImages.get(pos);
- LocalData refreshedData = data.refresh(resolver);
+ LocalData refreshedData = data.refresh(context);
// Wrap the data item if this represents a session that is in progress.
if (isInProgressSession) {
@@ -280,6 +281,12 @@ public class CameraDataAdapter implements LocalDataAdapter {
}
private class QueryTask extends AsyncTask<ContentResolver, Void, LocalDataList> {
+ private Context mContext;
+
+ public QueryTask(Context context) {
+ super();
+ mContext = context;
+ }
/**
* Loads all the photo and video data in the camera folder in background
@@ -300,7 +307,7 @@ public class CameraDataAdapter implements LocalDataAdapter {
if (c != null && c.moveToFirst()) {
// build up the list.
while (true) {
- LocalData data = LocalMediaData.PhotoData.buildFromCursor(c);
+ LocalData data = LocalMediaData.PhotoData.buildFromCursor(mContext, c);
if (data != null) {
if (data.getMimeType().equals(PlaceholderManager.PLACEHOLDER_MIME_TYPE)) {
l.add(new InProgressDataWrapper(data, true));
diff --git a/src/com/android/camera/data/InProgressDataWrapper.java b/src/com/android/camera/data/InProgressDataWrapper.java
index 2a468584c..4f79ea360 100644
--- a/src/com/android/camera/data/InProgressDataWrapper.java
+++ b/src/com/android/camera/data/InProgressDataWrapper.java
@@ -20,6 +20,7 @@ import android.content.ContentResolver;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.net.Uri;
+import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
@@ -74,7 +75,7 @@ public class InProgressDataWrapper implements LocalData {
@Override
public long getDateModified() {
- return mLocalData.getLocalDataType();
+ return mLocalData.getDateModified();
}
@Override
@@ -138,8 +139,8 @@ public class InProgressDataWrapper implements LocalData {
}
@Override
- public LocalData refresh(ContentResolver resolver) {
- return mLocalData.refresh(resolver);
+ public LocalData refresh(Context context) {
+ return mLocalData.refresh(context);
}
@Override
@@ -148,6 +149,11 @@ public class InProgressDataWrapper implements LocalData {
}
@Override
+ public Bundle getMetadata() {
+ return mLocalData.getMetadata();
+ }
+
+ @Override
public int getWidth() {
return mLocalData.getWidth();
}
@@ -188,17 +194,6 @@ public class InProgressDataWrapper implements LocalData {
}
@Override
- public void requestAuxInfo(Context context, AuxInfoSupportCallback callback) {
- mLocalData.requestAuxInfo(context, callback);
- }
-
-
- @Override
- public void view(PhotoSphereHelper.PanoramaViewHelper helper) {
- mLocalData.view(helper);
- }
-
- @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 8137ae27c..62d2502bc 100644
--- a/src/com/android/camera/data/LocalData.java
+++ b/src/com/android/camera/data/LocalData.java
@@ -16,9 +16,9 @@
package com.android.camera.data;
-import android.content.ContentResolver;
import android.content.Context;
import android.graphics.drawable.Drawable;
+import android.os.Bundle;
import android.view.View;
import com.android.camera.filmstrip.ImageData;
@@ -62,28 +62,15 @@ public interface LocalData extends ImageData {
*/
public static final int LOCAL_VIDEO = 4;
/**
- * Constant for denoting a still image, with valid PhotoSphere metadata.
- */
- public static final int LOCAL_PHOTO_SPHERE = 5;
- /**
- * 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;
-
- /**
- * Constant for denoting an RGBZ image.
- */
- public static final int LOCAL_RGBZ = 8;
+ public static final int LOCAL_IN_PROGRESS_DATA = 5;
// TODO: Re-think how the in-progress logic works. We shouldn't need to pass
// in the information about whether this session is in progress.
- View getView(Context ctx, int width, int height, Drawable placeHolder,
+ View getView(Context context, int width, int height, Drawable placeHolder,
LocalDataAdapter adapter, boolean isInProgress);
/**
@@ -172,39 +159,20 @@ public interface LocalData extends ImageData {
/**
* Refresh the data content.
*
- * @param resolver {@link ContentResolver} to refresh the data.
+ * @param context The Android {@link android.content.Context}.
* @return A new LocalData object if success, null otherwise.
*/
- LocalData refresh(ContentResolver resolver);
+ LocalData refresh(Context context);
/**
- * Request for the auxiliary info of the data. The result will be sent back
- * through the {@link com.android.camera.data.LocalData.AuxInfoSupportCallback}.
- *
- * @param context The context to retrieve the auxiliary data.
- * @param callback The callback to receive the retrieved result.
+ * @return the {@link android.content.ContentResolver} Id of the data.
*/
- @Deprecated
- public void requestAuxInfo(Context context, AuxInfoSupportCallback callback);
+ long getContentId();
/**
- * Interface that is used to tell the caller whether an image is a photo
- * sphere.
- *
- * We need to deprecate this and store this data in a separate DB for
- * additional aux data.
- */
- @Deprecated
- interface AuxInfoSupportCallback {
- /**
- * Called when photo sphere info has been loaded.
- *
- * @param isPanorama whether the image is a valid photo sphere
- * @param isPanorama360 whether the photo sphere is a full 360
- * degree horizontal panorama
- */
- void auxInfoAvailable(boolean isPanorama, boolean isPanorama360, boolean isRgbz);
- }
+ * @return the metadata. Should never be {@code null}.
+ */
+ Bundle getMetadata();
static class NewestFirstComparator implements Comparator<LocalData> {
@@ -232,10 +200,4 @@ public interface LocalData extends ImageData {
return cmp;
}
}
-
- /**
- * @return the {@link android.content.ContentResolver} Id of the data.
- */
- long getContentId();
}
-
diff --git a/src/com/android/camera/data/LocalDataAdapter.java b/src/com/android/camera/data/LocalDataAdapter.java
index 9b8aef9f2..e61ef2fc1 100644
--- a/src/com/android/camera/data/LocalDataAdapter.java
+++ b/src/com/android/camera/data/LocalDataAdapter.java
@@ -16,7 +16,6 @@
package com.android.camera.data;
-import android.content.ContentResolver;
import android.content.Context;
import android.net.Uri;
@@ -31,9 +30,10 @@ public interface LocalDataAdapter extends DataAdapter {
/**
* Request for loading the local data.
*
- * @param resolver {@link ContentResolver} used for data loading.
+ * @param context The Android {@link android.content.Context} this data
+ * adapter is used in.
*/
- public void requestLoad(ContentResolver resolver);
+ public void requestLoad(Context context);
/**
* Returns the specified {@link LocalData}.
@@ -54,28 +54,30 @@ public interface LocalDataAdapter extends DataAdapter {
/**
* Add new local video data.
*
- * @param resolver {@link ContentResolver} used to add the data.
- * @param uri {@link Uri} of the video.
+ * @param context The Android {@link android.content.Context} this data
+ * adapter is used in.
+ * @param uri {@link Uri} of the video.
*/
- public void addNewVideo(ContentResolver resolver, Uri uri);
+ public void addNewVideo(Context context, Uri uri);
/**
* Adds new local photo data.
*
- * @param resolver {@link ContentResolver} used to add the data.
+ * @param context The Android {@link android.content.Context} this data
+ * adapter is used in.
* @param uri {@link Uri} of the photo.
*/
- public void addNewPhoto(ContentResolver resolver, Uri uri);
+ public void addNewPhoto(Context context, Uri uri);
/**
* Refresh the data by {@link Uri}.
*
- * @param resolver {@link ContentResolver} used to refresh the data.
+ * @param context The Android {@link android.content.Context}.
* @param uri The {@link Uri} of the data to refresh.
* @param isInProgressSession Whether this data item has a session in
* progress associated with it.
*/
- public void refresh(ContentResolver resolver, Uri uri, boolean isInProgressSession);
+ public void refresh(Context context, Uri uri, boolean isInProgressSession);
/**
* Finds the {@link LocalData} of the specified content Uri.
diff --git a/src/com/android/camera/data/LocalMediaData.java b/src/com/android/camera/data/LocalMediaData.java
index 8ceae9d08..162c69cb4 100644
--- a/src/com/android/camera/data/LocalMediaData.java
+++ b/src/com/android/camera/data/LocalMediaData.java
@@ -29,6 +29,7 @@ import android.graphics.drawable.Drawable;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.os.AsyncTask;
+import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.util.Log;
@@ -38,7 +39,6 @@ import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
-import com.android.camera.data.RgbzMetadataLoader.RgbzMetadataCallback;
import com.android.camera.util.CameraUtil;
import com.android.camera.util.PhotoSphereHelper;
import com.android.camera2.R;
@@ -68,9 +68,7 @@ public abstract class LocalMediaData implements LocalData {
protected final long mSizeInBytes;
protected final double mLatitude;
protected final double mLongitude;
-
- /** The panorama metadata information of this media data. */
- protected PhotoSphereHelper.PanoramaMetadata mPanoramaMetadata;
+ protected final Bundle mMetaData;
/** Used to load photo sphere metadata from image files. */
protected PanoramaMetadataLoader mPanoramaMetadataLoader;
@@ -99,6 +97,7 @@ public abstract class LocalMediaData implements LocalData {
mSizeInBytes = sizeInBytes;
mLatitude = latitude;
mLongitude = longitude;
+ mMetaData = new Bundle();
}
@Override
@@ -157,84 +156,12 @@ public abstract class LocalMediaData implements LocalData {
}
@Override
- public boolean delete(Context ctx) {
+ public boolean delete(Context context) {
File f = new File(mPath);
return f.delete();
}
@Override
- public void view(PhotoSphereHelper.PanoramaViewHelper helper) {
- if (mPanoramaMetadata != null && mPanoramaMetadata.mUsePanoramaViewer) {
- helper.showPanorama(getContentUri());
- } else if (mIsRgbz != null && mIsRgbz.booleanValue()) {
- helper.showRgbz(getContentUri());
- }
- }
-
- @Override
- public void requestAuxInfo(Context context, final AuxInfoSupportCallback callback) {
- // If we already have metadata, use it.
- if (mPanoramaMetadata != null && mIsRgbz != null) {
- callback.auxInfoAvailable(mPanoramaMetadata.mUsePanoramaViewer,
- mPanoramaMetadata.mIsPanorama360, mIsRgbz.booleanValue());
- return;
- }
-
- final Semaphore sem = new Semaphore(1);
- if (mPanoramaMetadata == null) {
- // Drain all permits so the rgbz return callback waits for the
- // panorama data result.
- sem.drainPermits();
- // Otherwise prepare a loader, if we don't have one already.
- if (mPanoramaMetadataLoader == null) {
- mPanoramaMetadataLoader = new PanoramaMetadataLoader(getContentUri());
- }
- // Load the metadata asynchronously.
- mPanoramaMetadataLoader.getPanoramaMetadata(context,
- new PanoramaMetadataLoader.PanoramaMetadataCallback() {
- @Override
- public void onPanoramaMetadataLoaded(
- PhotoSphereHelper.PanoramaMetadata metadata) {
- // Store the metadata and remove the loader to free
- // up
- // space.
- mPanoramaMetadata = metadata;
- mPanoramaMetadataLoader = null;
- sem.release();
- }
- });
- }
-
- if (mIsRgbz == null) {
- if (mRgbzMetadataLoader == null) {
- mRgbzMetadataLoader = new RgbzMetadataLoader(getContentUri());
- }
- mRgbzMetadataLoader.getRgbzMetadata(context, new RgbzMetadataCallback() {
- @Override
- public void onRgbzMetadataLoaded(Boolean isRgbz) {
- mIsRgbz = isRgbz;
- mRgbzMetadataLoader = null;
- try {
- // Wait, if needed, for the result of the panorama data
- // update.
- sem.acquire();
- } catch (InterruptedException e) {
- // Do nothing
- }
-
- boolean usePanoramaViewer = mPanoramaMetadata != null
- && mPanoramaMetadata.mUsePanoramaViewer;
- boolean isPanorama360 = mPanoramaMetadata != null
- && mPanoramaMetadata.mIsPanorama360;
- boolean isItRgbz = mIsRgbz != null & mIsRgbz.booleanValue();
- callback.auxInfoAvailable(usePanoramaViewer,
- isPanorama360, isItRgbz);
- }
- });
- }
- }
-
- @Override
public void onFullScreen(boolean fullScreen) {
// do nothing.
}
@@ -244,22 +171,22 @@ public abstract class LocalMediaData implements LocalData {
return true;
}
- protected ImageView fillImageView(Context ctx, ImageView v,
+ protected ImageView fillImageView(Context context, ImageView v,
int decodeWidth, int decodeHeight, Drawable placeHolder,
LocalDataAdapter adapter, boolean isInProgress) {
v.setScaleType(ImageView.ScaleType.FIT_XY);
v.setImageDrawable(placeHolder);
- BitmapLoadTask task = getBitmapLoadTask(v, decodeWidth, decodeHeight,
- ctx.getContentResolver(), adapter, isInProgress);
+ BitmapLoadTask task = getBitmapLoadTask(context, v, decodeWidth, decodeHeight,
+ context.getContentResolver(), adapter, isInProgress);
task.execute();
return v;
}
@Override
- public View getView(Context ctx, int decodeWidth, int decodeHeight, Drawable placeHolder,
+ public View getView(Context context, int decodeWidth, int decodeHeight, Drawable placeHolder,
LocalDataAdapter adapter, boolean isInProgress) {
- return fillImageView(ctx, new ImageView(ctx), decodeWidth, decodeHeight,
+ return fillImageView(context, new ImageView(context), decodeWidth, decodeHeight,
placeHolder, adapter, isInProgress);
}
@@ -322,8 +249,13 @@ public abstract class LocalMediaData implements LocalData {
@Override
public abstract int getViewType();
+ @Override
+ public Bundle getMetadata() {
+ return mMetaData;
+ }
+
protected abstract BitmapLoadTask getBitmapLoadTask(
- ImageView v, int decodeWidth, int decodeHeight,
+ Context context, ImageView v, int decodeWidth, int decodeHeight,
ContentResolver resolver, LocalDataAdapter adapter, boolean isInProgressSession);
public static final class PhotoData extends LocalMediaData {
@@ -383,7 +315,7 @@ public abstract class LocalMediaData implements LocalData {
mOrientation = orientation;
}
- static PhotoData buildFromCursor(Cursor c) {
+ static PhotoData buildFromCursor(Context context, Cursor c) {
long id = c.getLong(COL_ID);
String title = c.getString(COL_TITLE);
String mimeType = c.getString(COL_MIME_TYPE);
@@ -425,6 +357,9 @@ public abstract class LocalMediaData implements LocalData {
PhotoData result = new PhotoData(id, title, mimeType, dateTakenInSeconds,
dateModifiedInSeconds, path, orientation, width, height,
sizeInBytes, latitude, longitude);
+ PanoramaMetadataLoader.loadPanoramaMetadata(context, result.getContentUri(),
+ result.getMetadata());
+ RgbzMetadataLoader.loadRgbzMetadata(context, result.getContentUri(), result.getMetadata());
return result;
}
@@ -456,10 +391,10 @@ public abstract class LocalMediaData implements LocalData {
}
@Override
- public boolean delete(Context c) {
- ContentResolver cr = c.getContentResolver();
+ public boolean delete(Context context) {
+ ContentResolver cr = context.getContentResolver();
cr.delete(CONTENT_URI, MediaStore.Images.ImageColumns._ID + "=" + mContentId, null);
- return super.delete(c);
+ return super.delete(context);
}
@Override
@@ -478,39 +413,32 @@ public abstract class LocalMediaData implements LocalData {
@Override
public int getLocalDataType() {
- if (mPanoramaMetadata != null) {
- if (mPanoramaMetadata.mIsPanorama360) {
- return LOCAL_360_PHOTO_SPHERE;
- } else if (mPanoramaMetadata.mUsePanoramaViewer) {
- return LOCAL_PHOTO_SPHERE;
- }
- }
return LOCAL_IMAGE;
}
@Override
- public LocalData refresh(ContentResolver resolver) {
- Cursor c = resolver.query(
- getContentUri(), QUERY_PROJECTION, null, null, null);
+ public LocalData refresh(Context context) {
+ Cursor c = context.getContentResolver().query(getContentUri(), QUERY_PROJECTION, null,
+ null, null);
if (c == null || !c.moveToFirst()) {
return null;
}
- PhotoData newData = buildFromCursor(c);
+ PhotoData newData = buildFromCursor(context, c);
return newData;
}
@Override
- protected BitmapLoadTask getBitmapLoadTask(
- ImageView v, int decodeWidth, int decodeHeight,
- ContentResolver resolver, LocalDataAdapter adapter, boolean isInProgressSession) {
- return new PhotoBitmapLoadTask(v, decodeWidth, decodeHeight,
- resolver, adapter, isInProgressSession);
+ protected BitmapLoadTask getBitmapLoadTask(Context context, ImageView v, int decodeWidth,
+ int decodeHeight, ContentResolver resolver, LocalDataAdapter adapter,
+ boolean isInProgressSession) {
+ return new PhotoBitmapLoadTask(context, v, decodeWidth, decodeHeight, resolver, adapter,
+ isInProgressSession);
}
private final class PhotoBitmapLoadTask extends BitmapLoadTask {
private final int mDecodeWidth;
private final int mDecodeHeight;
- private final ContentResolver mResolver;
+ private final Context mContext;
private final LocalDataAdapter mAdapter;
// TODO: Re-think how we can avoid having the in-progress indication
@@ -519,13 +447,13 @@ public abstract class LocalMediaData implements LocalData {
private boolean mNeedsRefresh;
- public PhotoBitmapLoadTask(ImageView v, int decodeWidth,
- int decodeHeight, ContentResolver resolver,
- LocalDataAdapter adapter, boolean isInProgressSession) {
- super(v);
+ public PhotoBitmapLoadTask(Context context, ImageView v, int decodeWidth,
+ int decodeHeight, ContentResolver resolver, LocalDataAdapter adapter,
+ boolean isInProgressSession) {
+ super(context, v);
mDecodeWidth = decodeWidth;
mDecodeHeight = decodeHeight;
- mResolver = resolver;
+ mContext = context;
mAdapter = adapter;
mIsInProgressSession = isInProgressSession;
}
@@ -562,7 +490,7 @@ public abstract class LocalMediaData implements LocalData {
ContentValues values = new ContentValues();
values.put(Images.Media.WIDTH, decodedWidth);
values.put(Images.Media.HEIGHT, decodedHeight);
- mResolver.update(getContentUri(), values, null, null);
+ mContext.getContentResolver().update(getContentUri(), values, null, null);
mNeedsRefresh = true;
Log.w(TAG, "Uri " + getContentUri() + " has been updated with" +
" correct size!");
@@ -585,6 +513,7 @@ public abstract class LocalMediaData implements LocalData {
m.setRotate(mOrientation);
b = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), m, false);
}
+
return b;
}
@@ -592,7 +521,7 @@ public abstract class LocalMediaData implements LocalData {
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
if (mNeedsRefresh && mAdapter != null) {
- mAdapter.refresh(mResolver, getContentUri(), mIsInProgressSession);
+ mAdapter.refresh(mContext, getContentUri(), mIsInProgressSession);
}
}
}
@@ -740,10 +669,10 @@ public abstract class LocalMediaData implements LocalData {
}
@Override
- public boolean delete(Context ctx) {
- ContentResolver cr = ctx.getContentResolver();
+ public boolean delete(Context context) {
+ ContentResolver cr = context.getContentResolver();
cr.delete(CONTENT_URI, MediaStore.Video.VideoColumns._ID + "=" + mContentId, null);
- return super.delete(ctx);
+ return super.delete(context);
}
@Override
@@ -766,9 +695,9 @@ public abstract class LocalMediaData implements LocalData {
}
@Override
- public LocalData refresh(ContentResolver resolver) {
- Cursor c = resolver.query(
- getContentUri(), QUERY_PROJECTION, null, null, null);
+ public LocalData refresh(Context context) {
+ Cursor c = context.getContentResolver().query(getContentUri(), QUERY_PROJECTION, null,
+ null, null);
if (c == null || !c.moveToFirst()) {
return null;
}
@@ -777,20 +706,20 @@ public abstract class LocalMediaData implements LocalData {
}
@Override
- public View getView(final Context ctx,
+ public View getView(final Context context,
int decodeWidth, int decodeHeight, Drawable placeHolder,
LocalDataAdapter adapter, boolean isInProgress) {
// ImageView for the bitmap.
- ImageView iv = new ImageView(ctx);
+ ImageView iv = new ImageView(context);
iv.setLayoutParams(new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT, Gravity.CENTER));
- fillImageView(ctx, iv, decodeWidth, decodeHeight, placeHolder,
+ fillImageView(context, iv, decodeWidth, decodeHeight, placeHolder,
adapter, isInProgress);
// ImageView for the play icon.
- ImageView icon = new ImageView(ctx);
+ ImageView icon = new ImageView(context);
icon.setImageResource(R.drawable.ic_control_play);
icon.setScaleType(ImageView.ScaleType.CENTER);
icon.setLayoutParams(new FrameLayout.LayoutParams(
@@ -801,11 +730,11 @@ public abstract class LocalMediaData implements LocalData {
public void onClick(View v) {
// TODO: refactor this into activities to avoid this class
// conversion.
- CameraUtil.playVideo((Activity) ctx, getContentUri(), mTitle);
+ CameraUtil.playVideo((Activity) context, getContentUri(), mTitle);
}
});
- FrameLayout f = new FrameLayout(ctx);
+ FrameLayout f = new FrameLayout(context);
f.addView(iv);
f.addView(icon);
return f;
@@ -813,16 +742,16 @@ public abstract class LocalMediaData implements LocalData {
@Override
protected BitmapLoadTask getBitmapLoadTask(
- ImageView v, int decodeWidth, int decodeHeight,
+ Context context, ImageView v, int decodeWidth, int decodeHeight,
ContentResolver resolver, LocalDataAdapter adapter, boolean isInProgressSession) {
// TODO: Support isInProgressSession for videos when we need it.
- return new VideoBitmapLoadTask(v);
+ return new VideoBitmapLoadTask(context, v);
}
private final class VideoBitmapLoadTask extends BitmapLoadTask {
- public VideoBitmapLoadTask(ImageView v) {
- super(v);
+ public VideoBitmapLoadTask(Context context, ImageView v) {
+ super(context, v);
}
@Override
@@ -867,9 +796,11 @@ public abstract class LocalMediaData implements LocalData {
* {@code BitmapLoadTask#doInBackground(Void...)}."
*/
protected abstract class BitmapLoadTask extends AsyncTask<Void, Void, Bitmap> {
+ protected final Context mContext;
protected ImageView mView;
- protected BitmapLoadTask(ImageView v) {
+ protected BitmapLoadTask(Context context, ImageView v) {
+ mContext = context;
mView = v;
}
diff --git a/src/com/android/camera/data/PanoramaMetadataLoader.java b/src/com/android/camera/data/PanoramaMetadataLoader.java
index fda684861..aeaaa0643 100644
--- a/src/com/android/camera/data/PanoramaMetadataLoader.java
+++ b/src/com/android/camera/data/PanoramaMetadataLoader.java
@@ -16,91 +16,54 @@
package com.android.camera.data;
-import java.util.ArrayList;
-
import android.content.Context;
import android.net.Uri;
+import android.os.Bundle;
import com.android.camera.util.PhotoSphereHelper;
-import com.android.camera.util.PhotoSphereHelper.PanoramaMetadata;
/**
* This class breaks out the off-thread panorama support.
*/
public class PanoramaMetadataLoader {
/**
- * Classes implementing this interface can get information about loaded
- * photo sphere metadata.
+ * The key for the metadata in {@link com.android.camera.data.LocalData} to
+ * indicate whether the data is a 360-degrees panorama.
*/
- public static interface PanoramaMetadataCallback {
- /**
- * Called with the loaded metadata or <code>null</code>.
- */
- public void onPanoramaMetadataLoaded(PanoramaMetadata metadata);
- }
-
- private PanoramaMetadata mPanoramaMetadata;
- private ArrayList<PanoramaMetadataCallback> mCallbacksWaiting;
- private Uri mMediaUri;
+ private static final String KEY_PANORAMA_360 = "metadata_key_panorama_360";
+ /**
+ * The key for the metadata in {@link com.android.camera.data.LocalData} to
+ * indicate whether the data is a panorama.
+ */
+ private static final String KEY_USE_PANORAMA_VIEWER = "metadata_key_panorama_viewer";
/**
- * Instantiated the meta data loader for the image resource with the given
- * URI.
+ * @return whether the {@code data} is a panorama.
*/
- public PanoramaMetadataLoader(Uri uri) {
- mMediaUri = uri;
+ public static boolean isPanorama(final LocalData data) {
+ return data.getMetadata().getBoolean(KEY_USE_PANORAMA_VIEWER);
}
/**
- * Asynchronously extract and return panorama metadata from the item with
- * the given URI.
- * <p>
- * NOTE: This call is backed by a cache to speed up successive calls, which
- * will return immediately. Use {@link #clearCachedValues()} is called.
+ * @return whether the {@code data} is a 360-degrees panorama.
*/
- public synchronized void getPanoramaMetadata(final Context context,
- PanoramaMetadataCallback callback) {
- if (mPanoramaMetadata != null) {
- // Return the cached data right away, no need to fetch it again.
- callback.onPanoramaMetadataLoaded(mPanoramaMetadata);
- } else {
- if (mCallbacksWaiting == null) {
- mCallbacksWaiting = new ArrayList<PanoramaMetadataCallback>();
-
- // TODO: Don't create a new thread each time, use a pool or
- // single instance.
- (new Thread() {
- @Override
- public void run() {
- onLoadingDone(PhotoSphereHelper.getPanoramaMetadata(context,
- mMediaUri));
- }
- }).start();
- }
- mCallbacksWaiting.add(callback);
- }
+ public static boolean isPanorama360(final LocalData data) {
+ return data.getMetadata().getBoolean(KEY_PANORAMA_360);
}
/**
- * Clear cached value and stop all running loading threads.
+ * Extracts panorama metadata from the item with the given URI and fills
+ * the {@code metadata}.
*/
- public synchronized void clearCachedValues() {
- if (mPanoramaMetadata != null) {
- mPanoramaMetadata = null;
- }
-
- // TODO: Cancel running loading thread if active.
- }
-
- private synchronized void onLoadingDone(PanoramaMetadata metadata) {
- mPanoramaMetadata = metadata;
- if (mPanoramaMetadata == null) {
- // Error getting panorama data from file. Treat as not panorama.
- mPanoramaMetadata = PhotoSphereHelper.NOT_PANORAMA;
- }
- for (PanoramaMetadataCallback cb : mCallbacksWaiting) {
- cb.onPanoramaMetadataLoaded(mPanoramaMetadata);
+ public static void loadPanoramaMetadata(final Context context, Uri contentUri,
+ Bundle metadata) {
+ PhotoSphereHelper.PanoramaMetadata panoramaMetadata =
+ PhotoSphereHelper.getPanoramaMetadata(context, contentUri);
+ if (panoramaMetadata == null) {
+ return;
}
- mCallbacksWaiting = null;
+ metadata.putBoolean(KEY_PANORAMA_360, panoramaMetadata.mIsPanorama360);
+ metadata.putBoolean(KEY_USE_PANORAMA_VIEWER,
+ panoramaMetadata.mUsePanoramaViewer);
}
}
diff --git a/src/com/android/camera/data/RgbzMetadataLoader.java b/src/com/android/camera/data/RgbzMetadataLoader.java
index c1a4a44f5..0517adba9 100644
--- a/src/com/android/camera/data/RgbzMetadataLoader.java
+++ b/src/com/android/camera/data/RgbzMetadataLoader.java
@@ -18,88 +18,63 @@ package com.android.camera.data;
import android.content.Context;
import android.net.Uri;
+import android.os.Bundle;
import com.android.camera.exif.ExifInterface;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
-import java.util.ArrayList;
/**
* Asynchronously loads RGBZ data.
*/
public class RgbzMetadataLoader {
- public static interface RgbzMetadataCallback {
- public void onRgbzMetadataLoaded(Boolean isRgbz);
- }
+ private static final String KEY_RGBZ_INFO = "metadata_key_rgbz_info";
+ private static final String EXIF_SOFTWARE_VALUE = "RGBZ";
- private static final String EXIF_SOFTWARE_VALUE = "RGBZ";
- private Boolean mIsRgbz = null;
- private ArrayList<RgbzMetadataCallback> mCallbacksWaiting;
- private final Uri mMediaUri;
-
- public RgbzMetadataLoader(Uri uri) {
- mMediaUri = uri;
- }
-
- /**
- * Check whether this file is an RGBZ file.
- *
- * @param context The app context.
- * @param callback Will be called with the result.
- */
- public synchronized void getRgbzMetadata(final Context context, RgbzMetadataCallback callback) {
- if (mIsRgbz != null) {
- callback.onRgbzMetadataLoaded(mIsRgbz);
- return;
+ /**
+ * @return whether the data has RGBZ metadata.
+ */
+ public static boolean hasRGBZData(final LocalData data) {
+ return data.getMetadata().getBoolean(KEY_RGBZ_INFO);
}
- if (mCallbacksWaiting == null) {
- mCallbacksWaiting = new ArrayList<RgbzMetadataCallback>();
- (new Thread() {
- @Override
- public void run() {
- boolean isRgbz = false;
+ /**
+ * Checks whether this file is an RGBZ file and fill in the metadata.
+ *
+ * @param context The app context.
+ */
+ public static void loadRgbzMetadata(final Context context, Uri contentUri, Bundle metadata) {
+ boolean isRgbz = false;
- try {
+ try {
InputStream input;
- input = context.getContentResolver().openInputStream(mMediaUri);
+ input = context.getContentResolver().openInputStream(contentUri);
isRgbz = isRgbz(input);
- } catch (FileNotFoundException e) {
+ } catch (FileNotFoundException e) {
e.printStackTrace();
- }
- onLoadingDone(isRgbz);
}
- }).start();
-
- }
- mCallbacksWaiting.add(callback);
- }
-
- private synchronized void onLoadingDone(boolean isRgbz) {
- mIsRgbz = isRgbz;
- for (RgbzMetadataCallback cb : mCallbacksWaiting) {
- cb.onRgbzMetadataLoaded(mIsRgbz);
+ if (isRgbz) {
+ metadata.putBoolean(KEY_RGBZ_INFO, true);
+ }
}
- mCallbacksWaiting = null;
- }
- /**
- * @return Whether the file is an RGBZ file.
- */
- public static boolean isRgbz(InputStream input) {
- ExifInterface exif = new ExifInterface();
- try {
- exif.readExif(input);
- // TODO: Rather than this, check for the presence of the XMP.
- String software = exif.getTagStringValue(ExifInterface.TAG_SOFTWARE);
- return software != null && software.startsWith(EXIF_SOFTWARE_VALUE);
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
+ /**
+ * @return Whether the file is an RGBZ file.
+ */
+ private static boolean isRgbz(InputStream input) {
+ ExifInterface exif = new ExifInterface();
+ try {
+ exif.readExif(input);
+ // TODO: Rather than this, check for the presence of the XMP.
+ String software = exif.getTagStringValue(ExifInterface.TAG_SOFTWARE);
+ return software != null && software.startsWith(EXIF_SOFTWARE_VALUE);
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return false;
}
- return false;
- }
}
diff --git a/src/com/android/camera/data/SimpleViewData.java b/src/com/android/camera/data/SimpleViewData.java
index 83ad358ea..8e173ab4b 100644
--- a/src/com/android/camera/data/SimpleViewData.java
+++ b/src/com/android/camera/data/SimpleViewData.java
@@ -20,6 +20,7 @@ import android.content.ContentResolver;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.net.Uri;
+import android.os.Bundle;
import android.util.Log;
import android.view.View;
@@ -37,6 +38,7 @@ public class SimpleViewData implements LocalData {
private final View mView;
private final long mDateTaken;
private final long mDateModified;
+ private final Bundle mMetaData;
public SimpleViewData(
View v, int width, int height,
@@ -46,6 +48,7 @@ public class SimpleViewData implements LocalData {
mHeight = height;
mDateTaken = dateTaken;
mDateModified = dateModified;
+ mMetaData = new Bundle();
}
@Override
@@ -99,7 +102,7 @@ public class SimpleViewData implements LocalData {
}
@Override
- public LocalData refresh(ContentResolver resolver) {
+ public LocalData refresh(Context context) {
return null;
}
@@ -119,7 +122,7 @@ public class SimpleViewData implements LocalData {
}
@Override
- public View getView(Context ctx, int width, int height, Drawable placeHolder,
+ public View getView(Context context, int width, int height, Drawable placeHolder,
LocalDataAdapter adapter, boolean isInProgressSession) {
return mView;
}
@@ -135,17 +138,6 @@ public class SimpleViewData implements LocalData {
}
@Override
- public void requestAuxInfo(Context context, AuxInfoSupportCallback callback) {
- // Not a photo sphere panorama or rgbz image.
- callback.auxInfoAvailable(false, false, false);
- }
-
- @Override
- public void view(PhotoSphereHelper.PanoramaViewHelper helper) {
- // do nothing.
- }
-
- @Override
public void onFullScreen(boolean fullScreen) {
// do nothing.
}
@@ -187,4 +179,9 @@ public class SimpleViewData implements LocalData {
public long getContentId() {
return -1;
}
+
+ @Override
+ public Bundle getMetadata() {
+ return mMetaData;
+ }
}
diff --git a/src/com/android/camera/filmstrip/FilmstripContentPanel.java b/src/com/android/camera/filmstrip/FilmstripContentPanel.java
index 8433d5d00..9a427fdcb 100644
--- a/src/com/android/camera/filmstrip/FilmstripContentPanel.java
+++ b/src/com/android/camera/filmstrip/FilmstripContentPanel.java
@@ -19,7 +19,7 @@ package com.android.camera.filmstrip;
import com.android.camera.widget.FilmstripLayout;
/**
- * The filmstrip panel holding the filmstrip and other widgets.
+ * The filmstrip panel holding the filmstrip and other controls/widgets.
*/
public interface FilmstripContentPanel {
/**
@@ -43,8 +43,10 @@ public interface FilmstripContentPanel {
/** Sets the listener. */
void setFilmstripListener(FilmstripLayout.Listener listener);
+ /** Hides this panel */
void hide();
+ /** Shows this panel */
void show();
/**
diff --git a/src/com/android/camera/filmstrip/FilmstripController.java b/src/com/android/camera/filmstrip/FilmstripController.java
index cd60c0003..571589c05 100644
--- a/src/com/android/camera/filmstrip/FilmstripController.java
+++ b/src/com/android/camera/filmstrip/FilmstripController.java
@@ -175,12 +175,18 @@ public interface FilmstripController {
public void onDataDemoted(int dataID);
/**
- *
* Called when all the data has been reloaded.
*/
public void onDataReloaded();
/**
+ * Called when data is updated.
+ *
+ * @param dataId The ID of the updated data.
+ */
+ public void onDataUpdated(int dataId);
+
+ /**
* The callback when the item enters full-screen state.
*
* @param dataId The ID of the current focused image data.
diff --git a/src/com/android/camera/filmstrip/ImageData.java b/src/com/android/camera/filmstrip/ImageData.java
index 2adbb41e1..52f8ffa01 100644
--- a/src/com/android/camera/filmstrip/ImageData.java
+++ b/src/com/android/camera/filmstrip/ImageData.java
@@ -116,12 +116,6 @@ public interface ImageData {
public void recycle();
/**
- * If the item is a valid photo sphere panorama, this method will launch
- * the viewer.
- */
- public void view(PhotoSphereHelper.PanoramaViewHelper helper);
-
- /**
* @return The content URI of this data, or {@code Uri.EMPTY} if not valid.
*/
public Uri getContentUri();
diff --git a/src/com/android/camera/widget/FilmstripView.java b/src/com/android/camera/widget/FilmstripView.java
index f37c1f046..2f11fe40c 100644
--- a/src/com/android/camera/widget/FilmstripView.java
+++ b/src/com/android/camera/widget/FilmstripView.java
@@ -1407,6 +1407,9 @@ public class FilmstripView extends ViewGroup {
}
adjustChildZOrder();
invalidate();
+ if (mListener != null) {
+ mListener.onDataUpdated(newItem.getId());
+ }
}
/** Some of the data is changed. */