summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt1
-rw-r--r--api/system-current.txt1
-rw-r--r--api/test-current.txt1
-rw-r--r--core/java/android/provider/DocumentsContract.java1
-rw-r--r--core/java/android/provider/DocumentsProvider.java69
5 files changed, 73 insertions, 0 deletions
diff --git a/api/current.txt b/api/current.txt
index 3a3960dfb3e6..c6053dfbe5f6 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -31732,6 +31732,7 @@ package android.provider {
method public java.lang.String createDocument(java.lang.String, java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
method public void deleteDocument(java.lang.String) throws java.io.FileNotFoundException;
+ method public java.lang.String[] getDocumentStreamTypes(java.lang.String, java.lang.String);
method public java.lang.String getDocumentType(java.lang.String) throws java.io.FileNotFoundException;
method public final java.lang.String getType(android.net.Uri);
method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues);
diff --git a/api/system-current.txt b/api/system-current.txt
index 215f61a8a36a..2d6e86719d3d 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -34111,6 +34111,7 @@ package android.provider {
method public java.lang.String createDocument(java.lang.String, java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
method public void deleteDocument(java.lang.String) throws java.io.FileNotFoundException;
+ method public java.lang.String[] getDocumentStreamTypes(java.lang.String, java.lang.String);
method public java.lang.String getDocumentType(java.lang.String) throws java.io.FileNotFoundException;
method public final java.lang.String getType(android.net.Uri);
method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues);
diff --git a/api/test-current.txt b/api/test-current.txt
index ad36599104fb..1f8480062cb1 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -31745,6 +31745,7 @@ package android.provider {
method public java.lang.String createDocument(java.lang.String, java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
method public void deleteDocument(java.lang.String) throws java.io.FileNotFoundException;
+ method public java.lang.String[] getDocumentStreamTypes(java.lang.String, java.lang.String);
method public java.lang.String getDocumentType(java.lang.String) throws java.io.FileNotFoundException;
method public final java.lang.String getType(android.net.Uri);
method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues);
diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java
index 2ca758935feb..b7f071d0992b 100644
--- a/core/java/android/provider/DocumentsContract.java
+++ b/core/java/android/provider/DocumentsContract.java
@@ -358,6 +358,7 @@ public final class DocumentsContract {
* @see #COLUMN_MIME_TYPE
* @see DocumentsProvider#openTypedDocument(String, String, Bundle,
* android.os.CancellationSignal)
+ * @see DocumentsProvider#getDocumentStreamTypes(String, String)
*/
public static final int FLAG_VIRTUAL_DOCUMENT = 1 << 9;
diff --git a/core/java/android/provider/DocumentsProvider.java b/core/java/android/provider/DocumentsProvider.java
index 92ab47a6b71c..515f975bb578 100644
--- a/core/java/android/provider/DocumentsProvider.java
+++ b/core/java/android/provider/DocumentsProvider.java
@@ -540,6 +540,7 @@ public abstract class DocumentsProvider extends ContentProvider {
* provider.
* @param signal used by the caller to signal if the request should be
* cancelled. May be null.
+ * @see #getDocumentStreamTypes(String, String)
*/
@SuppressWarnings("unused")
public AssetFileDescriptor openTypedDocument(
@@ -926,6 +927,7 @@ public abstract class DocumentsProvider extends ContentProvider {
*
* @see #openDocumentThumbnail(String, Point, CancellationSignal)
* @see #openTypedDocument(String, String, Bundle, CancellationSignal)
+ * @see #getDocumentStreamTypes(String, String)
*/
@Override
public final AssetFileDescriptor openTypedAssetFile(Uri uri, String mimeTypeFilter, Bundle opts)
@@ -938,6 +940,7 @@ public abstract class DocumentsProvider extends ContentProvider {
*
* @see #openDocumentThumbnail(String, Point, CancellationSignal)
* @see #openTypedDocument(String, String, Bundle, CancellationSignal)
+ * @see #getDocumentStreamTypes(String, String)
*/
@Override
public final AssetFileDescriptor openTypedAssetFile(
@@ -947,6 +950,55 @@ public abstract class DocumentsProvider extends ContentProvider {
}
/**
+ * Return a list of streamable MIME types matching the filter, which can be passed to
+ * {@link #openTypedDocument(String, String, Bundle, CancellationSignal)}.
+ *
+ * <p>The default implementation returns a MIME type provided by
+ * {@link #queryDocument(String, String[])} as long as it matches the filter and the document
+ * does not have the {@link Document#FLAG_VIRTUAL_DOCUMENT} flag set.
+ *
+ * @see #getStreamTypes(Uri, String)
+ * @see #openTypedDocument(String, String, Bundle, CancellationSignal)
+ */
+ public String[] getDocumentStreamTypes(String documentId, String mimeTypeFilter) {
+ Cursor cursor = null;
+ try {
+ cursor = queryDocument(documentId, null);
+ if (cursor.moveToFirst()) {
+ final String mimeType =
+ cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_MIME_TYPE));
+ final long flags =
+ cursor.getLong(cursor.getColumnIndexOrThrow(Document.COLUMN_FLAGS));
+ if ((flags & Document.FLAG_VIRTUAL_DOCUMENT) == 0 && mimeType != null &&
+ mimeTypeMatches(mimeTypeFilter, mimeType)) {
+ return new String[] { mimeType };
+ }
+ }
+ } catch (FileNotFoundException e) {
+ return null;
+ } finally {
+ IoUtils.closeQuietly(cursor);
+ }
+
+ // No streamable MIME types.
+ return null;
+ }
+
+ /**
+ * Called by a client to determine the types of data streams that this content provider
+ * support for the given URI.
+ *
+ * <p>Overriding this method is deprecated. Override {@link #openTypedDocument} instead.
+ *
+ * @see #getDocumentStreamTypes(String, String)
+ */
+ @Override
+ public String[] getStreamTypes(Uri uri, String mimeTypeFilter) {
+ enforceTree(uri);
+ return getDocumentStreamTypes(getDocumentId(uri), mimeTypeFilter);
+ }
+
+ /**
* @hide
*/
private final AssetFileDescriptor openTypedAssetFileImpl(
@@ -971,4 +1023,21 @@ public abstract class DocumentsProvider extends ContentProvider {
// For any other yet unhandled case, let the provider subclass handle it.
return openTypedDocument(documentId, mimeTypeFilter, opts, signal);
}
+
+ /**
+ * @hide
+ */
+ public static boolean mimeTypeMatches(String filter, String test) {
+ if (test == null) {
+ return false;
+ } else if (filter == null || "*/*".equals(filter)) {
+ return true;
+ } else if (filter.equals(test)) {
+ return true;
+ } else if (filter.endsWith("/*")) {
+ return filter.regionMatches(0, test, 0, filter.indexOf('/'));
+ } else {
+ return false;
+ }
+ }
}