Loading api/current.txt +6 −0 Original line number Original line Diff line number Diff line Loading @@ -5587,8 +5587,10 @@ package android.content { method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]); method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]); method public static deprecated android.content.SyncInfo getCurrentSync(); method public static deprecated android.content.SyncInfo getCurrentSync(); method public static java.util.List<android.content.SyncInfo> getCurrentSyncs(); method public static java.util.List<android.content.SyncInfo> getCurrentSyncs(); method public android.net.Uri[] getIncomingUriPermissionGrants(int, int); method public static int getIsSyncable(android.accounts.Account, java.lang.String); method public static int getIsSyncable(android.accounts.Account, java.lang.String); method public static boolean getMasterSyncAutomatically(); method public static boolean getMasterSyncAutomatically(); method public android.net.Uri[] getOutgoingUriPermissionGrants(int, int); method public static java.util.List<android.content.PeriodicSync> getPeriodicSyncs(android.accounts.Account, java.lang.String); method public static java.util.List<android.content.PeriodicSync> getPeriodicSyncs(android.accounts.Account, java.lang.String); method public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String); method public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String); method public static android.content.SyncAdapterType[] getSyncAdapterTypes(); method public static android.content.SyncAdapterType[] getSyncAdapterTypes(); Loading Loading @@ -20353,6 +20355,7 @@ package android.provider { method public static android.net.Uri buildSearchUri(java.lang.String, java.lang.String, java.lang.String, java.lang.String); method public static android.net.Uri buildSearchUri(java.lang.String, java.lang.String, java.lang.String, java.lang.String); method public static android.net.Uri buildSearchUri(android.net.Uri, java.lang.String); method public static android.net.Uri buildSearchUri(android.net.Uri, java.lang.String); method public static java.lang.String getDocId(android.net.Uri); method public static java.lang.String getDocId(android.net.Uri); method public static android.net.Uri[] getOpenDocuments(android.content.Context); method public static java.lang.String getRootId(android.net.Uri); method public static java.lang.String getRootId(android.net.Uri); method public static java.lang.String getSearchQuery(android.net.Uri); method public static java.lang.String getSearchQuery(android.net.Uri); method public static android.graphics.Bitmap getThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point); method public static android.graphics.Bitmap getThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point); Loading Loading @@ -23369,11 +23372,14 @@ package android.test.mock { method public java.io.File getDatabasePath(java.lang.String); method public java.io.File getDatabasePath(java.lang.String); method public java.io.File getDir(java.lang.String, int); method public java.io.File getDir(java.lang.String, int); method public java.io.File getExternalCacheDir(); method public java.io.File getExternalCacheDir(); method public java.io.File[] getExternalCacheDirs(); method public java.io.File getExternalFilesDir(java.lang.String); method public java.io.File getExternalFilesDir(java.lang.String); method public java.io.File[] getExternalFilesDirs(java.lang.String); method public java.io.File getFileStreamPath(java.lang.String); method public java.io.File getFileStreamPath(java.lang.String); method public java.io.File getFilesDir(); method public java.io.File getFilesDir(); method public android.os.Looper getMainLooper(); method public android.os.Looper getMainLooper(); method public java.io.File getObbDir(); method public java.io.File getObbDir(); method public java.io.File[] getObbDirs(); method public java.lang.String getPackageCodePath(); method public java.lang.String getPackageCodePath(); method public android.content.pm.PackageManager getPackageManager(); method public android.content.pm.PackageManager getPackageManager(); method public java.lang.String getPackageName(); method public java.lang.String getPackageName(); core/java/android/app/ActivityManagerNative.java +31 −0 Original line number Original line Diff line number Diff line Loading @@ -1980,6 +1980,19 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM reply.writeNoException(); reply.writeNoException(); return true; return true; } } case GET_GRANTED_URI_PERMISSIONS_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); final String sourcePackage = data.readString(); final String targetPackage = data.readString(); final int modeFlags = data.readInt(); final int modeMask = data.readInt(); final Uri[] uris = getGrantedUriPermissions( sourcePackage, targetPackage, modeFlags, modeMask); reply.writeNoException(); reply.writeParcelableArray(uris, 0); return true; } } } return super.onTransact(code, data, reply, flags); return super.onTransact(code, data, reply, flags); Loading Loading @@ -4540,5 +4553,23 @@ class ActivityManagerProxy implements IActivityManager reply.recycle(); reply.recycle(); } } public Uri[] getGrantedUriPermissions( String sourcePackage, String targetPackage, int modeFlags, int modeMask) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeString(sourcePackage); data.writeString(targetPackage); data.writeInt(modeFlags); data.writeInt(modeMask); mRemote.transact(GET_GRANTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0); reply.readException(); final Uri[] uris = (Uri[]) reply.readParcelableArray(null); data.recycle(); reply.recycle(); return uris; } private IBinder mRemote; private IBinder mRemote; } } core/java/android/app/IActivityManager.java +5 −0 Original line number Original line Diff line number Diff line Loading @@ -399,6 +399,10 @@ public interface IActivityManager extends IInterface { public void restart() throws RemoteException; public void restart() throws RemoteException; public Uri[] getGrantedUriPermissions( String sourcePackage, String targetPackage, int modeFlags, int modeMask) throws RemoteException; /* /* * Private non-Binder interfaces * Private non-Binder interfaces */ */ Loading Loading @@ -680,4 +684,5 @@ public interface IActivityManager extends IInterface { int NOTIFY_ACTIVITY_DRAWN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+175; int NOTIFY_ACTIVITY_DRAWN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+175; int REPORT_ACTIVITY_FULLY_DRAWN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+176; int REPORT_ACTIVITY_FULLY_DRAWN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+176; int RESTART_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+177; int RESTART_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+177; int GET_GRANTED_URI_PERMISSIONS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+178; } } core/java/android/content/ContentResolver.java +54 −3 Original line number Original line Diff line number Diff line Loading @@ -16,8 +16,6 @@ package android.content; package android.content; import dalvik.system.CloseGuard; import android.accounts.Account; import android.accounts.Account; import android.app.ActivityManagerNative; import android.app.ActivityManagerNative; import android.app.ActivityThread; import android.app.ActivityThread; Loading @@ -44,7 +42,8 @@ import android.os.UserHandle; import android.text.TextUtils; import android.text.TextUtils; import android.util.EventLog; import android.util.EventLog; import android.util.Log; import android.util.Log; import android.util.Pair; import dalvik.system.CloseGuard; import java.io.File; import java.io.File; import java.io.FileInputStream; import java.io.FileInputStream; Loading Loading @@ -1388,6 +1387,58 @@ public abstract class ContentResolver { } } } } /** * Return list of all Uri permissions that have been granted <em>to</em> the * calling package, and which exactly match the requested flags. For * example, to return all Uris that the calling application has * <em>non-persistent</em> read access to: * * <pre class="prettyprint"> * getIncomingUriPermissionGrants(Intent.FLAG_GRANT_READ_URI_PERMISSION, * Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_PERSIST_GRANT_URI_PERMISSION); * </pre> * * @param modeFlags any combination of * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION}, * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION}, or * {@link Intent#FLAG_PERSIST_GRANT_URI_PERMISSION}. * @param modeMask mask indicating which flags must match. */ public Uri[] getIncomingUriPermissionGrants(int modeFlags, int modeMask) { try { return ActivityManagerNative.getDefault() .getGrantedUriPermissions(null, getPackageName(), modeFlags, modeMask); } catch (RemoteException e) { return new Uri[0]; } } /** * Return list of all Uri permissions that have been granted <em>from</em> the * calling package, and which exactly match the requested flags. For * example, to return all Uris that the calling application has granted * <em>non-persistent</em> read access to: * * <pre class="prettyprint"> * getOutgoingUriPermissionGrants(Intent.FLAG_GRANT_READ_URI_PERMISSION, * Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_PERSIST_GRANT_URI_PERMISSION); * </pre> * * @param modeFlags any combination of * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION}, * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION}, or * {@link Intent#FLAG_PERSIST_GRANT_URI_PERMISSION}. * @param modeMask mask indicating which flags must match. */ public Uri[] getOutgoingUriPermissionGrants(int modeFlags, int modeMask) { try { return ActivityManagerNative.getDefault() .getGrantedUriPermissions(getPackageName(), null, modeFlags, modeMask); } catch (RemoteException e) { return new Uri[0]; } } /** /** * Start an asynchronous sync operation. If you want to monitor the progress * Start an asynchronous sync operation. If you want to monitor the progress * of the sync you may register a SyncObserver. Only values of the following * of the sync you may register a SyncObserver. Only values of the following Loading core/java/android/provider/DocumentsContract.java +43 −3 Original line number Original line Diff line number Diff line Loading @@ -19,7 +19,9 @@ package android.provider; import android.content.ContentProvider; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.ContentResolver; import android.content.ContentValues; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; import android.content.pm.ProviderInfo; import android.content.res.AssetFileDescriptor; import android.content.res.AssetFileDescriptor; import android.database.Cursor; import android.database.Cursor; Loading @@ -30,6 +32,8 @@ import android.net.Uri; import android.os.Bundle; import android.os.Bundle; import android.util.Log; import android.util.Log; import com.google.android.collect.Lists; import libcore.io.IoUtils; import libcore.io.IoUtils; import java.io.IOException; import java.io.IOException; Loading Loading @@ -201,19 +205,25 @@ public final class DocumentsContract { public static String getRootId(Uri documentUri) { public static String getRootId(Uri documentUri) { final List<String> paths = documentUri.getPathSegments(); final List<String> paths = documentUri.getPathSegments(); if (paths.size() < 2) { throw new IllegalArgumentException("Not a root: " + documentUri); } if (!PATH_ROOTS.equals(paths.get(0))) { if (!PATH_ROOTS.equals(paths.get(0))) { throw new IllegalArgumentException(); throw new IllegalArgumentException("Not a root: " + documentUri); } } return paths.get(1); return paths.get(1); } } public static String getDocId(Uri documentUri) { public static String getDocId(Uri documentUri) { final List<String> paths = documentUri.getPathSegments(); final List<String> paths = documentUri.getPathSegments(); if (paths.size() < 4) { throw new IllegalArgumentException("Not a document: " + documentUri); } if (!PATH_ROOTS.equals(paths.get(0))) { if (!PATH_ROOTS.equals(paths.get(0))) { throw new IllegalArgumentException(); throw new IllegalArgumentException("Not a document: " + documentUri); } } if (!PATH_DOCS.equals(paths.get(2))) { if (!PATH_DOCS.equals(paths.get(2))) { throw new IllegalArgumentException(); throw new IllegalArgumentException("Not a document: " + documentUri); } } return paths.get(3); return paths.get(3); } } Loading Loading @@ -358,6 +368,36 @@ public final class DocumentsContract { public static final String AVAILABLE_BYTES = "available_bytes"; public static final String AVAILABLE_BYTES = "available_bytes"; } } /** * Return list of all documents that the calling package has "open." These * are Uris matching {@link DocumentsContract} to which persistent * read/write access has been granted, usually through * {@link Intent#ACTION_OPEN_DOCUMENT} or * {@link Intent#ACTION_CREATE_DOCUMENT}. * * @see Context#grantUriPermission(String, Uri, int) * @see ContentResolver#getIncomingUriPermissionGrants(int, int) */ public static Uri[] getOpenDocuments(Context context) { final int openedFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_PERSIST_GRANT_URI_PERMISSION; final Uri[] uris = context.getContentResolver() .getIncomingUriPermissionGrants(openedFlags, openedFlags); // Filter to only include document providers final PackageManager pm = context.getPackageManager(); final List<Uri> result = Lists.newArrayList(); for (Uri uri : uris) { final ProviderInfo info = pm.resolveContentProvider( uri.getAuthority(), PackageManager.GET_META_DATA); if (info.metaData.containsKey(META_DATA_DOCUMENT_PROVIDER)) { result.add(uri); } } return result.toArray(new Uri[result.size()]); } /** /** * Return thumbnail representing the document at the given URI. Callers are * Return thumbnail representing the document at the given URI. Callers are * responsible for their own caching. Given document must have * responsible for their own caching. Given document must have Loading Loading
api/current.txt +6 −0 Original line number Original line Diff line number Diff line Loading @@ -5587,8 +5587,10 @@ package android.content { method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]); method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]); method public static deprecated android.content.SyncInfo getCurrentSync(); method public static deprecated android.content.SyncInfo getCurrentSync(); method public static java.util.List<android.content.SyncInfo> getCurrentSyncs(); method public static java.util.List<android.content.SyncInfo> getCurrentSyncs(); method public android.net.Uri[] getIncomingUriPermissionGrants(int, int); method public static int getIsSyncable(android.accounts.Account, java.lang.String); method public static int getIsSyncable(android.accounts.Account, java.lang.String); method public static boolean getMasterSyncAutomatically(); method public static boolean getMasterSyncAutomatically(); method public android.net.Uri[] getOutgoingUriPermissionGrants(int, int); method public static java.util.List<android.content.PeriodicSync> getPeriodicSyncs(android.accounts.Account, java.lang.String); method public static java.util.List<android.content.PeriodicSync> getPeriodicSyncs(android.accounts.Account, java.lang.String); method public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String); method public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String); method public static android.content.SyncAdapterType[] getSyncAdapterTypes(); method public static android.content.SyncAdapterType[] getSyncAdapterTypes(); Loading Loading @@ -20353,6 +20355,7 @@ package android.provider { method public static android.net.Uri buildSearchUri(java.lang.String, java.lang.String, java.lang.String, java.lang.String); method public static android.net.Uri buildSearchUri(java.lang.String, java.lang.String, java.lang.String, java.lang.String); method public static android.net.Uri buildSearchUri(android.net.Uri, java.lang.String); method public static android.net.Uri buildSearchUri(android.net.Uri, java.lang.String); method public static java.lang.String getDocId(android.net.Uri); method public static java.lang.String getDocId(android.net.Uri); method public static android.net.Uri[] getOpenDocuments(android.content.Context); method public static java.lang.String getRootId(android.net.Uri); method public static java.lang.String getRootId(android.net.Uri); method public static java.lang.String getSearchQuery(android.net.Uri); method public static java.lang.String getSearchQuery(android.net.Uri); method public static android.graphics.Bitmap getThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point); method public static android.graphics.Bitmap getThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point); Loading Loading @@ -23369,11 +23372,14 @@ package android.test.mock { method public java.io.File getDatabasePath(java.lang.String); method public java.io.File getDatabasePath(java.lang.String); method public java.io.File getDir(java.lang.String, int); method public java.io.File getDir(java.lang.String, int); method public java.io.File getExternalCacheDir(); method public java.io.File getExternalCacheDir(); method public java.io.File[] getExternalCacheDirs(); method public java.io.File getExternalFilesDir(java.lang.String); method public java.io.File getExternalFilesDir(java.lang.String); method public java.io.File[] getExternalFilesDirs(java.lang.String); method public java.io.File getFileStreamPath(java.lang.String); method public java.io.File getFileStreamPath(java.lang.String); method public java.io.File getFilesDir(); method public java.io.File getFilesDir(); method public android.os.Looper getMainLooper(); method public android.os.Looper getMainLooper(); method public java.io.File getObbDir(); method public java.io.File getObbDir(); method public java.io.File[] getObbDirs(); method public java.lang.String getPackageCodePath(); method public java.lang.String getPackageCodePath(); method public android.content.pm.PackageManager getPackageManager(); method public android.content.pm.PackageManager getPackageManager(); method public java.lang.String getPackageName(); method public java.lang.String getPackageName();
core/java/android/app/ActivityManagerNative.java +31 −0 Original line number Original line Diff line number Diff line Loading @@ -1980,6 +1980,19 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM reply.writeNoException(); reply.writeNoException(); return true; return true; } } case GET_GRANTED_URI_PERMISSIONS_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); final String sourcePackage = data.readString(); final String targetPackage = data.readString(); final int modeFlags = data.readInt(); final int modeMask = data.readInt(); final Uri[] uris = getGrantedUriPermissions( sourcePackage, targetPackage, modeFlags, modeMask); reply.writeNoException(); reply.writeParcelableArray(uris, 0); return true; } } } return super.onTransact(code, data, reply, flags); return super.onTransact(code, data, reply, flags); Loading Loading @@ -4540,5 +4553,23 @@ class ActivityManagerProxy implements IActivityManager reply.recycle(); reply.recycle(); } } public Uri[] getGrantedUriPermissions( String sourcePackage, String targetPackage, int modeFlags, int modeMask) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeString(sourcePackage); data.writeString(targetPackage); data.writeInt(modeFlags); data.writeInt(modeMask); mRemote.transact(GET_GRANTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0); reply.readException(); final Uri[] uris = (Uri[]) reply.readParcelableArray(null); data.recycle(); reply.recycle(); return uris; } private IBinder mRemote; private IBinder mRemote; } }
core/java/android/app/IActivityManager.java +5 −0 Original line number Original line Diff line number Diff line Loading @@ -399,6 +399,10 @@ public interface IActivityManager extends IInterface { public void restart() throws RemoteException; public void restart() throws RemoteException; public Uri[] getGrantedUriPermissions( String sourcePackage, String targetPackage, int modeFlags, int modeMask) throws RemoteException; /* /* * Private non-Binder interfaces * Private non-Binder interfaces */ */ Loading Loading @@ -680,4 +684,5 @@ public interface IActivityManager extends IInterface { int NOTIFY_ACTIVITY_DRAWN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+175; int NOTIFY_ACTIVITY_DRAWN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+175; int REPORT_ACTIVITY_FULLY_DRAWN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+176; int REPORT_ACTIVITY_FULLY_DRAWN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+176; int RESTART_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+177; int RESTART_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+177; int GET_GRANTED_URI_PERMISSIONS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+178; } }
core/java/android/content/ContentResolver.java +54 −3 Original line number Original line Diff line number Diff line Loading @@ -16,8 +16,6 @@ package android.content; package android.content; import dalvik.system.CloseGuard; import android.accounts.Account; import android.accounts.Account; import android.app.ActivityManagerNative; import android.app.ActivityManagerNative; import android.app.ActivityThread; import android.app.ActivityThread; Loading @@ -44,7 +42,8 @@ import android.os.UserHandle; import android.text.TextUtils; import android.text.TextUtils; import android.util.EventLog; import android.util.EventLog; import android.util.Log; import android.util.Log; import android.util.Pair; import dalvik.system.CloseGuard; import java.io.File; import java.io.File; import java.io.FileInputStream; import java.io.FileInputStream; Loading Loading @@ -1388,6 +1387,58 @@ public abstract class ContentResolver { } } } } /** * Return list of all Uri permissions that have been granted <em>to</em> the * calling package, and which exactly match the requested flags. For * example, to return all Uris that the calling application has * <em>non-persistent</em> read access to: * * <pre class="prettyprint"> * getIncomingUriPermissionGrants(Intent.FLAG_GRANT_READ_URI_PERMISSION, * Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_PERSIST_GRANT_URI_PERMISSION); * </pre> * * @param modeFlags any combination of * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION}, * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION}, or * {@link Intent#FLAG_PERSIST_GRANT_URI_PERMISSION}. * @param modeMask mask indicating which flags must match. */ public Uri[] getIncomingUriPermissionGrants(int modeFlags, int modeMask) { try { return ActivityManagerNative.getDefault() .getGrantedUriPermissions(null, getPackageName(), modeFlags, modeMask); } catch (RemoteException e) { return new Uri[0]; } } /** * Return list of all Uri permissions that have been granted <em>from</em> the * calling package, and which exactly match the requested flags. For * example, to return all Uris that the calling application has granted * <em>non-persistent</em> read access to: * * <pre class="prettyprint"> * getOutgoingUriPermissionGrants(Intent.FLAG_GRANT_READ_URI_PERMISSION, * Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_PERSIST_GRANT_URI_PERMISSION); * </pre> * * @param modeFlags any combination of * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION}, * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION}, or * {@link Intent#FLAG_PERSIST_GRANT_URI_PERMISSION}. * @param modeMask mask indicating which flags must match. */ public Uri[] getOutgoingUriPermissionGrants(int modeFlags, int modeMask) { try { return ActivityManagerNative.getDefault() .getGrantedUriPermissions(getPackageName(), null, modeFlags, modeMask); } catch (RemoteException e) { return new Uri[0]; } } /** /** * Start an asynchronous sync operation. If you want to monitor the progress * Start an asynchronous sync operation. If you want to monitor the progress * of the sync you may register a SyncObserver. Only values of the following * of the sync you may register a SyncObserver. Only values of the following Loading
core/java/android/provider/DocumentsContract.java +43 −3 Original line number Original line Diff line number Diff line Loading @@ -19,7 +19,9 @@ package android.provider; import android.content.ContentProvider; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.ContentResolver; import android.content.ContentValues; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; import android.content.pm.ProviderInfo; import android.content.res.AssetFileDescriptor; import android.content.res.AssetFileDescriptor; import android.database.Cursor; import android.database.Cursor; Loading @@ -30,6 +32,8 @@ import android.net.Uri; import android.os.Bundle; import android.os.Bundle; import android.util.Log; import android.util.Log; import com.google.android.collect.Lists; import libcore.io.IoUtils; import libcore.io.IoUtils; import java.io.IOException; import java.io.IOException; Loading Loading @@ -201,19 +205,25 @@ public final class DocumentsContract { public static String getRootId(Uri documentUri) { public static String getRootId(Uri documentUri) { final List<String> paths = documentUri.getPathSegments(); final List<String> paths = documentUri.getPathSegments(); if (paths.size() < 2) { throw new IllegalArgumentException("Not a root: " + documentUri); } if (!PATH_ROOTS.equals(paths.get(0))) { if (!PATH_ROOTS.equals(paths.get(0))) { throw new IllegalArgumentException(); throw new IllegalArgumentException("Not a root: " + documentUri); } } return paths.get(1); return paths.get(1); } } public static String getDocId(Uri documentUri) { public static String getDocId(Uri documentUri) { final List<String> paths = documentUri.getPathSegments(); final List<String> paths = documentUri.getPathSegments(); if (paths.size() < 4) { throw new IllegalArgumentException("Not a document: " + documentUri); } if (!PATH_ROOTS.equals(paths.get(0))) { if (!PATH_ROOTS.equals(paths.get(0))) { throw new IllegalArgumentException(); throw new IllegalArgumentException("Not a document: " + documentUri); } } if (!PATH_DOCS.equals(paths.get(2))) { if (!PATH_DOCS.equals(paths.get(2))) { throw new IllegalArgumentException(); throw new IllegalArgumentException("Not a document: " + documentUri); } } return paths.get(3); return paths.get(3); } } Loading Loading @@ -358,6 +368,36 @@ public final class DocumentsContract { public static final String AVAILABLE_BYTES = "available_bytes"; public static final String AVAILABLE_BYTES = "available_bytes"; } } /** * Return list of all documents that the calling package has "open." These * are Uris matching {@link DocumentsContract} to which persistent * read/write access has been granted, usually through * {@link Intent#ACTION_OPEN_DOCUMENT} or * {@link Intent#ACTION_CREATE_DOCUMENT}. * * @see Context#grantUriPermission(String, Uri, int) * @see ContentResolver#getIncomingUriPermissionGrants(int, int) */ public static Uri[] getOpenDocuments(Context context) { final int openedFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_PERSIST_GRANT_URI_PERMISSION; final Uri[] uris = context.getContentResolver() .getIncomingUriPermissionGrants(openedFlags, openedFlags); // Filter to only include document providers final PackageManager pm = context.getPackageManager(); final List<Uri> result = Lists.newArrayList(); for (Uri uri : uris) { final ProviderInfo info = pm.resolveContentProvider( uri.getAuthority(), PackageManager.GET_META_DATA); if (info.metaData.containsKey(META_DATA_DOCUMENT_PROVIDER)) { result.add(uri); } } return result.toArray(new Uri[result.size()]); } /** /** * Return thumbnail representing the document at the given URI. Callers are * Return thumbnail representing the document at the given URI. Callers are * responsible for their own caching. Given document must have * responsible for their own caching. Given document must have Loading