Loading api/current.txt +31 −2 Original line number Diff line number Diff line Loading @@ -480,6 +480,10 @@ package android { field public static final int dashGap = 16843175; // 0x10101a7 field public static final int dashWidth = 16843174; // 0x10101a6 field public static final int data = 16842798; // 0x101002e field public static final int dataRetentionTime = 16844189; // 0x101059d field public static final int dataSentOffDevice = 16844186; // 0x101059a field public static final int dataSharedWithThirdParty = 16844187; // 0x101059b field public static final int dataUsedForMonetization = 16844188; // 0x101059c field public static final int datePickerDialogTheme = 16843948; // 0x10104ac field public static final int datePickerMode = 16843955; // 0x10104b3 field public static final int datePickerStyle = 16843612; // 0x101035c Loading Loading @@ -1496,6 +1500,7 @@ package android { field public static final deprecated int unfocusedMonthDateColor = 16843588; // 0x1010344 field public static final int unselectedAlpha = 16843278; // 0x101020e field public static final int updatePeriodMillis = 16843344; // 0x1010250 field public static final int usageInfoRequired = 16844185; // 0x1010599 field public static final int use32bitAbi = 16844053; // 0x1010515 field public static final int useAppZygote = 16844184; // 0x1010598 field public static final int useDefaultMargins = 16843641; // 0x1010379 Loading Loading @@ -11173,8 +11178,8 @@ package android.content.pm { field public android.content.pm.ProviderInfo[] providers; field public android.content.pm.ActivityInfo[] receivers; field public android.content.pm.FeatureInfo[] reqFeatures; field public java.lang.String[] requestedPermissions; field public int[] requestedPermissionsFlags; field public deprecated java.lang.String[] requestedPermissions; field public deprecated int[] requestedPermissionsFlags; field public android.content.pm.ServiceInfo[] services; field public java.lang.String sharedUserId; field public int sharedUserLabel; Loading @@ -11182,6 +11187,7 @@ package android.content.pm { field public android.content.pm.SigningInfo signingInfo; field public java.lang.String[] splitNames; field public int[] splitRevisionCodes; field public android.content.pm.UsesPermissionInfo[] usesPermissions; field public deprecated int versionCode; field public java.lang.String versionName; } Loading Loading @@ -11657,6 +11663,7 @@ package android.content.pm { field public java.lang.String group; field public java.lang.CharSequence nonLocalizedDescription; field public deprecated int protectionLevel; field public boolean usageInfoRequired; } public final class ProviderInfo extends android.content.pm.ComponentInfo implements android.os.Parcelable { Loading Loading @@ -11836,6 +11843,28 @@ package android.content.pm { field public static final android.os.Parcelable.Creator<android.content.pm.SigningInfo> CREATOR; } public final class UsesPermissionInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable { method public int describeContents(); method public int getDataRetention(); method public int getDataRetentionWeeks(); method public int getDataSentOffDevice(); method public int getDataSharedWithThirdParty(); method public int getDataUsedForMonetization(); method public int getFlags(); method public java.lang.String getPermission(); field public static final android.os.Parcelable.Creator<android.content.pm.UsesPermissionInfo> CREATOR; field public static final int FLAG_REQUESTED_PERMISSION_GRANTED = 2; // 0x2 field public static final int RETENTION_NOT_RETAINED = 1; // 0x1 field public static final int RETENTION_SPECIFIED = 4; // 0x4 field public static final int RETENTION_UNDEFINED = 0; // 0x0 field public static final int RETENTION_UNLIMITED = 3; // 0x3 field public static final int RETENTION_USER_SELECTED = 2; // 0x2 field public static final int USAGE_NO = 3; // 0x3 field public static final int USAGE_UNDEFINED = 0; // 0x0 field public static final int USAGE_USER_TRIGGERED = 2; // 0x2 field public static final int USAGE_YES = 1; // 0x1 } public final class VersionedPackage implements android.os.Parcelable { ctor public VersionedPackage(java.lang.String, int); ctor public VersionedPackage(java.lang.String, long); core/java/android/content/pm/PackageInfo.java +21 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ import android.apex.ApexInfo; import android.os.Parcel; import android.os.Parcelable; import java.util.ArrayList; import java.util.List; /** * Overall information about the contents of a package. This corresponds * to all of the information collected from AndroidManifest.xml. Loading Loading @@ -204,7 +207,10 @@ public class PackageInfo implements Parcelable { * {@link PackageManager#GET_PERMISSIONS} was set. This list includes * all permissions requested, even those that were not granted or known * by the system at install time. * * @deprecated Use {@link #usesPermissions} */ @Deprecated public String[] requestedPermissions; /** Loading @@ -214,9 +220,22 @@ public class PackageInfo implements Parcelable { * {@link PackageManager#GET_PERMISSIONS} was set. Each value matches * the corresponding entry in {@link #requestedPermissions}, and will have * the flag {@link #REQUESTED_PERMISSION_GRANTED} set as appropriate. * * @deprecated Use {@link #usesPermissions} */ @Deprecated public int[] requestedPermissionsFlags; /** * Array of all {@link android.R.styleable#AndroidManifestUsesPermission * <uses-permission>} tags included under <manifest>, * or null if there were none. This is only filled in if the flag * {@link PackageManager#GET_PERMISSIONS} was set. This list includes * all permissions requested, even those that were not granted or known * by the system at install time. */ public UsesPermissionInfo[] usesPermissions; /** * Flag for {@link #requestedPermissionsFlags}: the requested permission * is required for the application to run; the user can not optionally Loading Loading @@ -456,6 +475,7 @@ public class PackageInfo implements Parcelable { dest.writeTypedArray(permissions, parcelableFlags); dest.writeStringArray(requestedPermissions); dest.writeIntArray(requestedPermissionsFlags); dest.writeTypedArray(usesPermissions, parcelableFlags); dest.writeTypedArray(signatures, parcelableFlags); dest.writeTypedArray(configPreferences, parcelableFlags); dest.writeTypedArray(reqFeatures, parcelableFlags); Loading Loading @@ -520,6 +540,7 @@ public class PackageInfo implements Parcelable { permissions = source.createTypedArray(PermissionInfo.CREATOR); requestedPermissions = source.createStringArray(); requestedPermissionsFlags = source.createIntArray(); usesPermissions = source.createTypedArray(UsesPermissionInfo.CREATOR); signatures = source.createTypedArray(Signature.CREATOR); configPreferences = source.createTypedArray(ConfigurationInfo.CREATOR); reqFeatures = source.createTypedArray(FeatureInfo.CREATOR); Loading core/java/android/content/pm/PackageParser.java +77 −13 Original line number Diff line number Diff line Loading @@ -785,18 +785,23 @@ public class PackageParser { pi.permissions[i] = generatePermissionInfo(p.permissions.get(i), flags); } } N = p.requestedPermissions.size(); N = p.usesPermissionInfos.size(); if (N > 0) { pi.requestedPermissions = new String[N]; pi.requestedPermissionsFlags = new int[N]; pi.usesPermissions = new UsesPermissionInfo[N]; for (int i=0; i<N; i++) { final String perm = p.requestedPermissions.get(i); UsesPermissionInfo info = p.usesPermissionInfos.get(i); final String perm = info.getPermission(); pi.requestedPermissions[i] = perm; int permissionFlags = 0; // The notion of required permissions is deprecated but for compatibility. pi.requestedPermissionsFlags[i] |= PackageInfo.REQUESTED_PERMISSION_REQUIRED; permissionFlags |= PackageInfo.REQUESTED_PERMISSION_REQUIRED; if (grantedPermissions != null && grantedPermissions.contains(perm)) { pi.requestedPermissionsFlags[i] |= PackageInfo.REQUESTED_PERMISSION_GRANTED; permissionFlags |= PackageInfo.REQUESTED_PERMISSION_GRANTED; } pi.requestedPermissionsFlags[i] = permissionFlags; pi.usesPermissions[i] = new UsesPermissionInfo(info, permissionFlags); } } } Loading Loading @@ -2114,12 +2119,12 @@ public class PackageParser { return null; } } else if (tagName.equals(TAG_USES_PERMISSION)) { if (!parseUsesPermission(pkg, res, parser)) { if (!parseUsesPermission(pkg, res, parser, outError)) { return null; } } else if (tagName.equals(TAG_USES_PERMISSION_SDK_M) || tagName.equals(TAG_USES_PERMISSION_SDK_23)) { if (!parseUsesPermission(pkg, res, parser)) { if (!parseUsesPermission(pkg, res, parser, outError)) { return null; } } else if (tagName.equals(TAG_USES_CONFIGURATION)) { Loading Loading @@ -2442,7 +2447,7 @@ public class PackageParser { newPermsMsg.append(' '); } newPermsMsg.append(npi.name); pkg.requestedPermissions.add(npi.name); addRequestedPermission(pkg, npi.name); pkg.implicitPermissions.add(npi.name); } } Loading @@ -2463,7 +2468,7 @@ public class PackageParser { for (int in = 0; in < newPerms.size(); in++) { final String perm = newPerms.get(in); if (!pkg.requestedPermissions.contains(perm)) { pkg.requestedPermissions.add(perm); addRequestedPermission(pkg, perm); pkg.implicitPermissions.add(perm); } } Loading Loading @@ -2543,13 +2548,13 @@ public class PackageParser { } } else { if (FORCE_AUDIO_PACKAGES.contains(pkg.packageName)) { pkg.requestedPermissions.add(android.Manifest.permission.READ_MEDIA_AUDIO); addRequestedPermission(pkg, android.Manifest.permission.READ_MEDIA_AUDIO); } if (FORCE_VIDEO_PACKAGES.contains(pkg.packageName)) { pkg.requestedPermissions.add(android.Manifest.permission.READ_MEDIA_VIDEO); addRequestedPermission(pkg, android.Manifest.permission.READ_MEDIA_VIDEO); } if (FORCE_IMAGES_PACKAGES.contains(pkg.packageName)) { pkg.requestedPermissions.add(android.Manifest.permission.READ_MEDIA_IMAGES); addRequestedPermission(pkg, android.Manifest.permission.READ_MEDIA_IMAGES); } } Loading Loading @@ -2588,6 +2593,14 @@ public class PackageParser { } } /** * Helper method for adding a requested permission to a package outside of a uses-permission. */ private void addRequestedPermission(Package pkg, String permission) { pkg.requestedPermissions.add(permission); pkg.usesPermissionInfos.add(new UsesPermissionInfo(permission)); } /** * Computes the targetSdkVersion to use at runtime. If the package is not * compatible with this platform, populates {@code outError[0]} with an Loading Loading @@ -2845,8 +2858,8 @@ public class PackageParser { return certSha256Digests; } private boolean parseUsesPermission(Package pkg, Resources res, XmlResourceParser parser) throws XmlPullParserException, IOException { private boolean parseUsesPermission(Package pkg, Resources res, XmlResourceParser parser, String[] outError) throws XmlPullParserException, IOException { TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestUsesPermission); Loading @@ -2870,6 +2883,44 @@ public class PackageParser { final String requiredNotfeature = sa.getNonConfigurationString( com.android.internal.R.styleable.AndroidManifestUsesPermission_requiredNotFeature, 0); int dataSentOffDevice = sa.getInt( com.android.internal.R.styleable.AndroidManifestUsesPermission_dataSentOffDevice, 0); int dataSharedWithThirdParty = sa.getInt( com.android.internal.R.styleable.AndroidManifestUsesPermission_dataSharedWithThirdParty, 0); int dataUsedForMonetization = sa.getInt( com.android.internal.R.styleable.AndroidManifestUsesPermission_dataUsedForMonetization, 0); int retentionWeeks = -1; int retention; String rawRetention = sa.getString( com.android.internal.R.styleable.AndroidManifestUsesPermission_dataRetentionTime); if (rawRetention == null) { retention = UsesPermissionInfo.RETENTION_UNDEFINED; } else if ("notRetained".equals(rawRetention)) { retention = UsesPermissionInfo.RETENTION_NOT_RETAINED; } else if ("userSelected".equals(rawRetention)) { retention = UsesPermissionInfo.RETENTION_USER_SELECTED; } else if ("unlimited".equals(rawRetention)) { retention = UsesPermissionInfo.RETENTION_UNLIMITED; } else { // A number of weeks was specified retention = UsesPermissionInfo.RETENTION_SPECIFIED; retentionWeeks = sa.getInt( com.android.internal.R.styleable.AndroidManifestUsesPermission_dataRetentionTime, -1); if (retentionWeeks < 0) { outError[0] = "Bad value provided for dataRetentionTime."; mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; XmlUtils.skipCurrentTag(parser); sa.recycle(); return false; } } sa.recycle(); XmlUtils.skipCurrentTag(parser); Loading Loading @@ -2902,6 +2953,10 @@ public class PackageParser { + parser.getPositionDescription()); } UsesPermissionInfo info = new UsesPermissionInfo(name, dataSentOffDevice, dataSharedWithThirdParty, dataUsedForMonetization, retention, retentionWeeks); pkg.usesPermissionInfos.add(info); return true; } Loading Loading @@ -3236,6 +3291,10 @@ public class PackageParser { perm.info.flags = sa.getInt( com.android.internal.R.styleable.AndroidManifestPermission_permissionFlags, 0); perm.info.usageInfoRequired = sa.getInt( com.android.internal.R.styleable.AndroidManifestPermission_usageInfoRequired, 0) != 0; sa.recycle(); if (perm.info.protectionLevel == -1) { Loading Loading @@ -6370,6 +6429,9 @@ public class PackageParser { @UnsupportedAppUsage public final ArrayList<String> requestedPermissions = new ArrayList<String>(); public final ArrayList<UsesPermissionInfo> usesPermissionInfos = new ArrayList<>(); /** Permissions requested but not in the manifest. */ public final ArrayList<String> implicitPermissions = new ArrayList<>(); Loading Loading @@ -6900,6 +6962,7 @@ public class PackageParser { dest.readStringList(requestedPermissions); internStringArrayList(requestedPermissions); dest.readParcelableList(usesPermissionInfos, boot); dest.readStringList(implicitPermissions); internStringArrayList(implicitPermissions); protectedBroadcasts = dest.createStringArrayList(); Loading Loading @@ -7066,6 +7129,7 @@ public class PackageParser { dest.writeParcelableList(instrumentation, flags); dest.writeStringList(requestedPermissions); dest.writeParcelableList(usesPermissionInfos, flags); dest.writeStringList(implicitPermissions); dest.writeStringList(protectedBroadcasts); Loading core/java/android/content/pm/PermissionInfo.java +10 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.annotation.IntDef; import android.annotation.SystemApi; import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; import android.os.Build; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; Loading Loading @@ -308,6 +309,12 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { */ public CharSequence nonLocalizedDescription; /** * If {@code true} an application targeting {@link Build.VERSION_CODES.Q} <em>must</em> * include permission data usage information in order to be able to be granted this permission. */ public boolean usageInfoRequired; /** @hide */ public static int fixProtectionLevel(int level) { if (level == PROTECTION_SIGNATURE_OR_SYSTEM) { Loading Loading @@ -394,6 +401,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { descriptionRes = orig.descriptionRes; requestRes = orig.requestRes; nonLocalizedDescription = orig.nonLocalizedDescription; usageInfoRequired = orig.usageInfoRequired; } /** Loading Loading @@ -458,6 +466,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { dest.writeInt(descriptionRes); dest.writeInt(requestRes); TextUtils.writeToParcel(nonLocalizedDescription, dest, parcelableFlags); dest.writeInt(usageInfoRequired ? 1 : 0); } /** @hide */ Loading Loading @@ -498,5 +507,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { descriptionRes = source.readInt(); requestRes = source.readInt(); nonLocalizedDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); usageInfoRequired = source.readInt() != 0; } } core/java/android/content/pm/UsesPermissionInfo.java 0 → 100644 +274 −0 File added.Preview size limit exceeded, changes collapsed. Show changes Loading
api/current.txt +31 −2 Original line number Diff line number Diff line Loading @@ -480,6 +480,10 @@ package android { field public static final int dashGap = 16843175; // 0x10101a7 field public static final int dashWidth = 16843174; // 0x10101a6 field public static final int data = 16842798; // 0x101002e field public static final int dataRetentionTime = 16844189; // 0x101059d field public static final int dataSentOffDevice = 16844186; // 0x101059a field public static final int dataSharedWithThirdParty = 16844187; // 0x101059b field public static final int dataUsedForMonetization = 16844188; // 0x101059c field public static final int datePickerDialogTheme = 16843948; // 0x10104ac field public static final int datePickerMode = 16843955; // 0x10104b3 field public static final int datePickerStyle = 16843612; // 0x101035c Loading Loading @@ -1496,6 +1500,7 @@ package android { field public static final deprecated int unfocusedMonthDateColor = 16843588; // 0x1010344 field public static final int unselectedAlpha = 16843278; // 0x101020e field public static final int updatePeriodMillis = 16843344; // 0x1010250 field public static final int usageInfoRequired = 16844185; // 0x1010599 field public static final int use32bitAbi = 16844053; // 0x1010515 field public static final int useAppZygote = 16844184; // 0x1010598 field public static final int useDefaultMargins = 16843641; // 0x1010379 Loading Loading @@ -11173,8 +11178,8 @@ package android.content.pm { field public android.content.pm.ProviderInfo[] providers; field public android.content.pm.ActivityInfo[] receivers; field public android.content.pm.FeatureInfo[] reqFeatures; field public java.lang.String[] requestedPermissions; field public int[] requestedPermissionsFlags; field public deprecated java.lang.String[] requestedPermissions; field public deprecated int[] requestedPermissionsFlags; field public android.content.pm.ServiceInfo[] services; field public java.lang.String sharedUserId; field public int sharedUserLabel; Loading @@ -11182,6 +11187,7 @@ package android.content.pm { field public android.content.pm.SigningInfo signingInfo; field public java.lang.String[] splitNames; field public int[] splitRevisionCodes; field public android.content.pm.UsesPermissionInfo[] usesPermissions; field public deprecated int versionCode; field public java.lang.String versionName; } Loading Loading @@ -11657,6 +11663,7 @@ package android.content.pm { field public java.lang.String group; field public java.lang.CharSequence nonLocalizedDescription; field public deprecated int protectionLevel; field public boolean usageInfoRequired; } public final class ProviderInfo extends android.content.pm.ComponentInfo implements android.os.Parcelable { Loading Loading @@ -11836,6 +11843,28 @@ package android.content.pm { field public static final android.os.Parcelable.Creator<android.content.pm.SigningInfo> CREATOR; } public final class UsesPermissionInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable { method public int describeContents(); method public int getDataRetention(); method public int getDataRetentionWeeks(); method public int getDataSentOffDevice(); method public int getDataSharedWithThirdParty(); method public int getDataUsedForMonetization(); method public int getFlags(); method public java.lang.String getPermission(); field public static final android.os.Parcelable.Creator<android.content.pm.UsesPermissionInfo> CREATOR; field public static final int FLAG_REQUESTED_PERMISSION_GRANTED = 2; // 0x2 field public static final int RETENTION_NOT_RETAINED = 1; // 0x1 field public static final int RETENTION_SPECIFIED = 4; // 0x4 field public static final int RETENTION_UNDEFINED = 0; // 0x0 field public static final int RETENTION_UNLIMITED = 3; // 0x3 field public static final int RETENTION_USER_SELECTED = 2; // 0x2 field public static final int USAGE_NO = 3; // 0x3 field public static final int USAGE_UNDEFINED = 0; // 0x0 field public static final int USAGE_USER_TRIGGERED = 2; // 0x2 field public static final int USAGE_YES = 1; // 0x1 } public final class VersionedPackage implements android.os.Parcelable { ctor public VersionedPackage(java.lang.String, int); ctor public VersionedPackage(java.lang.String, long);
core/java/android/content/pm/PackageInfo.java +21 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ import android.apex.ApexInfo; import android.os.Parcel; import android.os.Parcelable; import java.util.ArrayList; import java.util.List; /** * Overall information about the contents of a package. This corresponds * to all of the information collected from AndroidManifest.xml. Loading Loading @@ -204,7 +207,10 @@ public class PackageInfo implements Parcelable { * {@link PackageManager#GET_PERMISSIONS} was set. This list includes * all permissions requested, even those that were not granted or known * by the system at install time. * * @deprecated Use {@link #usesPermissions} */ @Deprecated public String[] requestedPermissions; /** Loading @@ -214,9 +220,22 @@ public class PackageInfo implements Parcelable { * {@link PackageManager#GET_PERMISSIONS} was set. Each value matches * the corresponding entry in {@link #requestedPermissions}, and will have * the flag {@link #REQUESTED_PERMISSION_GRANTED} set as appropriate. * * @deprecated Use {@link #usesPermissions} */ @Deprecated public int[] requestedPermissionsFlags; /** * Array of all {@link android.R.styleable#AndroidManifestUsesPermission * <uses-permission>} tags included under <manifest>, * or null if there were none. This is only filled in if the flag * {@link PackageManager#GET_PERMISSIONS} was set. This list includes * all permissions requested, even those that were not granted or known * by the system at install time. */ public UsesPermissionInfo[] usesPermissions; /** * Flag for {@link #requestedPermissionsFlags}: the requested permission * is required for the application to run; the user can not optionally Loading Loading @@ -456,6 +475,7 @@ public class PackageInfo implements Parcelable { dest.writeTypedArray(permissions, parcelableFlags); dest.writeStringArray(requestedPermissions); dest.writeIntArray(requestedPermissionsFlags); dest.writeTypedArray(usesPermissions, parcelableFlags); dest.writeTypedArray(signatures, parcelableFlags); dest.writeTypedArray(configPreferences, parcelableFlags); dest.writeTypedArray(reqFeatures, parcelableFlags); Loading Loading @@ -520,6 +540,7 @@ public class PackageInfo implements Parcelable { permissions = source.createTypedArray(PermissionInfo.CREATOR); requestedPermissions = source.createStringArray(); requestedPermissionsFlags = source.createIntArray(); usesPermissions = source.createTypedArray(UsesPermissionInfo.CREATOR); signatures = source.createTypedArray(Signature.CREATOR); configPreferences = source.createTypedArray(ConfigurationInfo.CREATOR); reqFeatures = source.createTypedArray(FeatureInfo.CREATOR); Loading
core/java/android/content/pm/PackageParser.java +77 −13 Original line number Diff line number Diff line Loading @@ -785,18 +785,23 @@ public class PackageParser { pi.permissions[i] = generatePermissionInfo(p.permissions.get(i), flags); } } N = p.requestedPermissions.size(); N = p.usesPermissionInfos.size(); if (N > 0) { pi.requestedPermissions = new String[N]; pi.requestedPermissionsFlags = new int[N]; pi.usesPermissions = new UsesPermissionInfo[N]; for (int i=0; i<N; i++) { final String perm = p.requestedPermissions.get(i); UsesPermissionInfo info = p.usesPermissionInfos.get(i); final String perm = info.getPermission(); pi.requestedPermissions[i] = perm; int permissionFlags = 0; // The notion of required permissions is deprecated but for compatibility. pi.requestedPermissionsFlags[i] |= PackageInfo.REQUESTED_PERMISSION_REQUIRED; permissionFlags |= PackageInfo.REQUESTED_PERMISSION_REQUIRED; if (grantedPermissions != null && grantedPermissions.contains(perm)) { pi.requestedPermissionsFlags[i] |= PackageInfo.REQUESTED_PERMISSION_GRANTED; permissionFlags |= PackageInfo.REQUESTED_PERMISSION_GRANTED; } pi.requestedPermissionsFlags[i] = permissionFlags; pi.usesPermissions[i] = new UsesPermissionInfo(info, permissionFlags); } } } Loading Loading @@ -2114,12 +2119,12 @@ public class PackageParser { return null; } } else if (tagName.equals(TAG_USES_PERMISSION)) { if (!parseUsesPermission(pkg, res, parser)) { if (!parseUsesPermission(pkg, res, parser, outError)) { return null; } } else if (tagName.equals(TAG_USES_PERMISSION_SDK_M) || tagName.equals(TAG_USES_PERMISSION_SDK_23)) { if (!parseUsesPermission(pkg, res, parser)) { if (!parseUsesPermission(pkg, res, parser, outError)) { return null; } } else if (tagName.equals(TAG_USES_CONFIGURATION)) { Loading Loading @@ -2442,7 +2447,7 @@ public class PackageParser { newPermsMsg.append(' '); } newPermsMsg.append(npi.name); pkg.requestedPermissions.add(npi.name); addRequestedPermission(pkg, npi.name); pkg.implicitPermissions.add(npi.name); } } Loading @@ -2463,7 +2468,7 @@ public class PackageParser { for (int in = 0; in < newPerms.size(); in++) { final String perm = newPerms.get(in); if (!pkg.requestedPermissions.contains(perm)) { pkg.requestedPermissions.add(perm); addRequestedPermission(pkg, perm); pkg.implicitPermissions.add(perm); } } Loading Loading @@ -2543,13 +2548,13 @@ public class PackageParser { } } else { if (FORCE_AUDIO_PACKAGES.contains(pkg.packageName)) { pkg.requestedPermissions.add(android.Manifest.permission.READ_MEDIA_AUDIO); addRequestedPermission(pkg, android.Manifest.permission.READ_MEDIA_AUDIO); } if (FORCE_VIDEO_PACKAGES.contains(pkg.packageName)) { pkg.requestedPermissions.add(android.Manifest.permission.READ_MEDIA_VIDEO); addRequestedPermission(pkg, android.Manifest.permission.READ_MEDIA_VIDEO); } if (FORCE_IMAGES_PACKAGES.contains(pkg.packageName)) { pkg.requestedPermissions.add(android.Manifest.permission.READ_MEDIA_IMAGES); addRequestedPermission(pkg, android.Manifest.permission.READ_MEDIA_IMAGES); } } Loading Loading @@ -2588,6 +2593,14 @@ public class PackageParser { } } /** * Helper method for adding a requested permission to a package outside of a uses-permission. */ private void addRequestedPermission(Package pkg, String permission) { pkg.requestedPermissions.add(permission); pkg.usesPermissionInfos.add(new UsesPermissionInfo(permission)); } /** * Computes the targetSdkVersion to use at runtime. If the package is not * compatible with this platform, populates {@code outError[0]} with an Loading Loading @@ -2845,8 +2858,8 @@ public class PackageParser { return certSha256Digests; } private boolean parseUsesPermission(Package pkg, Resources res, XmlResourceParser parser) throws XmlPullParserException, IOException { private boolean parseUsesPermission(Package pkg, Resources res, XmlResourceParser parser, String[] outError) throws XmlPullParserException, IOException { TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestUsesPermission); Loading @@ -2870,6 +2883,44 @@ public class PackageParser { final String requiredNotfeature = sa.getNonConfigurationString( com.android.internal.R.styleable.AndroidManifestUsesPermission_requiredNotFeature, 0); int dataSentOffDevice = sa.getInt( com.android.internal.R.styleable.AndroidManifestUsesPermission_dataSentOffDevice, 0); int dataSharedWithThirdParty = sa.getInt( com.android.internal.R.styleable.AndroidManifestUsesPermission_dataSharedWithThirdParty, 0); int dataUsedForMonetization = sa.getInt( com.android.internal.R.styleable.AndroidManifestUsesPermission_dataUsedForMonetization, 0); int retentionWeeks = -1; int retention; String rawRetention = sa.getString( com.android.internal.R.styleable.AndroidManifestUsesPermission_dataRetentionTime); if (rawRetention == null) { retention = UsesPermissionInfo.RETENTION_UNDEFINED; } else if ("notRetained".equals(rawRetention)) { retention = UsesPermissionInfo.RETENTION_NOT_RETAINED; } else if ("userSelected".equals(rawRetention)) { retention = UsesPermissionInfo.RETENTION_USER_SELECTED; } else if ("unlimited".equals(rawRetention)) { retention = UsesPermissionInfo.RETENTION_UNLIMITED; } else { // A number of weeks was specified retention = UsesPermissionInfo.RETENTION_SPECIFIED; retentionWeeks = sa.getInt( com.android.internal.R.styleable.AndroidManifestUsesPermission_dataRetentionTime, -1); if (retentionWeeks < 0) { outError[0] = "Bad value provided for dataRetentionTime."; mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; XmlUtils.skipCurrentTag(parser); sa.recycle(); return false; } } sa.recycle(); XmlUtils.skipCurrentTag(parser); Loading Loading @@ -2902,6 +2953,10 @@ public class PackageParser { + parser.getPositionDescription()); } UsesPermissionInfo info = new UsesPermissionInfo(name, dataSentOffDevice, dataSharedWithThirdParty, dataUsedForMonetization, retention, retentionWeeks); pkg.usesPermissionInfos.add(info); return true; } Loading Loading @@ -3236,6 +3291,10 @@ public class PackageParser { perm.info.flags = sa.getInt( com.android.internal.R.styleable.AndroidManifestPermission_permissionFlags, 0); perm.info.usageInfoRequired = sa.getInt( com.android.internal.R.styleable.AndroidManifestPermission_usageInfoRequired, 0) != 0; sa.recycle(); if (perm.info.protectionLevel == -1) { Loading Loading @@ -6370,6 +6429,9 @@ public class PackageParser { @UnsupportedAppUsage public final ArrayList<String> requestedPermissions = new ArrayList<String>(); public final ArrayList<UsesPermissionInfo> usesPermissionInfos = new ArrayList<>(); /** Permissions requested but not in the manifest. */ public final ArrayList<String> implicitPermissions = new ArrayList<>(); Loading Loading @@ -6900,6 +6962,7 @@ public class PackageParser { dest.readStringList(requestedPermissions); internStringArrayList(requestedPermissions); dest.readParcelableList(usesPermissionInfos, boot); dest.readStringList(implicitPermissions); internStringArrayList(implicitPermissions); protectedBroadcasts = dest.createStringArrayList(); Loading Loading @@ -7066,6 +7129,7 @@ public class PackageParser { dest.writeParcelableList(instrumentation, flags); dest.writeStringList(requestedPermissions); dest.writeParcelableList(usesPermissionInfos, flags); dest.writeStringList(implicitPermissions); dest.writeStringList(protectedBroadcasts); Loading
core/java/android/content/pm/PermissionInfo.java +10 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.annotation.IntDef; import android.annotation.SystemApi; import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; import android.os.Build; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; Loading Loading @@ -308,6 +309,12 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { */ public CharSequence nonLocalizedDescription; /** * If {@code true} an application targeting {@link Build.VERSION_CODES.Q} <em>must</em> * include permission data usage information in order to be able to be granted this permission. */ public boolean usageInfoRequired; /** @hide */ public static int fixProtectionLevel(int level) { if (level == PROTECTION_SIGNATURE_OR_SYSTEM) { Loading Loading @@ -394,6 +401,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { descriptionRes = orig.descriptionRes; requestRes = orig.requestRes; nonLocalizedDescription = orig.nonLocalizedDescription; usageInfoRequired = orig.usageInfoRequired; } /** Loading Loading @@ -458,6 +466,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { dest.writeInt(descriptionRes); dest.writeInt(requestRes); TextUtils.writeToParcel(nonLocalizedDescription, dest, parcelableFlags); dest.writeInt(usageInfoRequired ? 1 : 0); } /** @hide */ Loading Loading @@ -498,5 +507,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { descriptionRes = source.readInt(); requestRes = source.readInt(); nonLocalizedDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); usageInfoRequired = source.readInt() != 0; } }
core/java/android/content/pm/UsesPermissionInfo.java 0 → 100644 +274 −0 File added.Preview size limit exceeded, changes collapsed. Show changes