From 2de8201a49da30ed80e593c39243863b50844fcb Mon Sep 17 00:00:00 2001 From: Angus Kong Date: Fri, 31 May 2013 16:30:32 -0700 Subject: [PATCH] Add newly taken photos/videos to film strip. Change-Id: I82d9e83d0a45f14036a194cf1ad5793b436357cd --- src/com/android/camera/NewCameraActivity.java | 18 ++++++++++ src/com/android/camera/NewPhotoModule.java | 2 +- src/com/android/camera/NewVideoModule.java | 5 ++- src/com/android/camera/data/CameraDataAdapter.java | 40 ++++++++++++++++++++++ 4 files changed, 61 insertions(+), 4 deletions(-) diff --git a/src/com/android/camera/NewCameraActivity.java b/src/com/android/camera/NewCameraActivity.java index 9751e3d24..3aee15053 100644 --- a/src/com/android/camera/NewCameraActivity.java +++ b/src/com/android/camera/NewCameraActivity.java @@ -18,6 +18,7 @@ package com.android.camera; import android.app.Activity; import android.content.ComponentName; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -25,6 +26,7 @@ import android.content.ServiceConnection; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.drawable.ColorDrawable; +import android.net.Uri; import android.os.Bundle; import android.os.IBinder; import android.provider.Settings; @@ -60,6 +62,7 @@ public class NewCameraActivity extends Activity // panorama. If the extra is not set, it is in the normal camera mode. public static final String SECURE_CAMERA_EXTRA = "secure_camera"; + private static final String TAG = "CAM_Activity"; private CameraDataAdapter mDataAdapter; private int mCurrentModuleIndex; private NewCameraModule mCurrentModule; @@ -106,6 +109,21 @@ public class NewCameraActivity extends Activity return mMediaSaveService; } + public void notifyNewMedia(Uri uri) { + ContentResolver cr = getContentResolver(); + String mimeType = cr.getType(uri); + if (mimeType.startsWith("video/")) { + sendBroadcast(new Intent(Util.ACTION_NEW_VIDEO, uri)); + mDataAdapter.addNewVideo(cr, uri); + } else if (mimeType.startsWith("image/")) { + Util.broadcastNewPicture(this, uri); + mDataAdapter.addNewPhoto(cr, uri); + } else { + android.util.Log.w(TAG, "Unknown new media with MIME type:" + + mimeType + ", uri:" + uri); + } + } + private void bindMediaSaveService() { Intent intent = new Intent(this, MediaSaveService.class); startService(intent); // start service before binding it so the diff --git a/src/com/android/camera/NewPhotoModule.java b/src/com/android/camera/NewPhotoModule.java index e5d922a5a..90803a825 100644 --- a/src/com/android/camera/NewPhotoModule.java +++ b/src/com/android/camera/NewPhotoModule.java @@ -256,7 +256,7 @@ public class NewPhotoModule if (uri != null) { // TODO: Commenting out the line below for now. need to get it working // mActivity.addSecureAlbumItemIfNeeded(false, uri); - Util.broadcastNewPicture(mActivity, uri); + mActivity.notifyNewMedia(uri); } } }; diff --git a/src/com/android/camera/NewVideoModule.java b/src/com/android/camera/NewVideoModule.java index 54e3373e6..69c3a87ff 100644 --- a/src/com/android/camera/NewVideoModule.java +++ b/src/com/android/camera/NewVideoModule.java @@ -198,7 +198,7 @@ public class NewVideoModule implements NewCameraModule, @Override public void onMediaSaved(Uri uri) { if (uri != null) { - Util.broadcastNewPicture(mActivity, uri); + mActivity.notifyNewMedia(uri); } } }; @@ -1366,8 +1366,7 @@ public class NewVideoModule implements NewCameraModule, mContentResolver.update(mCurrentVideoUri, mCurrentVideoValues , null, null); - mActivity.sendBroadcast(new Intent(Util.ACTION_NEW_VIDEO, - mCurrentVideoUri)); + mActivity.notifyNewMedia(mCurrentVideoUri); } catch (Exception e) { // We failed to insert into the database. This can happen if // the SD card is unmounted. diff --git a/src/com/android/camera/data/CameraDataAdapter.java b/src/com/android/camera/data/CameraDataAdapter.java index 1e5f1a8f0..6e2ff101b 100644 --- a/src/com/android/camera/data/CameraDataAdapter.java +++ b/src/com/android/camera/data/CameraDataAdapter.java @@ -20,6 +20,7 @@ import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.graphics.drawable.Drawable; +import android.net.Uri; import android.os.AsyncTask; import android.provider.MediaStore; import android.provider.MediaStore.Images; @@ -33,6 +34,7 @@ import com.android.camera.ui.FilmStripView.ImageData; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.List; /** @@ -124,6 +126,44 @@ public class CameraDataAdapter implements FilmStripView.DataAdapter { mListener.onDataRemoved(dataID, d); } + private void insertData(LocalData data) { + if (mImages == null) { + mImages = new ArrayList(); + } + + // Since this function is mostly for adding the newest data, + // a simple linear search should yield the best performance over a + // binary search. + int pos = 0; + Comparator comp = new LocalData.NewestFirstComparator(); + for (; pos < mImages.size() + && comp.compare(data, mImages.get(pos)) > 0; pos++); + mImages.add(pos, data); + if (mListener != null) { + mListener.onDataInserted(pos, data); + } + } + + public void addNewVideo(ContentResolver cr, Uri uri) { + Cursor c = cr.query(uri, + LocalData.Video.QUERY_PROJECTION, + MediaStore.Images.Media.DATA + " like ? ", CAMERA_PATH, + LocalData.Video.QUERY_ORDER); + if (c != null && c.moveToFirst()) { + insertData(LocalData.Video.buildFromCursor(c)); + } + } + + public void addNewPhoto(ContentResolver cr, Uri uri) { + Cursor c = cr.query(uri, + LocalData.Photo.QUERY_PROJECTION, + MediaStore.Images.Media.DATA + " like ? ", CAMERA_PATH, + LocalData.Photo.QUERY_ORDER); + if (c != null && c.moveToFirst()) { + insertData(LocalData.Photo.buildFromCursor(c)); + } + } + private LocalData buildCameraImageData(int width, int height) { LocalData d = new CameraPreviewData(width, height); return d; -- 2.11.0