OSDN Git Service

Add secure album support for lock screen camera.
authorWu-cheng Li <wuchengli@google.com>
Wed, 22 Aug 2012 11:15:35 +0000 (19:15 +0800)
committerWu-cheng Li <wuchengli@google.com>
Mon, 27 Aug 2012 09:47:53 +0000 (17:47 +0800)
Secure album only shows the media items added by
the camera.

bug:5955016

Change-Id: Id26abec4dfcc036cf9de682398fed25eed73d1a5

src/com/android/gallery3d/app/AppBridge.java
src/com/android/gallery3d/app/PhotoPage.java
src/com/android/gallery3d/data/ChangeNotifier.java
src/com/android/gallery3d/data/DataManager.java
src/com/android/gallery3d/data/LocalAlbumSet.java
src/com/android/gallery3d/data/SecureAlbum.java [new file with mode: 0644]
src/com/android/gallery3d/data/SecureSource.java [new file with mode: 0644]

index e3deb81..ee55fa6 100644 (file)
@@ -63,6 +63,8 @@ public abstract class AppBridge implements Parcelable {
         public void setSwipingEnabled(boolean enabled);
         // Notify that the ScreenNail is changed.
         public void notifyScreenNailChanged();
+        // Add a new media item to the secure album.
+        public void addSecureAlbumItem(boolean isVideo, int id);
     }
 
     // If server is null, the services are not available.
index 43867bb..2f8573e 100644 (file)
@@ -46,6 +46,8 @@ import com.android.gallery3d.data.MediaObject;
 import com.android.gallery3d.data.MediaSet;
 import com.android.gallery3d.data.MtpSource;
 import com.android.gallery3d.data.Path;
+import com.android.gallery3d.data.SecureAlbum;
+import com.android.gallery3d.data.SecureSource;
 import com.android.gallery3d.data.SnailAlbum;
 import com.android.gallery3d.data.SnailItem;
 import com.android.gallery3d.data.SnailSource;
@@ -112,6 +114,9 @@ public class PhotoPage extends ActivityState implements
     // E.g., viewing a photo in gmail attachment
     private FilterDeleteSet mMediaSet;
 
+    // The mediaset used by camera launched from secure lock screen.
+    private SecureAlbum mSecureAlbum;
+
     private int mCurrentIndex = 0;
     private Handler mHandler;
     private boolean mShowBars = true;
@@ -244,6 +249,12 @@ 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);
+                }
+
                 // Combine the original MediaSet with the one for ScreenNail
                 // from AppBridge.
                 mSetPathString = "/combo/item/{" + screenNailSetPath +
@@ -580,6 +591,11 @@ public class PhotoPage extends ActivityState implements
     }
 
     @Override
