diff options
| -rw-r--r-- | api/current.txt | 1 | ||||
| -rw-r--r-- | api/system-current.txt | 1 | ||||
| -rw-r--r-- | api/test-current.txt | 1 | ||||
| -rw-r--r-- | core/java/android/provider/DocumentsContract.java | 1 | ||||
| -rw-r--r-- | core/java/android/provider/DocumentsProvider.java | 69 |
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; + } + } } |