diff --git a/core/api/current.txt b/core/api/current.txt index 2b4fee09a06e8..04ac82756e821 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 a7473e7a4c45c..07260fd8384f4 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 17ec2a847d4fe..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,8 +157,8 @@ public final class ContextParams { * @return This builder. */ @NonNull - public Builder setAttributionTag(@NonNull String attributionTag) { - mAttributionTag = Objects.requireNonNull(attributionTag); + public Builder setAttributionTag(@Nullable String attributionTag) { + mAttributionTag = attributionTag; return this; } @@ -140,9 +171,9 @@ public final class ContextParams { * @return This builder. */ @NonNull - public Builder setReceiverPackage(@NonNull String packageName, + public Builder setReceiverPackage(@Nullable String packageName, @Nullable String attributionTag) { - mReceiverPackage = Objects.requireNonNull(packageName); + mReceiverPackage = packageName; mReceiverAttributionTag = attributionTag; return this; } @@ -169,8 +200,13 @@ public final class ContextParams { */ @SystemApi @RequiresPermission(android.Manifest.permission.RENOUNCE_PERMISSIONS) - public @NonNull Builder setRenouncedPermissions(@NonNull Set renouncedPermissions) { - mRenouncedPermissions = Collections.unmodifiableSet(renouncedPermissions); + public @NonNull Builder setRenouncedPermissions( + @Nullable Set renouncedPermissions) { + if (renouncedPermissions != null) { + mRenouncedPermissions = Collections.unmodifiableSet(renouncedPermissions); + } else { + mRenouncedPermissions = null; + } return this; }