From 479d90cefd7d30c8add6bd0cfbdc32babd2c53ae Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Mon, 8 Mar 2021 14:17:34 +0000 Subject: [PATCH 1/2] Relax null checks to fix tests. The nullability annotations on these methods are aspirational, and a recent CL started routing many existing call-sites through them, so we'll need to start allowing nulls. I'm not at a full workstation right now, so this CL simply relaxes the enforcement, and a future CL will adjust the API annotations. Bug: 182091763 Change-Id: I43d49747deb8c7881d942eba48237eb0fccc7acd Merged-In: I43d49747deb8c7881d942eba48237eb0fccc7acd --- core/java/android/content/ContextParams.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/java/android/content/ContextParams.java b/core/java/android/content/ContextParams.java index 17ec2a847d4fe..43d2b16f64d75 100644 --- a/core/java/android/content/ContextParams.java +++ b/core/java/android/content/ContextParams.java @@ -127,7 +127,7 @@ public final class ContextParams { */ @NonNull public Builder setAttributionTag(@NonNull String attributionTag) { - mAttributionTag = Objects.requireNonNull(attributionTag); + mAttributionTag = attributionTag; return this; } @@ -142,7 +142,7 @@ public final class ContextParams { @NonNull public Builder setReceiverPackage(@NonNull String packageName, @Nullable String attributionTag) { - mReceiverPackage = Objects.requireNonNull(packageName); + mReceiverPackage = packageName; mReceiverAttributionTag = attributionTag; return this; } @@ -170,7 +170,11 @@ public final class ContextParams { @SystemApi @RequiresPermission(android.Manifest.permission.RENOUNCE_PERMISSIONS) public @NonNull Builder setRenouncedPermissions(@NonNull Set renouncedPermissions) { - mRenouncedPermissions = Collections.unmodifiableSet(renouncedPermissions); + if (renouncedPermissions != null) { + mRenouncedPermissions = Collections.unmodifiableSet(renouncedPermissions); + } else { + mRenouncedPermissions = null; + } return this; } From 29e882b41742a365176c2cdd2cbb9617f756e477 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Mon, 8 Mar 2021 18:01:05 -0700 Subject: [PATCH 2/2] Refinement of ContextParams behavior. Since this parameters object is likely going to grow over time, we should offer a way for callers to easily "inherit" all sub-parameters by default, instead of making them copy the values manually. This also gives a path for legacy apps to automatically preserve any new sub-parameters that have been added in more modern API levels. This change also relaxes the nullability annotations to match the existing createAttributionContext() behavior, while also supporting clearing of specific inherited values. Bug: 181812281 Test: atest CtsContentTestCases:android.content.cts.ContextTest Change-Id: Ic797e1aef578926b04ea0000ca3a1bf8684183b9 --- core/api/current.txt | 5 +-- core/api/system-current.txt | 2 +- core/java/android/app/ContextImpl.java | 3 +- core/java/android/content/ContextParams.java | 38 ++++++++++++++++++-- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index f56e1ba4e3cca..30f7193b2d694 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -10572,9 +10572,10 @@ package android.content { public static final class ContextParams.Builder { ctor public ContextParams.Builder(); + ctor public ContextParams.Builder(@NonNull android.content.ContextParams); method @NonNull public android.content.ContextParams build(); - method @NonNull public android.content.ContextParams.Builder setAttributionTag(@NonNull String); - method @NonNull public android.content.ContextParams.Builder setReceiverPackage(@NonNull String, @Nullable String); + method @NonNull public android.content.ContextParams.Builder setAttributionTag(@Nullable String); + method @NonNull public android.content.ContextParams.Builder setReceiverPackage(@Nullable String, @Nullable String); } public class ContextWrapper extends android.content.Context { diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 67c8b7255c67c..26fb09190ced9 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -2196,7 +2196,7 @@ package android.content { } public static final class ContextParams.Builder { - method @NonNull @RequiresPermission(android.Manifest.permission.RENOUNCE_PERMISSIONS) public android.content.ContextParams.Builder setRenouncedPermissions(@NonNull java.util.Set); + method @NonNull @RequiresPermission(android.Manifest.permission.RENOUNCE_PERMISSIONS) public android.content.ContextParams.Builder setRenouncedPermissions(@Nullable java.util.Set); } public class ContextWrapper extends android.content.Context { diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index d040938803f6b..996c66b3437b9 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -2635,7 +2635,8 @@ class ContextImpl extends Context { @Override public @NonNull Context createAttributionContext(@Nullable String attributionTag) { - return createContext(new ContextParams.Builder().setAttributionTag(attributionTag).build()); + return createContext( + new ContextParams.Builder(mParams).setAttributionTag(attributionTag).build()); } @Override diff --git a/core/java/android/content/ContextParams.java b/core/java/android/content/ContextParams.java index 43d2b16f64d75..fad905bfac137 100644 --- a/core/java/android/content/ContextParams.java +++ b/core/java/android/content/ContextParams.java @@ -119,6 +119,37 @@ public final class ContextParams { private String mReceiverAttributionTag; private Set mRenouncedPermissions; + /** + * Create a new builder. + *

+ * This is valuable when you are interested in having explicit control + * over every sub-parameter, and don't want to inherit any values from + * an existing Context. + *

+ * Developers should strongly consider using + * {@link #Builder(ContextParams)} instead of this constructor, since + * that will will automatically inherit any new sub-parameters added in + * future platform releases. + */ + public Builder() { + } + + /** + * Create a new builder that inherits all sub-parameters by default. + *

+ * This is valuable when you are only interested in overriding specific + * sub-parameters, and want to preserve all other parameters. Setting a + * specific sub-parameter on the returned builder will override any + * inherited value. + */ + public Builder(@NonNull ContextParams params) { + Objects.requireNonNull(params); + mAttributionTag = params.mAttributionTag; + mReceiverPackage = params.mReceiverPackage; + mReceiverAttributionTag = params.mReceiverAttributionTag; + mRenouncedPermissions = params.mRenouncedPermissions; + } + /** * Sets an attribution tag against which to track permission accesses. * @@ -126,7 +157,7 @@ public final class ContextParams { * @return This builder. */ @NonNull - public Builder setAttributionTag(@NonNull String attributionTag) { + public Builder setAttributionTag(@Nullable String attributionTag) { mAttributionTag = attributionTag; return this; } @@ -140,7 +171,7 @@ public final class ContextParams { * @return This builder. */ @NonNull - public Builder setReceiverPackage(@NonNull String packageName, + public Builder setReceiverPackage(@Nullable String packageName, @Nullable String attributionTag) { mReceiverPackage = packageName; mReceiverAttributionTag = attributionTag; @@ -169,7 +200,8 @@ public final class ContextParams { */ @SystemApi @RequiresPermission(android.Manifest.permission.RENOUNCE_PERMISSIONS) - public @NonNull Builder setRenouncedPermissions(@NonNull Set renouncedPermissions) { + public @NonNull Builder setRenouncedPermissions( + @Nullable Set renouncedPermissions) { if (renouncedPermissions != null) { mRenouncedPermissions = Collections.unmodifiableSet(renouncedPermissions); } else {