summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/android/dreams/phototable/LocalSource.java51
-rw-r--r--src/com/android/dreams/phototable/PhotoDreamSettingsReceiver.java68
-rw-r--r--src/com/android/dreams/phototable/PhotoSource.java2
-rw-r--r--src/com/android/dreams/phototable/PicasaSource.java10
4 files changed, 112 insertions, 19 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
diff --git a/src/com/android/dreams/phototable/PhotoDreamSettingsReceiver.java b/src/com/android/dreams/phototable/PhotoDreamSettingsReceiver.java
new file mode 100644
index 0000000..d1a6199
--- /dev/null
+++ b/src/com/android/dreams/phototable/PhotoDreamSettingsReceiver.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2013 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.dreams.phototable;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PhotoDreamSettingsReceiver extends BroadcastReceiver {
+ private static final String TAG = "PhotoDreamSettingsReceiver";
+ private static final String LOCAL_AUTHORITY = "media";
+ private static final String INTERNAL = "internal";
+
+ public static final String ACTION_ADD_ALBUM = "add";
+ public static final String ACTION_REMOVE_ALBUM = "remove";
+ public static final String EXTRA_ALBUMS = "albums";
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ AlbumSettings settings[] = {
+ AlbumSettings.getAlbumSettings(
+ context.getSharedPreferences(FlipperDreamSettings.PREFS_NAME, 0)),
+ AlbumSettings.getAlbumSettings(
+ context.getSharedPreferences(PhotoTableDreamSettings.PREFS_NAME, 0))
+ };
+
+ boolean shown = ACTION_ADD_ALBUM.equals(intent.getAction());
+ ArrayList<String> albumUris = intent.getStringArrayListExtra(EXTRA_ALBUMS);
+ for (String albumUriString: albumUris) {
+ Uri albumUri = Uri.parse(albumUriString);
+ String type = albumUri.getEncodedAuthority();
+ List<String> path = albumUri.getPathSegments();
+
+ String albumId = null;
+ if (LOCAL_AUTHORITY.equals(type)) {
+ if (path.size() > 3) {
+ albumId = LocalSource.constructId(INTERNAL.equals(path.get(0)), path.get(3));
+ }
+ } else {
+ if (path.size() > 1) {
+ albumId = PicasaSource.constructId(path.get(1));
+ }
+ }
+
+ for (int idx = 0; idx < settings.length; idx++) {
+ settings[idx].setAlbumEnabled(albumId, shown);
+ }
+ }
+ }
+}
diff --git a/src/com/android/dreams/phototable/PhotoSource.java b/src/com/android/dreams/phototable/PhotoSource.java
index fc4cf7b..442b9c3 100644
--- a/src/com/android/dreams/phototable/PhotoSource.java
+++ b/src/com/android/dreams/phototable/PhotoSource.java
@@ -23,6 +23,7 @@ import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
+import android.net.Uri;
import android.util.Log;
import java.io.BufferedInputStream;
@@ -54,6 +55,7 @@ public abstract class PhotoSource {
protected String albumId;
protected Cursor cursor;
protected int position;
+ protected Uri uri;
InputStream getStream(int longSide) {
return PhotoSource.this.getStream(this, longSide);
diff --git a/src/com/android/dreams/phototable/PicasaSource.java b/src/com/android/dreams/phototable/PicasaSource.java
index 0db98af..0272eb7 100644
--- a/src/com/android/dreams/phototable/PicasaSource.java
+++ b/src/com/android/dreams/phototable/PicasaSource.java
@@ -354,7 +354,7 @@ public class PicasaSource extends CursorPhotoSource {
log(TAG, "can't find the ID column!");
} else {
while (cursor.moveToNext()) {
- String id = TAG + ":" + cursor.getString(idIndex);
+ String id = constructId(cursor.getString(idIndex));
String user = (userIndex >= 0 ? cursor.getString(userIndex) : "-1");
String type = (typeIndex >= 0 ? cursor.getString(typeIndex) : "none");
boolean isPosts = (typeIndex >= 0 && PICASA_POSTS_TYPE.equals(type));
@@ -369,12 +369,12 @@ public class PicasaSource extends CursorPhotoSource {
if (isPosts) {
log(TAG, "replacing " + id + " with " + PICASA_POSTS_TYPE);
- id = TAG + ":" + PICASA_POSTS_TYPE + ":" + user;
+ id = constructId(PICASA_POSTS_TYPE + ":" + user);
}
if (isUpload) {
log(TAG, "replacing " + id + " with " + PICASA_UPLOAD_TYPE);
- id = TAG + ":" + PICASA_UPLOAD_TYPE + ":" + user;
+ id = constructId(PICASA_UPLOAD_TYPE + ":" + user);
}
String thumbnailUrl = null;
@@ -425,6 +425,10 @@ public class PicasaSource extends CursorPhotoSource {
return foundAlbums.values();
}
+ public static String constructId(String serverId) {
+ return TAG + ":" + serverId;
+ }
+
@Override
protected InputStream getStream(ImageData data, int longSide) {
InputStream is = null;