summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorWu-cheng Li <wuchengli@google.com>2012-08-27 02:50:53 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-08-27 02:50:54 -0700
commit220fb8a924a458f15c2223ff10881d5ec31e818e (patch)
tree071c9fe69185af03c69bff48ef203ea44b18987e /src
parent8a35777369b212bf0dd087d20574e9894547a048 (diff)
parentec3c73a3c4b7f7b841f707a1b965222c0e86195e (diff)
downloadandroid_packages_apps_Snap-220fb8a924a458f15c2223ff10881d5ec31e818e.tar.gz
android_packages_apps_Snap-220fb8a924a458f15c2223ff10881d5ec31e818e.tar.bz2
android_packages_apps_Snap-220fb8a924a458f15c2223ff10881d5ec31e818e.zip
Merge "Add secure album support for lock screen camera." into gb-ub-photos-arches
Diffstat (limited to 'src')
-rw-r--r--src/com/android/gallery3d/app/AppBridge.java2
-rw-r--r--src/com/android/gallery3d/app/PhotoPage.java16
-rw-r--r--src/com/android/gallery3d/data/ChangeNotifier.java8
-rw-r--r--src/com/android/gallery3d/data/DataManager.java1
-rw-r--r--src/com/android/gallery3d/data/LocalAlbumSet.java16
-rw-r--r--src/com/android/gallery3d/data/SecureAlbum.java96
-rw-r--r--src/com/android/gallery3d/data/SecureSource.java48
7 files changed, 176 insertions, 11 deletions
diff --git a/src/com/android/gallery3d/app/AppBridge.java b/src/com/android/gallery3d/app/AppBridge.java
index e3deb810d..ee55fa6db 100644
--- a/src/com/android/gallery3d/app/AppBridge.java
+++ b/src/com/android/gallery3d/app/AppBridge.java
@@ -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.
diff --git a/src/com/android/gallery3d/app/PhotoPage.java b/src/com/android/gallery3d/app/PhotoPage.java
index 43867bbfe..2f8573e60 100644
--- a/src/com/android/gallery3d/app/PhotoPage.java
+++ b/src/com/android/gallery3d/app/PhotoPage.java
@@ -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);
diff --git a/src/com/android/gallery3d/data/ChangeNotifier.java b/src/com/android/gallery3d/data/ChangeNotifier.java
index 35be2dc5b..558a8648e 100644
--- a/src/com/android/gallery3d/data/ChangeNotifier.java
+++ b/src/com/android/gallery3d/data/ChangeNotifier.java
@@ -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);
}
diff --git a/src/com/android/gallery3d/data/DataManager.java b/src/com/android/gallery3d/data/DataManager.java
index 386f6c3fc..0b4dae2c2 100644
--- a/src/com/android/gallery3d/data/DataManager.java
+++ b/src/com/android/gallery3d/data/DataManager.java
@@ -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));
diff --git a/src/com/android/gallery3d/data/LocalAlbumSet.java b/src/com/android/gallery3d/data/LocalAlbumSet.java
index 579a71e9b..5d01c064a 100644
--- a/src/com/android/gallery3d/data/LocalAlbumSet.java
+++ b/src/com/android/gallery3d/data/LocalAlbumSet.java
@@ -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
index 000000000..a8de5ddcf
--- /dev/null
+++ b/src/com/android/gallery3d/data/SecureAlbum.java
@@ -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
index 000000000..9e89438e6
--- /dev/null
+++ b/src/com/android/gallery3d/data/SecureSource.java
@@ -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);
+ }
+ }
+}