Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2c83c5f0 authored by Wu-cheng Li's avatar Wu-cheng Li Committed by Android (Google) Code Review
Browse files

Handle stitching progress in secure album.

- 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
parent 71ce96fc
Loading
Loading
Loading
Loading
+15 −13
Original line number Diff line number Diff line
@@ -347,26 +347,28 @@ 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
                // Don't display "empty album" action item or panorama
                // progress for capture intents.
                if (!mSetPathString.equals("/local/all/0")) {
                    mSetPathString = "/filter/empty/{"+mSetPathString+"}";
                }

                // Add support for showing panorama progress.
                    // 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+"}";
                }

                // Combine the original MediaSet with the one for ScreenNail
                // from AppBridge.
+5 −3
Original line number Diff line number Diff line
@@ -16,12 +16,14 @@

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);
}
+38 −12
Original line number Diff line number Diff line
@@ -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();
        }
    }
}