Loading core/res/res/values/attrs_manifest.xml +5 −0 Original line number Diff line number Diff line Loading @@ -2175,6 +2175,11 @@ tag; often this is one of the {@link android.Manifest.permission standard system permissions}. --> <attr name="name" /> <!-- Optional: specify the minimum version of the Android OS for which the application wishes to request the permission. When running on a version of Android lower than the number given here, the permission will not be requested. --> <attr name="minSdkVersion" format="integer|string" /> <!-- Optional: specify the maximum version of the Android OS for which the application wishes to request the permission. When running on a version of Android higher than the number given here, the permission will not Loading services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java +21 −9 Original line number Diff line number Diff line Loading @@ -1256,6 +1256,18 @@ public class ParsingPackageUtils { return input.success(pkg.addPermission(result.getResult())); } private int parseMinOrMaxSdkVersion(TypedArray sa, int attr, int defaultValue) { int val = defaultValue; TypedValue peekVal = sa.peekValue(attr); if (peekVal != null) { if (peekVal.type >= TypedValue.TYPE_FIRST_INT && peekVal.type <= TypedValue.TYPE_LAST_INT) { val = peekVal.data; } } return val; } private ParseResult<ParsingPackage> parseUsesPermission(ParseInput input, ParsingPackage pkg, Resources res, XmlResourceParser parser) throws IOException, XmlPullParserException { Loading @@ -1266,14 +1278,13 @@ public class ParsingPackageUtils { String name = sa.getNonResourceString( R.styleable.AndroidManifestUsesPermission_name); int maxSdkVersion = 0; TypedValue val = sa.peekValue( R.styleable.AndroidManifestUsesPermission_maxSdkVersion); if (val != null) { if (val.type >= TypedValue.TYPE_FIRST_INT && val.type <= TypedValue.TYPE_LAST_INT) { maxSdkVersion = val.data; } } int minSdkVersion = parseMinOrMaxSdkVersion(sa, R.styleable.AndroidManifestUsesPermission_minSdkVersion, Integer.MIN_VALUE); int maxSdkVersion = parseMinOrMaxSdkVersion(sa, R.styleable.AndroidManifestUsesPermission_maxSdkVersion, Integer.MAX_VALUE); final ArraySet<String> requiredFeatures = new ArraySet<>(); String feature = sa.getNonConfigurationString( Loading Loading @@ -1338,7 +1349,8 @@ public class ParsingPackageUtils { return success; } if ((maxSdkVersion != 0) && (maxSdkVersion < Build.VERSION.RESOURCES_SDK_INT)) { if (Build.VERSION.RESOURCES_SDK_INT < minSdkVersion || Build.VERSION.RESOURCES_SDK_INT > maxSdkVersion) { return success; } Loading Loading
core/res/res/values/attrs_manifest.xml +5 −0 Original line number Diff line number Diff line Loading @@ -2175,6 +2175,11 @@ tag; often this is one of the {@link android.Manifest.permission standard system permissions}. --> <attr name="name" /> <!-- Optional: specify the minimum version of the Android OS for which the application wishes to request the permission. When running on a version of Android lower than the number given here, the permission will not be requested. --> <attr name="minSdkVersion" format="integer|string" /> <!-- Optional: specify the maximum version of the Android OS for which the application wishes to request the permission. When running on a version of Android higher than the number given here, the permission will not Loading
services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java +21 −9 Original line number Diff line number Diff line Loading @@ -1256,6 +1256,18 @@ public class ParsingPackageUtils { return input.success(pkg.addPermission(result.getResult())); } private int parseMinOrMaxSdkVersion(TypedArray sa, int attr, int defaultValue) { int val = defaultValue; TypedValue peekVal = sa.peekValue(attr); if (peekVal != null) { if (peekVal.type >= TypedValue.TYPE_FIRST_INT && peekVal.type <= TypedValue.TYPE_LAST_INT) { val = peekVal.data; } } return val; } private ParseResult<ParsingPackage> parseUsesPermission(ParseInput input, ParsingPackage pkg, Resources res, XmlResourceParser parser) throws IOException, XmlPullParserException { Loading @@ -1266,14 +1278,13 @@ public class ParsingPackageUtils { String name = sa.getNonResourceString( R.styleable.AndroidManifestUsesPermission_name); int maxSdkVersion = 0; TypedValue val = sa.peekValue( R.styleable.AndroidManifestUsesPermission_maxSdkVersion); if (val != null) { if (val.type >= TypedValue.TYPE_FIRST_INT && val.type <= TypedValue.TYPE_LAST_INT) { maxSdkVersion = val.data; } } int minSdkVersion = parseMinOrMaxSdkVersion(sa, R.styleable.AndroidManifestUsesPermission_minSdkVersion, Integer.MIN_VALUE); int maxSdkVersion = parseMinOrMaxSdkVersion(sa, R.styleable.AndroidManifestUsesPermission_maxSdkVersion, Integer.MAX_VALUE); final ArraySet<String> requiredFeatures = new ArraySet<>(); String feature = sa.getNonConfigurationString( Loading Loading @@ -1338,7 +1349,8 @@ public class ParsingPackageUtils { return success; } if ((maxSdkVersion != 0) && (maxSdkVersion < Build.VERSION.RESOURCES_SDK_INT)) { if (Build.VERSION.RESOURCES_SDK_INT < minSdkVersion || Build.VERSION.RESOURCES_SDK_INT > maxSdkVersion) { return success; } Loading