summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ashish Kumar Gaurav <akgaurav@google.com> 2023-03-23 15:01:17 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-03-23 15:01:17 +0000
commit9b39adf62e15aada4342e29552a68765eaa24f60 (patch)
tree56353c7139d12543b5f2e50d3647c385778b566f
parentb179431214fd04e416f6ed9862cae92be26840bc (diff)
parent3ba061af4c61a294f6e37f9e42dd01f85848a8d1 (diff)
Merge "Setting callingAttributionSource in getType and getStreamType" into udc-dev
-rw-r--r--core/java/android/content/ContentProvider.java32
-rw-r--r--core/java/android/content/ContentProviderClient.java4
-rw-r--r--core/java/android/content/ContentProviderNative.java8
-rw-r--r--core/java/android/content/ContentResolver.java2
-rw-r--r--core/java/android/content/IContentProvider.java13
-rw-r--r--test-mock/src/android/test/mock/MockContentProvider.java3
-rw-r--r--test-mock/src/android/test/mock/MockIContentProvider.java3
7 files changed, 50 insertions, 15 deletions
diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java
index d2dbd64ccd7a..31c02b886686 100644
--- a/core/java/android/content/ContentProvider.java
+++ b/core/java/android/content/ContentProvider.java
@@ -302,10 +302,11 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall
@Override
public String getType(AttributionSource attributionSource, Uri uri) {
- // getCallingPackage() isn't available in getType(), as the javadoc states.
uri = validateIncomingUri(uri);
uri = maybeGetUriWithoutUserId(uri);
traceBegin(TRACE_TAG_DATABASE, "getType: ", uri.getAuthority());
+ final AttributionSource original = setCallingAttributionSource(
+ attributionSource);
try {
if (checkGetTypePermission(attributionSource, uri)
== PermissionChecker.PERMISSION_GRANTED) {
@@ -346,6 +347,7 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
} finally {
+ setCallingAttributionSource(original);
Trace.traceEnd(TRACE_TAG_DATABASE);
}
}
@@ -405,16 +407,20 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall
@Override
public void getTypeAnonymousAsync(Uri uri, RemoteCallback callback) {
+ // getCallingPackage() isn't available in getTypeAnonymous(), as the javadoc states.
uri = validateIncomingUri(uri);
uri = maybeGetUriWithoutUserId(uri);
+ traceBegin(TRACE_TAG_DATABASE, "getTypeAnonymous: ", uri.getAuthority());
final Bundle result = new Bundle();
try {
result.putString(ContentResolver.REMOTE_CALLBACK_RESULT, getTypeAnonymous(uri));
} catch (Exception e) {
result.putParcelable(ContentResolver.REMOTE_CALLBACK_ERROR,
new ParcelableException(e));
+ } finally {
+ callback.sendResult(result);
+ Trace.traceEnd(TRACE_TAG_DATABASE);
}
- callback.sendResult(result);
}
@Override
@@ -629,16 +635,19 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall
}
@Override
- public String[] getStreamTypes(Uri uri, String mimeTypeFilter) {
- // getCallingPackage() isn't available in getType(), as the javadoc states.
+ public String[] getStreamTypes(AttributionSource attributionSource,
+ Uri uri, String mimeTypeFilter) {
uri = validateIncomingUri(uri);
uri = maybeGetUriWithoutUserId(uri);
traceBegin(TRACE_TAG_DATABASE, "getStreamTypes: ", uri.getAuthority());
+ final AttributionSource original = setCallingAttributionSource(
+ attributionSource);
try {
return mInterface.getStreamTypes(uri, mimeTypeFilter);
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
} finally {
+ setCallingAttributionSource(original);
Trace.traceEnd(TRACE_TAG_DATABASE);
}
}
@@ -1114,7 +1123,10 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall
* currently processing a request.
* <p>
* This will always return {@code null} when processing
- * {@link #getType(Uri)} or {@link #getStreamTypes(Uri, String)} requests.
+ * {@link #getTypeAnonymous(Uri)} requests
+ *
+ * For {@link #getType(Uri)} requests, this will be only available for cases, where
+ * the caller can be identified. See {@link #getTypeAnonymous(Uri)}
*
* @see Binder#getCallingUid()
* @see Context#grantUriPermission(String, Uri, int)
@@ -1154,7 +1166,10 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall
* a request of the request is for the default attribution.
* <p>
* This will always return {@code null} when processing
- * {@link #getType(Uri)} or {@link #getStreamTypes(Uri, String)} requests.
+ * {@link #getTypeAnonymous(Uri)} requests
+ *
+ * For {@link #getType(Uri)} requests, this will be only available for cases, where
+ * the caller can be identified. See {@link #getTypeAnonymous(Uri)}
*
* @see #getCallingPackage
*/
@@ -1181,7 +1196,10 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall
* {@code null} if not currently processing a request.
* <p>
* This will always return {@code null} when processing
- * {@link #getType(Uri)} or {@link #getStreamTypes(Uri, String)} requests.
+ * {@link #getTypeAnonymous(Uri)} requests
+ *
+ * For {@link #getType(Uri)} requests, this will be only available for cases, where
+ * the caller can be identified. See {@link #getTypeAnonymous(Uri)}
*
* @see Binder#getCallingUid()
* @see Context#grantUriPermission(String, Uri, int)
diff --git a/core/java/android/content/ContentProviderClient.java b/core/java/android/content/ContentProviderClient.java
index cc3c01241c66..6b6ac03db46f 100644
--- a/core/java/android/content/ContentProviderClient.java
+++ b/core/java/android/content/ContentProviderClient.java
@@ -217,7 +217,7 @@ public class ContentProviderClient implements ContentInterface, AutoCloseable {
beforeRemote();
try {
- return mContentProvider.getType(url);
+ return mContentProvider.getType(mAttributionSource, url);
} catch (DeadObjectException e) {
if (!mStable) {
mContentResolver.unstableProviderDied(mContentProvider);
@@ -237,7 +237,7 @@ public class ContentProviderClient implements ContentInterface, AutoCloseable {
beforeRemote();
try {
- return mContentProvider.getStreamTypes(url, mimeTypeFilter);
+ return mContentProvider.getStreamTypes(mAttributionSource, url, mimeTypeFilter);
} catch (DeadObjectException e) {
if (!mStable) {
mContentResolver.unstableProviderDied(mContentProvider);
diff --git a/core/java/android/content/ContentProviderNative.java b/core/java/android/content/ContentProviderNative.java
index 4ba3ff4fe3d3..fda3e3782d88 100644
--- a/core/java/android/content/ContentProviderNative.java
+++ b/core/java/android/content/ContentProviderNative.java
@@ -315,9 +315,11 @@ abstract public class ContentProviderNative extends Binder implements IContentPr
case GET_STREAM_TYPES_TRANSACTION:
{
data.enforceInterface(IContentProvider.descriptor);
+ AttributionSource attributionSource = AttributionSource.CREATOR
+ .createFromParcel(data);
Uri url = Uri.CREATOR.createFromParcel(data);
String mimeTypeFilter = data.readString();
- String[] types = getStreamTypes(url, mimeTypeFilter);
+ String[] types = getStreamTypes(attributionSource, url, mimeTypeFilter);
reply.writeNoException();
reply.writeStringArray(types);
@@ -769,12 +771,14 @@ final class ContentProviderProxy implements IContentProvider
}
@Override
- public String[] getStreamTypes(Uri url, String mimeTypeFilter) throws RemoteException
+ public String[] getStreamTypes(AttributionSource attributionSource,
+ Uri url, String mimeTypeFilter) throws RemoteException
{
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
try {
data.writeInterfaceToken(IContentProvider.descriptor);
+ attributionSource.writeToParcel(data, 0);
url.writeToParcel(data, 0);
data.writeString(mimeTypeFilter);
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 456d21897711..feca7a022934 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -1069,7 +1069,7 @@ public abstract class ContentResolver implements ContentInterface {
}
try {
- return provider.getStreamTypes(url, mimeTypeFilter);
+ return provider.getStreamTypes(mContext.getAttributionSource(), url, mimeTypeFilter);
} catch (RemoteException e) {
// Arbitrary and not worth documenting, as Activity
// Manager will kill this process shortly anyway.
diff --git a/core/java/android/content/IContentProvider.java b/core/java/android/content/IContentProvider.java
index eb80148250b9..ef8d0f9e18c8 100644
--- a/core/java/android/content/IContentProvider.java
+++ b/core/java/android/content/IContentProvider.java
@@ -182,8 +182,19 @@ public interface IContentProvider extends IInterface {
public boolean refresh(@NonNull AttributionSource attributionSource, Uri url,
@Nullable Bundle extras, ICancellationSignal cancellationSignal) throws RemoteException;
+ /**
+ * @deprecated -- use getStreamTypes with AttributionSource
+ */
+ @Deprecated
+ default String[] getStreamTypes(Uri url, String mimeTypeFilter) throws RemoteException {
+ return getStreamTypes(new AttributionSource(Binder.getCallingUid(),
+ AppGlobals.getPackageManager().getPackagesForUid(Binder.getCallingUid())[0],
+ null), url, mimeTypeFilter);
+ }
+
// Data interchange.
- public String[] getStreamTypes(Uri url, String mimeTypeFilter) throws RemoteException;
+ String[] getStreamTypes(AttributionSource attributionSource,
+ Uri url, String mimeTypeFilter) throws RemoteException;
public AssetFileDescriptor openTypedAssetFile(@NonNull AttributionSource attributionSource,
Uri url, String mimeType, Bundle opts, ICancellationSignal signal)
diff --git a/test-mock/src/android/test/mock/MockContentProvider.java b/test-mock/src/android/test/mock/MockContentProvider.java
index 7f084f896e3f..548dded9c47e 100644
--- a/test-mock/src/android/test/mock/MockContentProvider.java
+++ b/test-mock/src/android/test/mock/MockContentProvider.java
@@ -140,7 +140,8 @@ public class MockContentProvider extends ContentProvider {
}
@Override
- public String[] getStreamTypes(Uri url, String mimeTypeFilter) throws RemoteException {
+ public String[] getStreamTypes(AttributionSource attributionSource,
+ Uri url, String mimeTypeFilter) throws RemoteException {
return MockContentProvider.this.getStreamTypes(url, mimeTypeFilter);
}
diff --git a/test-mock/src/android/test/mock/MockIContentProvider.java b/test-mock/src/android/test/mock/MockIContentProvider.java
index bb2996a2cb40..23f8b98a704a 100644
--- a/test-mock/src/android/test/mock/MockIContentProvider.java
+++ b/test-mock/src/android/test/mock/MockIContentProvider.java
@@ -144,7 +144,8 @@ public class MockIContentProvider implements IContentProvider {
}
@Override
- public String[] getStreamTypes(Uri url, String mimeTypeFilter) throws RemoteException {
+ public String[] getStreamTypes(@NonNull AttributionSource attributionSource,
+ Uri url, String mimeTypeFilter) throws RemoteException {
throw new UnsupportedOperationException("unimplemented mock method");
}