diff options
| author | Erik Wolsheimer <ewol@google.com> | 2021-05-21 00:23:28 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2021-05-21 00:23:28 +0000 |
| commit | dba8fda0b33a21d7b5db54fdf792f98100368b1b (patch) | |
| tree | 48ff814128d11c14aca18eb95269638d89384c37 /core/java/android | |
| parent | dec2e2169e3096163cf6525b377d57a4f74163cb (diff) | |
| parent | afbc4fee9d7dcaa002a263e7064169a0781bc370 (diff) | |
Merge "Add application-level 'attributionsAreUserVisible' attribute" into sc-dev
Diffstat (limited to 'core/java/android')
6 files changed, 51 insertions, 2 deletions
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 8b0e99236806..2c4ff5889263 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -786,10 +786,18 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { */ public static final int PRIVATE_FLAG_EXT_REQUEST_FOREGROUND_SERVICE_EXEMPTION = 1 << 1; + /** + * Value for {@link #privateFlagsExt}: whether attributions provided by the application are + * meant to be user-visible. + * @hide + */ + public static final int PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE = 1 << 2; + /** @hide */ @IntDef(flag = true, prefix = { "PRIVATE_FLAG_EXT_" }, value = { PRIVATE_FLAG_EXT_PROFILEABLE, PRIVATE_FLAG_EXT_REQUEST_FOREGROUND_SERVICE_EXEMPTION, + PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE, }) @Retention(RetentionPolicy.SOURCE) public @interface ApplicationInfoPrivateFlagsExt {} @@ -2437,6 +2445,15 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { } /** + * Returns whether attributions provided by the application are meant to be user-visible. + * Defaults to false if application info is retrieved without + * {@link PackageManager#GET_ATTRIBUTIONS}. + */ + public boolean areAttributionsUserVisible() { + return (privateFlagsExt & PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE) != 0; + } + + /** * Returns true if the app has declared in its manifest that it wants its split APKs to be * loaded into isolated Contexts, with their own ClassLoaders and Resources objects. * @hide diff --git a/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java b/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java index d407b106b5a3..c9054fd8976d 100644 --- a/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java +++ b/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java @@ -298,6 +298,16 @@ public class PackageInfoWithoutStateUtils { pi.attributions[i] = generateAttribution(pkg.getAttributions().get(i)); } } + if (pkg.areAttributionsUserVisible()) { + pi.applicationInfo.privateFlagsExt + |= ApplicationInfo.PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE; + } else { + pi.applicationInfo.privateFlagsExt + &= ~ApplicationInfo.PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE; + } + } else { + pi.applicationInfo.privateFlagsExt + &= ~ApplicationInfo.PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE; } if (apexInfo != null) { @@ -809,7 +819,9 @@ public class PackageInfoWithoutStateUtils { int privateFlagsExt = flag(pkg.isProfileable(), ApplicationInfo.PRIVATE_FLAG_EXT_PROFILEABLE) | flag(pkg.hasRequestForegroundServiceExemption(), - ApplicationInfo.PRIVATE_FLAG_EXT_REQUEST_FOREGROUND_SERVICE_EXEMPTION); + ApplicationInfo.PRIVATE_FLAG_EXT_REQUEST_FOREGROUND_SERVICE_EXEMPTION) + | flag(pkg.areAttributionsUserVisible(), + ApplicationInfo.PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE); // @formatter:on return privateFlagsExt; } diff --git a/core/java/android/content/pm/parsing/ParsingPackage.java b/core/java/android/content/pm/parsing/ParsingPackage.java index 2413e6d99f5f..ed68dbf0087c 100644 --- a/core/java/android/content/pm/parsing/ParsingPackage.java +++ b/core/java/android/content/pm/parsing/ParsingPackage.java @@ -362,6 +362,8 @@ public interface ParsingPackage extends ParsingPackageRead { ParsingPackage setCompileSdkVersionCodename(String compileSdkVersionCodename); + ParsingPackage setAttributionsAreUserVisible(boolean attributionsAreUserVisible); + // TODO(b/135203078): This class no longer has access to ParsedPackage, find a replacement // for moving to the next step @CallSuper diff --git a/core/java/android/content/pm/parsing/ParsingPackageImpl.java b/core/java/android/content/pm/parsing/ParsingPackageImpl.java index b0342aa95fc9..f0b76499093c 100644 --- a/core/java/android/content/pm/parsing/ParsingPackageImpl.java +++ b/core/java/android/content/pm/parsing/ParsingPackageImpl.java @@ -514,6 +514,7 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { private static final long ENABLED = 1L << 44; private static final long DISALLOW_PROFILING = 1L << 45; private static final long REQUEST_FOREGROUND_SERVICE_EXEMPTION = 1L << 46; + private static final long ATTRIBUTIONS_ARE_USER_VISIBLE = 1L << 47; } private ParsingPackageImpl setBoolean(@Booleans.Values long flag, boolean value) { @@ -2206,6 +2207,11 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { } @Override + public boolean areAttributionsUserVisible() { + return getBoolean(Booleans.ATTRIBUTIONS_ARE_USER_VISIBLE); + } + + @Override public ParsingPackageImpl setBaseRevisionCode(int value) { baseRevisionCode = value; return this; @@ -2760,4 +2766,10 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { this.zygotePreloadName = zygotePreloadName; return this; } + + @Override + public ParsingPackage setAttributionsAreUserVisible(boolean attributionsAreUserVisible) { + setBoolean(Booleans.ATTRIBUTIONS_ARE_USER_VISIBLE, attributionsAreUserVisible); + return this; + } } diff --git a/core/java/android/content/pm/parsing/ParsingPackageRead.java b/core/java/android/content/pm/parsing/ParsingPackageRead.java index 35a2b9aeb338..a6e189d32b54 100644 --- a/core/java/android/content/pm/parsing/ParsingPackageRead.java +++ b/core/java/android/content/pm/parsing/ParsingPackageRead.java @@ -46,7 +46,6 @@ import android.util.SparseArray; import android.util.SparseIntArray; import java.security.PublicKey; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; @@ -922,4 +921,10 @@ public interface ParsingPackageRead extends Parcelable { * same as toAppInfoWithoutState except without flag computation. */ ApplicationInfo toAppInfoWithoutStateWithoutFlags(); + + /** + * Whether or not the app has said its attribution tags can be made user-visible. + * @see ApplicationInfo#areAttributionsUserVisible() + */ + boolean areAttributionsUserVisible(); } diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java index 022ba16e9da8..b74760ac8bc4 100644 --- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java +++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java @@ -2198,6 +2198,7 @@ public class ParsingPackageUtils { .setUsesNonSdkApi(bool(false, R.styleable.AndroidManifestApplication_usesNonSdkApi, sa)) .setVmSafeMode(bool(false, R.styleable.AndroidManifestApplication_vmSafeMode, sa)) .setAutoRevokePermissions(anInt(R.styleable.AndroidManifestApplication_autoRevokePermissions, sa)) + .setAttributionsAreUserVisible(bool(false, R.styleable.AndroidManifestApplication_attributionsAreUserVisible, sa)) // targetSdkVersion gated .setAllowAudioPlaybackCapture(bool(targetSdk >= Build.VERSION_CODES.Q, R.styleable.AndroidManifestApplication_allowAudioPlaybackCapture, sa)) .setBaseHardwareAccelerated(bool(targetSdk >= Build.VERSION_CODES.ICE_CREAM_SANDWICH, R.styleable.AndroidManifestApplication_hardwareAccelerated, sa)) |
