summaryrefslogtreecommitdiff
path: root/src/com/android/dreams/phototable/LocalSource.java
diff options
context:
space:
mode:
authorChris Wren <cwren@android.com>2013-08-14 11:13:17 -0400
committerChris Wren <cwren@android.com>2013-08-15 00:19:52 -0400
commit729f5231bf95ec7946fc4c510d44db303b07614d (patch)
tree7116e50d67ef015c451f70cfa07ecafb32a05427 /src/com/android/dreams/phototable/LocalSource.java
parentc37df74e6a50b5458c360839a75104e4e603a3ca (diff)
downloadPhotoTable-729f5231bf95ec7946fc4c510d44db303b07614d.tar.gz
add a broadcast receiver that modifies the settings.
Useful for loosly embedding the photo dreams code into other packages. Add support for albums on internal storage. Bug: 8370249 Change-Id: Ibca37c100d7f1f6b87580422591de4d19d726506
Diffstat (limited to 'src/com/android/dreams/phototable/LocalSource.java')
-rw-r--r--src/com/android/dreams/phototable/LocalSource.java51
1 files changed, 35 insertions, 16 deletions
diff --git a/src/com/android/dreams/phototable/LocalSource.java b/src/com/android/dreams/phototable/LocalSource.java
index cf2e0ec..a483d60 100644
--- a/src/com/android/dreams/phototable/LocalSource.java
+++ b/src/com/android/dreams/phototable/LocalSource.java
@@ -18,6 +18,7 @@ package com.android.dreams.phototable;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
+import android.net.Uri;
import android.provider.MediaStore;
import java.io.FileInputStream;
@@ -58,12 +59,21 @@ public class LocalSource extends CursorPhotoSource {
public Collection<AlbumData> findAlbums() {
log(TAG, "finding albums");
HashMap<String, AlbumData> foundAlbums = new HashMap<String, AlbumData>();
+ findAlbums(false, foundAlbums);
+ findAlbums(true, foundAlbums);
+ log(TAG, "found " + foundAlbums.size() + " items.");
+ mFoundAlbumIds = foundAlbums.keySet();
+ return foundAlbums.values();
+ }
+
+ public void findAlbums(boolean internal, HashMap<String, AlbumData> foundAlbums) {
+ Uri uri = internal ? MediaStore.Images.Media.INTERNAL_CONTENT_URI
+ : MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.BUCKET_ID,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME, MediaStore.Images.Media.DATE_TAKEN};
// This is a horrible hack that closes the where clause and injects a grouping clause.
- Cursor cursor = mResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
- projection, null, null, null);
+ Cursor cursor = mResolver.query(uri, projection, null, null, null);
if (cursor != null) {
cursor.moveToPosition(-1);
@@ -76,7 +86,7 @@ public class LocalSource extends CursorPhotoSource {
log(TAG, "can't find the ID column!");
} else {
while (cursor.moveToNext()) {
- String id = TAG + ":" + cursor.getString(bucketIndex);
+ String id = constructId(internal, cursor.getString(bucketIndex));
AlbumData data = foundAlbums.get(id);
if (foundAlbums.get(id) == null) {
data = new AlbumData();
@@ -105,11 +115,11 @@ public class LocalSource extends CursorPhotoSource {
}
}
cursor.close();
-
}
- log(TAG, "found " + foundAlbums.size() + " items.");
- mFoundAlbumIds = foundAlbums.keySet();
- return foundAlbums.values();
+ }
+
+ public static String constructId(boolean internal, String bucketId) {
+ return TAG + ":" + bucketId + (internal ? ":i" : "");
}
@Override
@@ -120,8 +130,7 @@ public class LocalSource extends CursorPhotoSource {
MediaStore.Images.Media.BUCKET_ID, MediaStore.Images.Media.BUCKET_DISPLAY_NAME};
String selection = MediaStore.Images.Media.BUCKET_ID + " = '" + data.albumId + "'";
- data.cursor = mResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
- projection, selection, null, null);
+ data.cursor = mResolver.query(data.uri, projection, selection, null, null);
}
@Override
@@ -169,12 +178,21 @@ public class LocalSource extends CursorPhotoSource {
protected Collection<ImageData> findImages(int howMany) {
log(TAG, "finding images");
LinkedList<ImageData> foundImages = new LinkedList<ImageData>();
+ boolean internalFirst = mRNG.nextInt(2) == 0; // filp a coin to be fair
+ findImages(internalFirst, howMany, foundImages);
+ findImages(!internalFirst, howMany - foundImages.size(), foundImages);
+ log(TAG, "found " + foundImages.size() + " items.");
+ return foundImages;
+ }
+ protected void findImages(boolean internal, int howMany, LinkedList<ImageData> foundImages ) {
+ Uri uri = internal ? MediaStore.Images.Media.INTERNAL_CONTENT_URI
+ : MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.ORIENTATION,
MediaStore.Images.Media.BUCKET_ID, MediaStore.Images.Media.BUCKET_DISPLAY_NAME};
String selection = "";
for (String id : getFoundAlbums()) {
- if (mSettings.isAlbumEnabled(id)) {
+ if (isInternalId(id) == internal && mSettings.isAlbumEnabled(id)) {
String[] parts = id.split(":");
if (parts.length > 1) {
if (selection.length() > 0) {
@@ -185,11 +203,9 @@ public class LocalSource extends CursorPhotoSource {
}
}
if (selection.isEmpty()) {
- return foundImages;
+ return;
}
-
- Cursor cursor = mResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
- projection, selection, null, null);
+ Cursor cursor = mResolver.query(uri, projection, selection, null, null);
if (cursor != null) {
int dataIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
@@ -203,6 +219,7 @@ public class LocalSource extends CursorPhotoSource {
} else {
while (foundImages.size() < howMany && cursor.moveToNext()) {
ImageData data = unpackImageData(cursor, null);
+ data.uri = uri;
foundImages.offer(data);
mLastPosition = cursor.getPosition();
}
@@ -216,8 +233,10 @@ public class LocalSource extends CursorPhotoSource {
cursor.close();
}
- log(TAG, "found " + foundImages.size() + " items.");
- return foundImages;
+ }
+
+ private boolean isInternalId(String id) {
+ return id.endsWith("i");
}
@Override