OSDN Git Service

Handle stitching progress in secure album.
authorWu-cheng Li <wuchengli@google.com>
Tue, 9 Oct 2012 06:44:31 +0000 (14:44 +0800)
committerAndroid (Google) Code Review <android-gerrit@google.com>
Tue, 9 Oct 2012 14:53:12 +0000 (07:53 -0700)
- In secure album, show stitching progress only if it is
  captured after the device is locked.
- Make sure image capture intent does not show stitching
  progress.

bug:7285105

Change-Id: I0b3ba60fe3c03f488bea25e2f09843dd84ab6dfb

src/com/android/gallery3d/app/PhotoPage.java
src/com/android/gallery3d/app/StitchingChangeListener.java
src/com/android/gallery3d/data/SecureAlbum.java

index 4537eaf..7f8414c 100644 (file)
@@ -347,27 +347,29 @@ public class PhotoPage extends ActivityState implements
                         .getMediaObject(screenNailItemPath);
                 mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail());
 
-                // Check if the path is a secure album.
-                if (SecureSource.isSecurePath(mSetPathString)) {
-                    mSecureAlbum = (SecureAlbum) mActivity.getDataManager()
-                            .getMediaSet(mSetPathString);
-                    mShowSpinner = false;
-                }
                 if (data.getBoolean(KEY_SHOW_WHEN_LOCKED, false)) {
                     // Set the flag to be on top of the lock screen.
                     mFlags |= FLAG_SHOW_WHEN_LOCKED;
                 }
 
