From 5f303659c23d7d0a944aa51edb9b3353da1d497d Mon Sep 17 00:00:00 2001 From: Varun Shah Date: Fri, 16 Nov 2018 18:11:19 -0800 Subject: [PATCH] Added a new "wellbeing" protection flag. Permissions that have the new wellbeing protection flag will be granted to the wellbeing app, as defined by the OEM in the system resource. The ACCESS_INSTANT_APPS permission is updated to use the wellbeing flag. The SUSPEND_APPS permission will also follow the same model now. Bug: 119330345 Test: atest CtsPermission2TestCases:PermissionPolicyTest Test: atest com.android.server.pm.SuspendPackagesTest Test: atest com.google.android.suspendapps.permissionpolicy.gts.SuspendAppsPermissionPolicyTest Change-Id: Iffedc7704824292be48a4ef198fff97c1e5c39da --- api/system-current.txt | 3 +++ api/test-current.txt | 1 + .../android/app/ApplicationPackageManager.java | 9 +++++++++ core/java/android/content/pm/IPackageManager.aidl | 2 ++ core/java/android/content/pm/PackageManager.java | 11 +++++++++++ .../content/pm/PackageManagerInternal.java | 2 ++ core/java/android/content/pm/PermissionInfo.java | 15 +++++++++++++++ core/res/AndroidManifest.xml | 8 ++++---- core/res/res/values/attrs_manifest.xml | 3 +++ core/res/res/values/config.xml | 7 +++++++ core/res/res/values/symbols.xml | 1 + .../android/server/pm/PackageManagerService.java | 10 ++++++++++ .../server/pm/permission/BasePermission.java | 3 +++ .../pm/permission/PermissionManagerService.java | 6 ++++++ 14 files changed, 77 insertions(+), 4 deletions(-) diff --git a/api/system-current.txt b/api/system-current.txt index 57b7eed0b4dac..cb3840d6eb39f 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -7,6 +7,7 @@ package android { field public static final java.lang.String ACCESS_CHECKIN_PROPERTIES = "android.permission.ACCESS_CHECKIN_PROPERTIES"; field public static final java.lang.String ACCESS_DRM_CERTIFICATES = "android.permission.ACCESS_DRM_CERTIFICATES"; field public static final deprecated java.lang.String ACCESS_FM_RADIO = "android.permission.ACCESS_FM_RADIO"; + field public static final java.lang.String ACCESS_INSTANT_APPS = "android.permission.ACCESS_INSTANT_APPS"; field public static final java.lang.String ACCESS_MOCK_LOCATION = "android.permission.ACCESS_MOCK_LOCATION"; field public static final java.lang.String ACCESS_MTP = "android.permission.ACCESS_MTP"; field public static final java.lang.String ACCESS_NETWORK_CONDITIONS = "android.permission.ACCESS_NETWORK_CONDITIONS"; @@ -1246,6 +1247,7 @@ package android.content.pm { method public abstract java.util.List getIntentFilterVerifications(java.lang.String); method public abstract int getIntentVerificationStatusAsUser(java.lang.String, int); method public abstract int getPermissionFlags(java.lang.String, java.lang.String, android.os.UserHandle); + method public java.lang.String getWellbeingPackageName(); method public abstract void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle); method public abstract int installExistingPackage(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException; method public abstract int installExistingPackage(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; @@ -1348,6 +1350,7 @@ package android.content.pm { field public static final int FLAG_REMOVED = 2; // 0x2 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 java.lang.String backgroundPermission; field public int requestRes; } diff --git a/api/test-current.txt b/api/test-current.txt index 46cbb52f6efa4..e4e59d53d18d2 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -353,6 +353,7 @@ package android.content.pm { public class PermissionInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable { 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 java.lang.String backgroundPermission; } diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 7312b2c8163e0..67d9ad6e93c6e 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -2973,6 +2973,15 @@ public class ApplicationPackageManager extends PackageManager { } } + @Override + public String getWellbeingPackageName() { + try { + return mPM.getWellbeingPackageName(); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } + @Override public boolean isPackageStateProtected(String packageName, int userId) { try { diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index dbea821fab2b1..eea2b8873fe78 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -675,6 +675,8 @@ interface IPackageManager { String getSystemTextClassifierPackageName(); + String getWellbeingPackageName(); + boolean isPackageStateProtected(String packageName, int userId); void sendDeviceCustomizationReadyBroadcast(); diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index b7df2bf5a5f7b..2c78384eb2446 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -6423,6 +6423,17 @@ public abstract class PackageManager { "getSystemTextClassifierPackageName not implemented in subclass"); } + /** + * @return the wellbeing app package name, or null if it's not defined by the OEM. + * + * @hide + */ + @SystemApi + public String getWellbeingPackageName() { + throw new UnsupportedOperationException( + "getWellbeingPackageName not implemented in subclass"); + } + /** * @return whether a given package's state is protected, e.g. package cannot be disabled, * suspended, hidden or force stopped. diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index b49c4476e82de..43c02228499ec 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -53,6 +53,7 @@ public abstract class PackageManagerInternal { public static final int PACKAGE_BROWSER = 4; public static final int PACKAGE_SYSTEM_TEXT_CLASSIFIER = 5; public static final int PACKAGE_PERMISSION_CONTROLLER = 6; + public static final int PACKAGE_WELLBEING = 7; @IntDef(value = { PACKAGE_SYSTEM, PACKAGE_SETUP_WIZARD, @@ -61,6 +62,7 @@ public abstract class PackageManagerInternal { PACKAGE_BROWSER, PACKAGE_SYSTEM_TEXT_CLASSIFIER, PACKAGE_PERMISSION_CONTROLLER, + PACKAGE_WELLBEING, }) @Retention(RetentionPolicy.SOURCE) public @interface KnownPackage {} diff --git a/core/java/android/content/pm/PermissionInfo.java b/core/java/android/content/pm/PermissionInfo.java index d9d6b5f87eace..20997d6c0d119 100644 --- a/core/java/android/content/pm/PermissionInfo.java +++ b/core/java/android/content/pm/PermissionInfo.java @@ -181,6 +181,17 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { @TestApi public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 0x10000; + /** + * Additional flag for {${link #protectionLevel}, corresponding + * to the wellbeing value of + * {@link android.R.attr#protectionLevel}. + * + * @hide + */ + @SystemApi + @TestApi + public static final int PROTECTION_FLAG_WELLBEING = 0x20000; + /** @hide */ @IntDef(flag = true, prefix = { "PROTECTION_FLAG_" }, value = { PROTECTION_FLAG_PRIVILEGED, @@ -197,6 +208,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { PROTECTION_FLAG_OEM, PROTECTION_FLAG_VENDOR_PRIVILEGED, PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER, + PROTECTION_FLAG_WELLBEING, }) @Retention(RetentionPolicy.SOURCE) public @interface ProtectionFlags {} @@ -386,6 +398,9 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { if ((level & PermissionInfo.PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER) != 0) { protLevel += "|textClassifier"; } + if ((level & PermissionInfo.PROTECTION_FLAG_WELLBEING) != 0) { + protLevel += "|wellbeing"; + } return protLevel; } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 594ae6b2f3339..ed37533247994 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1648,7 +1648,7 @@ @hide --> + android:protectionLevel="signature|wellbeing" /> - + + android:protectionLevel="signature|installer|verifier|wellbeing" /> + + diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 62ec5c474297d..101f92b2097c9 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3349,6 +3349,13 @@ See android.view.textclassifier.TextClassificationManager. --> + + +