am 8c6c0419: Merge "Tighten flags enforcement, API to test Uris." into klp-dev
* commit '8c6c04197e58be6f3e46ba6a38f5d16e4fb091fa': Tighten flags enforcement, API to test Uris.
This commit is contained in:
@@ -20978,6 +20978,7 @@ package android.provider {
|
||||
method public static android.graphics.Bitmap getDocumentThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point, android.os.CancellationSignal);
|
||||
method public static java.lang.String getRootId(android.net.Uri);
|
||||
method public static java.lang.String getSearchDocumentsQuery(android.net.Uri);
|
||||
method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
|
||||
field public static final java.lang.String EXTRA_ERROR = "error";
|
||||
field public static final java.lang.String EXTRA_INFO = "info";
|
||||
field public static final java.lang.String EXTRA_LOADING = "loading";
|
||||
|
||||
@@ -21,7 +21,10 @@ import static libcore.io.OsConstants.SEEK_SET;
|
||||
|
||||
import android.content.ContentProviderClient;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ProviderInfo;
|
||||
import android.content.res.AssetFileDescriptor;
|
||||
import android.database.Cursor;
|
||||
import android.graphics.Bitmap;
|
||||
@@ -572,6 +575,28 @@ public final class DocumentsContract {
|
||||
.appendQueryParameter(PARAM_QUERY, query).build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if the given Uri represents a {@link Document} backed by a
|
||||
* {@link DocumentsProvider}.
|
||||
*/
|
||||
public static boolean isDocumentUri(Context context, Uri uri) {
|
||||
final List<String> paths = uri.getPathSegments();
|
||||
if (paths.size() < 2) {
|
||||
return false;
|
||||
}
|
||||
if (!PATH_DOCUMENT.equals(paths.get(0))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final ProviderInfo info = context.getPackageManager()
|
||||
.resolveContentProvider(uri.getAuthority(), PackageManager.GET_META_DATA);
|
||||
if (info.metaData != null && info.metaData.containsKey(
|
||||
DocumentsContract.META_DATA_DOCUMENT_PROVIDER)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract the {@link Root#COLUMN_ROOT_ID} from the given Uri.
|
||||
*/
|
||||
|
||||
@@ -66,4 +66,16 @@ public class Preconditions {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check the requested flags, throwing if any requested flags are outside
|
||||
* the allowed set.
|
||||
*/
|
||||
public static void checkFlagsArgument(int requestedFlags, int allowedFlags) {
|
||||
if ((requestedFlags & allowedFlags) != requestedFlags) {
|
||||
throw new IllegalArgumentException("Requested flags 0x"
|
||||
+ Integer.toHexString(requestedFlags) + ", but only 0x"
|
||||
+ Integer.toHexString(allowedFlags) + " are allowed");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.provider.DocumentsContract;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
@@ -209,6 +210,9 @@ public class TestActivity extends Activity {
|
||||
if (requestCode == CODE_READ) {
|
||||
final Uri uri = data != null ? data.getData() : null;
|
||||
if (uri != null) {
|
||||
if (DocumentsContract.isDocumentUri(this, uri)) {
|
||||
result += "; DOC_ID";
|
||||
}
|
||||
getContentResolver()
|
||||
.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||
InputStream is = null;
|
||||
@@ -228,6 +232,9 @@ public class TestActivity extends Activity {
|
||||
} else if (requestCode == CODE_WRITE) {
|
||||
final Uri uri = data != null ? data.getData() : null;
|
||||
if (uri != null) {
|
||||
if (DocumentsContract.isDocumentUri(this, uri)) {
|
||||
result += "; DOC_ID";
|
||||
}
|
||||
getContentResolver()
|
||||
.takePersistableUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
||||
OutputStream os = null;
|
||||
|
||||
@@ -41,6 +41,7 @@ import com.android.internal.os.TransferPipe;
|
||||
import com.android.internal.util.FastPrintWriter;
|
||||
import com.android.internal.util.FastXmlSerializer;
|
||||
import com.android.internal.util.MemInfoReader;
|
||||
import com.android.internal.util.Preconditions;
|
||||
import com.android.server.AppOpsService;
|
||||
import com.android.server.AttributeCache;
|
||||
import com.android.server.IntentResolver;
|
||||
@@ -6062,12 +6063,8 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
}
|
||||
|
||||
// Persistable only supported through Intents
|
||||
modeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION
|
||||
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
||||
if (modeFlags == 0) {
|
||||
throw new IllegalArgumentException("Mode flags must be "
|
||||
+ "FLAG_GRANT_READ_URI_PERMISSION and/or FLAG_GRANT_WRITE_URI_PERMISSION");
|
||||
}
|
||||
Preconditions.checkFlagsArgument(modeFlags,
|
||||
Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
||||
|
||||
grantUriPermissionLocked(r.uid, targetPkg, uri, modeFlags,
|
||||
null);
|
||||
@@ -6408,11 +6405,8 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
public void takePersistableUriPermission(Uri uri, int modeFlags) {
|
||||
enforceNotIsolatedCaller("takePersistableUriPermission");
|
||||
|
||||
modeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION
|
||||
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
||||
if (modeFlags == 0) {
|
||||
return;
|
||||
}
|
||||
Preconditions.checkFlagsArgument(modeFlags,
|
||||
Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
||||
|
||||
synchronized (this) {
|
||||
final int callingUid = Binder.getCallingUid();
|
||||
@@ -6436,11 +6430,8 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
public void releasePersistableUriPermission(Uri uri, int modeFlags) {
|
||||
enforceNotIsolatedCaller("releasePersistableUriPermission");
|
||||
|
||||
modeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION
|
||||
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
||||
if (modeFlags == 0) {
|
||||
return;
|
||||
}
|
||||
Preconditions.checkFlagsArgument(modeFlags,
|
||||
Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
||||
|
||||
synchronized (this) {
|
||||
final int callingUid = Binder.getCallingUid();
|
||||
|
||||
@@ -22,6 +22,7 @@ import android.os.UserHandle;
|
||||
import android.util.Log;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.internal.util.Preconditions;
|
||||
import com.google.android.collect.Sets;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
@@ -131,10 +132,7 @@ final class UriPermission {
|
||||
* @return if mode changes should trigger persisting.
|
||||
*/
|
||||
boolean takePersistableModes(int modeFlags) {
|
||||
if ((~persistableModeFlags & modeFlags) != 0) {
|
||||
Slog.w(TAG, "Trying to take 0x" + Integer.toHexString(modeFlags) + " but only 0x"
|
||||
+ Integer.toHexString(persistableModeFlags) + " are available");
|
||||
}
|
||||
Preconditions.checkFlagsArgument(modeFlags, persistableModeFlags);
|
||||
|
||||
final int before = persistedModeFlags;
|
||||
persistedModeFlags |= (persistableModeFlags & modeFlags);
|
||||
|
||||
Reference in New Issue
Block a user