diff options
| -rw-r--r-- | api/current.txt | 12 | ||||
| -rw-r--r-- | api/system-current.txt | 4 | ||||
| -rw-r--r-- | api/test-current.txt | 2 | ||||
| -rw-r--r-- | core/java/android/content/pm/PackageParser.java | 39 | ||||
| -rw-r--r-- | core/java/android/content/pm/PermissionInfo.java | 48 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java | 2 |
6 files changed, 69 insertions, 38 deletions
diff --git a/api/current.txt b/api/current.txt index fc51c39dd79b..e37d4f82ad9b 100644 --- a/api/current.txt +++ b/api/current.txt @@ -11840,12 +11840,12 @@ package android.content.pm { } public class PermissionInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable { - ctor public PermissionInfo(); - ctor public PermissionInfo(android.content.pm.PermissionInfo); + ctor @Deprecated public PermissionInfo(); + ctor @Deprecated public PermissionInfo(@NonNull android.content.pm.PermissionInfo); method public int describeContents(); method public int getProtection(); method public int getProtectionFlags(); - method public CharSequence loadDescription(android.content.pm.PackageManager); + method @Nullable public CharSequence loadDescription(@NonNull android.content.pm.PackageManager); field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.PermissionInfo> CREATOR; field public static final int FLAG_COSTS_MONEY = 1; // 0x1 field public static final int FLAG_INSTALLED = 1073741824; // 0x40000000 @@ -11866,10 +11866,10 @@ package android.content.pm { field public static final int PROTECTION_NORMAL = 0; // 0x0 field public static final int PROTECTION_SIGNATURE = 2; // 0x2 field @Deprecated public static final int PROTECTION_SIGNATURE_OR_SYSTEM = 3; // 0x3 - field public int descriptionRes; + field @StringRes public int descriptionRes; field public int flags; - field public String group; - field public CharSequence nonLocalizedDescription; + field @Nullable public String group; + field @Nullable public CharSequence nonLocalizedDescription; field @Deprecated public int protectionLevel; } diff --git a/api/system-current.txt b/api/system-current.txt index 70b961830e4e..c9dca26021c4 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -1722,8 +1722,8 @@ package android.content.pm { field public static final int PROTECTION_FLAG_OEM = 16384; // 0x4000 field public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 65536; // 0x10000 field public static final int PROTECTION_FLAG_WELLBEING = 131072; // 0x20000 - field public String backgroundPermission; - field public int requestRes; + field @Nullable public final String backgroundPermission; + field @StringRes public int requestRes; } public class ResolveInfo implements android.os.Parcelable { diff --git a/api/test-current.txt b/api/test-current.txt index 6d90c4ac8451..e270f422b7ee 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -667,7 +667,7 @@ package android.content.pm { field public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 65536; // 0x10000 field public static final int PROTECTION_FLAG_VENDOR_PRIVILEGED = 32768; // 0x8000 field public static final int PROTECTION_FLAG_WELLBEING = 131072; // 0x20000 - field public String backgroundPermission; + field @Nullable public final String backgroundPermission; } public final class ShortcutInfo implements android.os.Parcelable { diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index e516ed646f9a..c4a574a7d95c 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -3319,7 +3319,20 @@ public class PackageParser { TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestPermission); - Permission perm = new Permission(owner); + String backgroundPermission = null; + if (sa.hasValue( + com.android.internal.R.styleable.AndroidManifestPermission_backgroundPermission)) { + if ("android".equals(owner.packageName)) { + backgroundPermission = sa.getNonResourceString( + com.android.internal.R.styleable + .AndroidManifestPermission_backgroundPermission); + } else { + Slog.w(TAG, owner.packageName + " defines a background permission. Only the " + + "'android' package can do that."); + } + } + + Permission perm = new Permission(owner, backgroundPermission); if (!parsePackageItemInfo(owner, perm.info, outError, "<permission>", sa, true /*nameRequired*/, com.android.internal.R.styleable.AndroidManifestPermission_name, @@ -3348,19 +3361,6 @@ public class PackageParser { perm.info.requestRes = sa.getResourceId( com.android.internal.R.styleable.AndroidManifestPermission_request, 0); - if (sa.hasValue( - com.android.internal.R.styleable.AndroidManifestPermission_backgroundPermission)) { - if ("android".equals(owner.packageName)) { - perm.info.backgroundPermission = sa.getNonResourceString( - com.android.internal.R.styleable - .AndroidManifestPermission_backgroundPermission); - } else { - Slog.w(TAG, owner.packageName + " defines permission '" + perm.info.name - + "' with a background permission. Only the 'android' package can do " - + "that."); - } - } - perm.info.protectionLevel = sa.getInt( com.android.internal.R.styleable.AndroidManifestPermission_protectionLevel, PermissionInfo.PROTECTION_NORMAL); @@ -3403,7 +3403,7 @@ public class PackageParser { private boolean parsePermissionTree(Package owner, Resources res, XmlResourceParser parser, String[] outError) throws XmlPullParserException, IOException { - Permission perm = new Permission(owner); + Permission perm = new Permission(owner, (String) null); TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestPermissionTree); @@ -7613,9 +7613,12 @@ public class PackageParser { @UnsupportedAppUsage public PermissionGroup group; - public Permission(Package _owner) { - super(_owner); - info = new PermissionInfo(); + /** + * @hide + */ + public Permission(Package owner, @Nullable String backgroundPermission) { + super(owner); + info = new PermissionInfo(backgroundPermission); } @UnsupportedAppUsage diff --git a/core/java/android/content/pm/PermissionInfo.java b/core/java/android/content/pm/PermissionInfo.java index b093867345c9..6a41f334827d 100644 --- a/core/java/android/content/pm/PermissionInfo.java +++ b/core/java/android/content/pm/PermissionInfo.java @@ -17,6 +17,9 @@ package android.content.pm; import android.annotation.IntDef; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.StringRes; import android.annotation.SystemApi; import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; @@ -300,7 +303,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * The group this permission is a part of, as per * {@link android.R.attr#permissionGroup}. */ - public String group; + public @Nullable String group; /** * Flag for {@link #flags}, corresponding to <code>costsMoney</code> @@ -322,18 +325,27 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { */ public static final int FLAG_INSTALLED = 1<<30; + /** @hide */ + @IntDef(flag = true, prefix = { "FLAG_" }, value = { + FLAG_COSTS_MONEY, + FLAG_INSTALLED, + FLAG_REMOVED + }) + @Retention(RetentionPolicy.SOURCE) + public @interface Flags {} + /** * Additional flags about this permission as given by * {@link android.R.attr#permissionFlags}. */ - public int flags; + public @Flags int flags; /** * A string resource identifier (in the package's resources) of this * permission's description. From the "description" attribute or, * if not set, 0. */ - public int descriptionRes; + public @StringRes int descriptionRes; /** * A string resource identifier (in the package's resources) used to request the permissions. @@ -342,7 +354,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - public int requestRes; + public @StringRes int requestRes; /** * Some permissions only grant access while the app is in foreground. Some of these permissions @@ -357,7 +369,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { */ @SystemApi @TestApi - public String backgroundPermission; + public final @Nullable String backgroundPermission; /** * The description string provided in the AndroidManifest file, if any. You @@ -365,7 +377,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * is in a resource. You probably want * {@link PermissionInfo#loadDescription} instead. */ - public CharSequence nonLocalizedDescription; + public @Nullable CharSequence nonLocalizedDescription; /** @hide */ public static int fixProtectionLevel(int level) { @@ -383,7 +395,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { /** @hide */ @UnsupportedAppUsage - public static String protectionToString(int level) { + public static @NonNull String protectionToString(int level) { String protLevel = "????"; switch (level & PROTECTION_MASK_BASE) { case PermissionInfo.PROTECTION_DANGEROUS: @@ -456,10 +468,26 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { return protLevel; } + /** + * @hide + */ + public PermissionInfo(@Nullable String backgroundPermission) { + this.backgroundPermission = backgroundPermission; + } + + /** + * @deprecated Should only be created by the system. + */ + @Deprecated public PermissionInfo() { + this((String) null); } - public PermissionInfo(PermissionInfo orig) { + /** + * @deprecated Should only be created by the system. + */ + @Deprecated + public PermissionInfo(@NonNull PermissionInfo orig) { super(orig); protectionLevel = orig.protectionLevel; flags = orig.flags; @@ -481,7 +509,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @return Returns a CharSequence containing the permission's description. * If there is no description, null is returned. */ - public CharSequence loadDescription(PackageManager pm) { + public @Nullable CharSequence loadDescription(@NonNull PackageManager pm) { if (nonLocalizedDescription != null) { return nonLocalizedDescription; } @@ -551,7 +579,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { return (protectionLevel & PermissionInfo.PROTECTION_FLAG_APPOP) != 0; } - public static final @android.annotation.NonNull Creator<PermissionInfo> CREATOR = + public static final @NonNull Creator<PermissionInfo> CREATOR = new Creator<PermissionInfo>() { @Override public PermissionInfo createFromParcel(Parcel source) { diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java index 133e9f84092d..3c3721c6b20a 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java @@ -455,7 +455,7 @@ public class PackageParserTest { pkg.splitPrivateFlags = new int[] { 100 }; pkg.applicationInfo = new ApplicationInfo(); - pkg.permissions.add(new PackageParser.Permission(pkg)); + pkg.permissions.add(new PackageParser.Permission(pkg, (String) null)); pkg.permissionGroups.add(new PackageParser.PermissionGroup(pkg, ID_NULL, ID_NULL, ID_NULL)); final PackageParser.ParseComponentArgs dummy = new PackageParser.ParseComponentArgs( |