-                // Don't display "empty album" action item for capture intents
-                if(!mSetPathString.equals("/local/all/0")) {
+                // Don't display "empty album" action item or panorama
+                // progress for capture intents.
+                if (!mSetPathString.equals("/local/all/0")) {
+                    // Check if the path is a secure album.
+                    if (SecureSource.isSecurePath(mSetPathString)) {
+                        mSecureAlbum = (SecureAlbum) mActivity.getDataManager()
+                                .getMediaSet(mSetPathString);
+                        mShowSpinner = false;
+                    } else {
+                        // Use lightcycle album to handle panorama progress if
+                        // the path is not a secure album.
+                        if (LightCycleHelper.hasLightCycleCapture(mActivity.getAndroidContext())) {
+                            mSetPathString = LightCycleHelper.wrapGalleryPath(mSetPathString);
+                        }
+                    }
                     mSetPathString = "/filter/empty/{"+mSetPathString+"}";
                 }
 
-                // Add support for showing panorama progress.
-                if (LightCycleHelper.hasLightCycleCapture(mActivity.getAndroidContext())) {
-                    mSetPathString = LightCycleHelper.wrapGalleryPath(mSetPathString);
-                }
-
                 // Combine the original MediaSet with the one for ScreenNail
                 // from AppBridge.
                 mSetPathString = "/combo/item/{" + screenNailSetPath +
index 980f145..40f59a5 100644 (file)
 
 package com.android.gallery3d.app;
 
+import com.android.gallery3d.data.Path;
+
 import android.net.Uri;
 
 public interface StitchingChangeListener {
-    public void onStitchingQueued(String filePath);
+    public void onStitchingQueued(Path path);
 
-    public void onStitchingResult(String filePath, Uri uri);
+    public void onStitchingResult(Path path, Uri uri);
 
-    public void onStitchingProgress(String filePath, int progress);
+    public void onStitchingProgress(Path path, int progress);
 }
index 382de5b..4e33cda 100644 (file)
@@ -25,6 +25,7 @@ import android.provider.MediaStore.Video;
 
 import com.android.gallery3d.app.GalleryApp;
 import com.android.gallery3d.app.StitchingChangeListener;
+import com.android.gallery3d.app.StitchingProgressManager;
 import com.android.gallery3d.util.MediaSetUtils;
 
 import java.util.ArrayList;
@@ -43,9 +44,10 @@ public class SecureAlbum extends MediaSet implements StitchingChangeListener {
     // The types of items in mAllItems. True is video and false is image.
     private ArrayList<Boolean> mAllItemTypes = new ArrayList<Boolean>();
     private ArrayList<Path> mExistingItems = new ArrayList<Path>();
-    private ArrayList<String> mStitchingFilePaths = new ArrayList<String>();
+    private ArrayList<Path> mStitchingItems = new ArrayList<Path>();
     private Context mContext;
     private DataManager mDataManager;
+    private StitchingProgressManager mStitchingProgressManager;
     private static final Uri[] mWatchUris =
         {Images.Media.EXTERNAL_CONTENT_URI, Video.Media.EXTERNAL_CONTENT_URI};
     private final ChangeNotifier mNotifier;
@@ -62,7 +64,8 @@ public class SecureAlbum extends MediaSet implements StitchingChangeListener {
         mUnlockItem = unlock;
         mShowUnlockItem = (!isCameraBucketEmpty(Images.Media.EXTERNAL_CONTENT_URI)
                 || !isCameraBucketEmpty(Video.Media.EXTERNAL_CONTENT_URI));
-        application.getStitchingProgressManager().addChangeListener(this);
+        mStitchingProgressManager = application.getStitchingProgressManager();
+        mStitchingProgressManager.addChangeListener(this);
     }
 
     public void addMediaItem(boolean isVideo, int id) {
@@ -79,14 +82,31 @@ public class SecureAlbum extends MediaSet implements StitchingChangeListener {
         mNotifier.fakeChange();
     }
 
+    // The sequence is stitching items, local media items, and unlock image.
     @Override
     public ArrayList<MediaItem> getMediaItem(int start, int count) {
-        if (start >= mExistingItems.size() + 1) {
+        int stitchingCount = mStitchingItems.size();
+        int existingCount = mExistingItems.size();
+        if (start >= stitchingCount + existingCount + 1) {
             return new ArrayList<MediaItem>();
         }
-        int end = Math.min(start + count, mExistingItems.size());
-        ArrayList<Path> subset = new ArrayList<Path>(
-                mExistingItems.subList(start, end));
+
+        // Add paths of requested stitching items.
+        int end = Math.min(start + count, stitchingCount + existingCount);
+        ArrayList<Path> subset = new ArrayList<Path>();
+        if (start < stitchingCount) {
+            subset.addAll(mStitchingItems.subList(
+                    start, Math.min(stitchingCount, end)));
+        }
+
+        // Add paths of requested local media items.
+        if (end >= stitchingCount) {
+            int existingStart = Math.max(0, start - stitchingCount);
+            int existingEnd = end - stitchingCount;
+            subset.addAll(mExistingItems.subList(existingStart, existingEnd));
+        }
+
+        // Convert paths to media items.
         final MediaItem[] buf = new MediaItem[end - start];
         ItemConsumer consumer = new ItemConsumer() {
             @Override
@@ -105,7 +125,8 @@ public class SecureAlbum extends MediaSet implements StitchingChangeListener {
 
     @Override
     public int getMediaItemCount() {
-        return mExistingItems.size() + (mShowUnlockItem ? 1 : 0);
+        return (mStitchingItems.size() + mExistingItems.size()
+                + (mShowUnlockItem ? 1 : 0));
     }
 
     @Override
@@ -183,19 +204,24 @@ public class SecureAlbum extends MediaSet implements StitchingChangeListener {
     }
 
     @Override
-    public void onStitchingQueued(String filePath) {
-        mStitchingFilePaths.add(filePath);
+    public void onStitchingQueued(Path path) {
+        mStitchingItems.add(path);
+        notifyContentChanged();
     }
 
     @Override
-    public void onStitchingResult(String filePath, Uri uri) {
-        if (mStitchingFilePaths.remove(filePath)) {
+    public void onStitchingResult(Path path, Uri uri) {
+        if (mStitchingItems.remove(path)) {
             int id = Integer.parseInt(uri.getLastPathSegment());
             addMediaItem(false, id);
+            notifyContentChanged();
         }
     }
 
     @Override
-    public void onStitchingProgress(String filePath, int progress) {
+    public void onStitchingProgress(Path path, int progress) {
+        if (mStitchingItems.contains(path)) {
+            notifyContentChanged();
+        }
     }
 }