+    public void addSecureAlbumItem(boolean isVideo, int id) {
+        mSecureAlbum.addMediaItem(isVideo, id);
+    }
+
+    @Override
     protected boolean onCreateActionBar(Menu menu) {
         mActionBar.createActionBarMenu(R.menu.photo, menu);
         if (mPendingSharePath != null) updateShareURI(mPendingSharePath);
index 35be2dc..558a864 100644 (file)
@@ -33,12 +33,18 @@ public class ChangeNotifier {
         application.getDataManager().registerChangeNotifier(uri, this);
     }
 
+    public ChangeNotifier(MediaSet set, Uri[] uris, GalleryApp application) {
+        mMediaSet = set;
+        for (int i = 0; i < uris.length; i++) {
+            application.getDataManager().registerChangeNotifier(uris[i], this);
+        }
+    }
+
     // Returns the dirty flag and clear it.
     public boolean isDirty() {
         return mContentDirty.compareAndSet(true, false);
     }
 
-    // For debugging only.
     public void fakeChange() {
         onChange(false);
     }
index 386f6c3..0b4dae2 100644 (file)
@@ -127,6 +127,7 @@ public class DataManager {
         addSource(new ComboSource(mApplication));
         addSource(new ClusterSource(mApplication));
         addSource(new FilterSource(mApplication));
+        addSource(new SecureSource(mApplication));
         addSource(new UriSource(mApplication));
         addSource(new SnailSource(mApplication));
 
index 579a71e..5d01c06 100644 (file)
@@ -43,14 +43,13 @@ public class LocalAlbumSet extends MediaSet
 
     private static final String TAG = "LocalAlbumSet";
 
-    private static final Uri mWatchUriImage = Images.Media.EXTERNAL_CONTENT_URI;
-    private static final Uri mWatchUriVideo = Video.Media.EXTERNAL_CONTENT_URI;
+    private static final Uri[] mWatchUris =
+        {Images.Media.EXTERNAL_CONTENT_URI, Video.Media.EXTERNAL_CONTENT_URI};
 
     private final GalleryApp mApplication;
     private final int mType;
     private ArrayList<MediaSet> mAlbums = new ArrayList<MediaSet>();
-    private final ChangeNotifier mNotifierImage;
-    private final ChangeNotifier mNotifierVideo;
+    private final ChangeNotifier mNotifier;
     private final String mName;
     private final Handler mHandler;
     private boolean mIsLoading;
@@ -63,8 +62,7 @@ public class LocalAlbumSet extends MediaSet
         mApplication = application;
         mHandler = new Handler(application.getMainLooper());
         mType = getTypeFromPath(path);
-        mNotifierImage = new ChangeNotifier(this, mWatchUriImage, application);
-        mNotifierVideo = new ChangeNotifier(this, mWatchUriVideo, application);
+        mNotifier = new ChangeNotifier(this, mWatchUris, application);
         mName = application.getResources().getString(
                 R.string.set_label_local_albums);
     }
@@ -165,8 +163,7 @@ public class LocalAlbumSet extends MediaSet
     //   1. Prevent calling reload() concurrently.
     //   2. Prevent calling onFutureDone() and reload() concurrently
     public synchronized long reload() {
-        // "|" is used instead of "||" because we want to clear both flags.
-        if (mNotifierImage.isDirty() | mNotifierVideo.isDirty()) {
+        if (mNotifier.isDirty()) {
             if (mLoadTask != null) mLoadTask.cancel();
             mIsLoading = true;
             mLoadTask = mApplication.getThreadPool().submit(new AlbumsLoader(), this);
@@ -198,8 +195,7 @@ public class LocalAlbumSet extends MediaSet
 
     // For debug only. Fake there is a ContentObserver.onChange() event.
     void fakeChange() {
-        mNotifierImage.fakeChange();
-        mNotifierVideo.fakeChange();
+        mNotifier.fakeChange();
     }
 
     // Circular shift the array range from a[i] to a[j] (inclusive). That is,
diff --git a/src/com/android/gallery3d/data/SecureAlbum.java b/src/com/android/gallery3d/data/SecureAlbum.java
new file mode 100644 (file)
index 0000000..a8de5dd
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2012 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.gallery3d.data;
+
+import android.net.Uri;
+import android.provider.MediaStore.Images;
+import android.provider.MediaStore.Video;
+
+import com.android.gallery3d.app.GalleryApp;
+
+import java.util.ArrayList;
+
+// This class lists all media items added by the client.
+public class SecureAlbum extends MediaSet {
+    @SuppressWarnings("unused")
+    private static final String TAG = "SecureAlbum";
+    private ArrayList<Path> mItems = new ArrayList<Path>();
+    private DataManager mDataManager;
+    private static final Uri[] mWatchUris =
+        {Images.Media.EXTERNAL_CONTENT_URI, Video.Media.EXTERNAL_CONTENT_URI};
+    private final ChangeNotifier mNotifier;
+
+    public SecureAlbum(Path path, GalleryApp application) {
+        super(path, nextVersionNumber());
+        mDataManager = application.getDataManager();
+        mNotifier = new ChangeNotifier(this, mWatchUris, application);
+    }
+
+    public void addMediaItem(boolean isVideo, int id) {
+        if (isVideo) {
+            mItems.add(0, Path.fromString("/local/video/item/" + id));
+        } else {
+            mItems.add(0, Path.fromString("/local/image/item/" + id));
+        }
+        mNotifier.fakeChange();
+    }
+
+    @Override
+    public ArrayList<MediaItem> getMediaItem(int start, int count) {
+        if (start >= mItems.size()) {
+            return new ArrayList<MediaItem>();
+        }
+        int end = Math.min(start + count, mItems.size());
+        ArrayList<Path> subset = new ArrayList<Path>(mItems.subList(start, end));
+        final MediaItem[] buf = new MediaItem[end - start];
+        ItemConsumer consumer = new ItemConsumer() {
+            @Override
+            public void consume(int index, MediaItem item) {
+                buf[index] = item;
+            }
+        };
+        mDataManager.mapMediaItems(subset, consumer, 0);
+        ArrayList<MediaItem> result = new ArrayList<MediaItem>(end - start);
+        for (int i = 0; i < buf.length; i++) {
+            result.add(buf[i]);
+        }
+        return result;
+    }
+
+    @Override
+    public int getMediaItemCount() {
+        return mItems.size();
+    }
+
+    @Override
+    public String getName() {
+        return "secure";
+    }
+
+    @Override
+    public long reload() {
+        if (mNotifier.isDirty()) {
+            mDataVersion = nextVersionNumber();
+        }
+        return mDataVersion;
+    }
+
+    @Override
+    public boolean isLeafAlbum() {
+        return true;
+    }
+}
diff --git a/src/com/android/gallery3d/data/SecureSource.java b/src/com/android/gallery3d/data/SecureSource.java
new file mode 100644 (file)
index 0000000..9e89438
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2012 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.gallery3d.data;
+
+import com.android.gallery3d.app.GalleryApp;
+
+public class SecureSource extends MediaSource {
+    private GalleryApp mApplication;
+    private static PathMatcher mMatcher = new PathMatcher();
+    private static final int SECURE_ALBUM = 0;
+
+    static {
+        mMatcher.add("/secure/all/*", SECURE_ALBUM);
+    }
+
+    public SecureSource(GalleryApp context) {
+        super("secure");
+        mApplication = context;
+    }
+
+    public static boolean isSecurePath(String path) {
+        return (SECURE_ALBUM == mMatcher.match(Path.fromString(path)));
+    }
+
+    @Override
+    public MediaObject createMediaObject(Path path) {
+        switch (mMatcher.match(path)) {
+            case SECURE_ALBUM:
+                return new SecureAlbum(path, mApplication);
+            default:
+                throw new RuntimeException("bad path: " + path);
+        }
+    }
+}