summaryrefslogtreecommitdiffstats
path: root/core/java
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2013-08-18 20:53:29 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-08-18 20:53:29 +0000
commit58514937628dfcf3b2949e4cbc45d5526ecb8019 (patch)
treef1c767eea76063ea1dc6a5f99a6fa0749a1a6d61 /core/java
parentf855a2ff01b270c06977f64f4a002f3f1c7769ca (diff)
parent9d0843df7e3984293dc4ab6ee2f9502e898b63aa (diff)
downloadframeworks_base-58514937628dfcf3b2949e4cbc45d5526ecb8019.zip
frameworks_base-58514937628dfcf3b2949e4cbc45d5526ecb8019.tar.gz
frameworks_base-58514937628dfcf3b2949e4cbc45d5526ecb8019.tar.bz2
Merge "Resized thumbnails; async; extend MatrixCursor." into klp-dev
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/database/MatrixCursor.java47
-rw-r--r--core/java/android/provider/DocumentsContract.java22
-rw-r--r--core/java/android/provider/MediaStore.java6
3 files changed, 57 insertions, 18 deletions
diff --git a/core/java/android/database/MatrixCursor.java b/core/java/android/database/MatrixCursor.java
index 6e68b6b..2a0d9b9 100644
--- a/core/java/android/database/MatrixCursor.java
+++ b/core/java/android/database/MatrixCursor.java
@@ -83,11 +83,10 @@ public class MatrixCursor extends AbstractCursor {
* row
*/
public RowBuilder newRow() {
- rowCount++;
- int endIndex = rowCount * columnCount;
+ final int row = rowCount++;
+ final int endIndex = rowCount * columnCount;
ensureCapacity(endIndex);
- int start = endIndex - columnCount;
- return new RowBuilder(start, endIndex);
+ return new RowBuilder(row);
}
/**
@@ -180,18 +179,29 @@ public class MatrixCursor extends AbstractCursor {
}
/**
- * Builds a row, starting from the left-most column and adding one column
- * value at a time. Follows the same ordering as the column names specified
- * at cursor construction time.
+ * Builds a row of values using either of these approaches:
+ * <ul>
+ * <li>Values can be added with explicit column ordering using
+ * {@link #add(Object)}, which starts from the left-most column and adds one
+ * column value at a time. This follows the same ordering as the column
+ * names specified at cursor construction time.
+ * <li>Column and value pairs can be offered for possible inclusion using
+ * {@link #offer(String, Object)}. If the cursor includes the given column,
+ * the value will be set for that column, otherwise the value is ignored.
+ * This approach is useful when matching data to a custom projection.
+ * </ul>
+ * Undefined values are left as {@code null}.
*/
public class RowBuilder {
+ private final int row;
+ private final int endIndex;
private int index;
- private final int endIndex;
- RowBuilder(int index, int endIndex) {
- this.index = index;
- this.endIndex = endIndex;
+ RowBuilder(int row) {
+ this.row = row;
+ this.index = row * columnCount;
+ this.endIndex = index + columnCount;
}
/**
@@ -210,6 +220,21 @@ public class MatrixCursor extends AbstractCursor {
data[index++] = columnValue;
return this;
}
+
+ /**
+ * Offer value for possible inclusion if this cursor defines the given
+ * column. Columns not defined by the cursor are silently ignored.
+ *
+ * @return this builder to support chaining
+ */
+ public RowBuilder offer(String columnName, Object value) {
+ for (int i = 0; i < columnNames.length; i++) {
+ if (columnName.equals(columnNames[i])) {
+ data[(row * columnCount) + i] = value;
+ }
+ }
+ return this;
+ }
}
// AbstractCursor implementation.
diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java
index e1810ca..91d349a 100644
--- a/core/java/android/provider/DocumentsContract.java
+++ b/core/java/android/provider/DocumentsContract.java
@@ -36,6 +36,7 @@ import com.google.android.collect.Lists;
import libcore.io.IoUtils;
+import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
@@ -461,16 +462,27 @@ public final class DocumentsContract {
final Bundle opts = new Bundle();
opts.putParcelable(EXTRA_THUMBNAIL_SIZE, size);
- InputStream is = null;
+ AssetFileDescriptor afd = null;
try {
- is = new AssetFileDescriptor.AutoCloseInputStream(
- resolver.openTypedAssetFileDescriptor(documentUri, "image/*", opts));
- return BitmapFactory.decodeStream(is);
+ afd = resolver.openTypedAssetFileDescriptor(documentUri, "image/*", opts);
+
+ final FileDescriptor fd = afd.getFileDescriptor();
+ final BitmapFactory.Options bitmapOpts = new BitmapFactory.Options();
+
+ bitmapOpts.inJustDecodeBounds = true;
+ BitmapFactory.decodeFileDescriptor(fd, null, bitmapOpts);
+
+ final int widthSample = bitmapOpts.outWidth / size.x;
+ final int heightSample = bitmapOpts.outHeight / size.y;
+
+ bitmapOpts.inJustDecodeBounds = false;
+ bitmapOpts.inSampleSize = Math.min(widthSample, heightSample);
+ return BitmapFactory.decodeFileDescriptor(fd, null, bitmapOpts);
} catch (IOException e) {
Log.w(TAG, "Failed to load thumbnail for " + documentUri + ": " + e);
return null;
} finally {
- IoUtils.closeQuietly(is);
+ IoUtils.closeQuietly(afd);
}
}
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index cb6300f..ad6839b 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -19,8 +19,8 @@ package android.provider;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.content.ContentResolver;
-import android.content.ContentValues;
import android.content.ContentUris;
+import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseUtils;
@@ -532,7 +532,8 @@ public final class MediaStore {
private static final Object sThumbBufLock = new Object();
private static byte[] sThumbBuf;
- private static Bitmap getMiniThumbFromFile(Cursor c, Uri baseUri, ContentResolver cr, BitmapFactory.Options options) {
+ private static Bitmap getMiniThumbFromFile(
+ Cursor c, Uri baseUri, ContentResolver cr, BitmapFactory.Options options) {
Bitmap bitmap = null;
Uri thumbUri = null;
try {
@@ -577,6 +578,7 @@ public final class MediaStore {
if (c != null) c.close();
}
}
+
/**
* This method ensure thumbnails associated with origId are generated and decode the byte
* stream from database (MICRO_KIND) or file (MINI_KIND).