Merge "Added a new "wellbeing" protection flag."

This commit is contained in:
Varun Shah
2018-12-10 22:46:14 +00:00
committed by Android (Google) Code Review
14 changed files with 77 additions and 4 deletions

View File

@@ -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";
@@ -1252,6 +1253,7 @@ package android.content.pm {
method public abstract java.util.List<android.content.pm.IntentFilterVerificationInfo> 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;
@@ -1354,6 +1356,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;
}

View File

@@ -374,6 +374,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;
}

View File

@@ -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 {

View File

@@ -675,6 +675,8 @@ interface IPackageManager {
String getSystemTextClassifierPackageName();
String getWellbeingPackageName();
boolean isPackageStateProtected(String packageName, int userId);
void sendDeviceCustomizationReadyBroadcast();

View File

@@ -6433,6 +6433,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.

View File

@@ -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 {}

View File

@@ -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 <code>wellbeing</code> 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;
}

View File

@@ -1648,7 +1648,7 @@
@hide
-->
<permission android:name="android.permission.SUSPEND_APPS"
android:protectionLevel="signature|privileged" />
android:protectionLevel="signature|wellbeing" />
<!-- Allows applications to discover and pair bluetooth devices.
<p>Protection level: normal
@@ -4086,10 +4086,10 @@
confirmation UI for full backup/restore -->
<uses-permission android:name="android.permission.CONFIRM_FULL_BACKUP"/>
<!-- Allows the holder to access and manage instant applications on the device.
@hide -->
<!-- @SystemApi Allows the holder to access and manage instant applications on the device.
@hide -->
<permission android:name="android.permission.ACCESS_INSTANT_APPS"
android:protectionLevel="signature|installer|verifier" />
android:protectionLevel="signature|installer|verifier|wellbeing" />
<uses-permission android:name="android.permission.ACCESS_INSTANT_APPS"/>
<!-- Allows the holder to view the instant applications on the device.

View File

@@ -268,6 +268,9 @@
<!-- Additional flag from base permission type: this permission can be automatically
granted to the system default text classifier -->
<flag name="textClassifier" value="0x10000" />
<!-- Additional flag from base permission type: this permission will be granted to the
wellbeing app, as defined by the OEM. -->
<flag name="wellbeing" value="0x20000" />
</attr>
<!-- Flags indicating more context for a permission group. -->

View File

@@ -3349,6 +3349,13 @@
See android.view.textclassifier.TextClassificationManager.
-->
<string name="config_defaultTextClassifierPackage" translatable="false"></string>
<!-- The package name for the default wellbeing app.
This package must be trusted, as it has the permissions to control other applications
on the device.
Example: "com.android.wellbeing"
-->
<string name="config_defaultWellbeingPackage" translatable="false"></string>
<!-- The package name for the system's content capture service.
This service must be trusted, as it can be activated without explicit consent of the user.

View File

@@ -3265,6 +3265,7 @@
<java-symbol type="string" name="notification_channel_do_not_disturb" />
<java-symbol type="string" name="config_defaultAutofillService" />
<java-symbol type="string" name="config_defaultTextClassifierPackage" />
<java-symbol type="string" name="config_defaultWellbeingPackage" />
<java-symbol type="string" name="config_defaultContentCaptureService" />
<java-symbol type="string" name="config_defaultAugmentedAutofillService" />

View File

@@ -1301,6 +1301,7 @@ public class PackageManagerService extends IPackageManager.Stub
final @Nullable String mSetupWizardPackage;
final @Nullable String mStorageManagerPackage;
final @Nullable String mSystemTextClassifierPackage;
final @Nullable String mWellbeingPackage;
final @NonNull String mServicesSystemSharedLibraryPackageName;
final @NonNull String mSharedSystemSharedLibraryPackageName;
@@ -2790,6 +2791,8 @@ public class PackageManagerService extends IPackageManager.Stub
mSystemTextClassifierPackage = getSystemTextClassifierPackageName();
mWellbeingPackage = getWellbeingPackageName();
// Now that we know all of the shared libraries, update all clients to have
// the correct library paths.
updateAllSharedLibrariesLPw(null);
@@ -19563,6 +19566,11 @@ public class PackageManagerService extends IPackageManager.Stub
return mContext.getString(R.string.config_defaultTextClassifierPackage);
}
@Override
public String getWellbeingPackageName() {
return mContext.getString(R.string.config_defaultWellbeingPackage);
}
@Override
public void setApplicationEnabledSetting(String appPackageName,
int newState, int flags, int userId, String callingPackage) {
@@ -22719,6 +22727,8 @@ public class PackageManagerService extends IPackageManager.Stub
return mSystemTextClassifierPackage;
case PackageManagerInternal.PACKAGE_PERMISSION_CONTROLLER:
return mRequiredPermissionControllerPackage;
case PackageManagerInternal.PACKAGE_WELLBEING:
return mWellbeingPackage;
}
return null;
}

View File

@@ -235,6 +235,9 @@ public final class BasePermission {
return (protectionLevel & PermissionInfo.PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER)
!= 0;
}
public boolean isWellbeing() {
return (protectionLevel & PermissionInfo.PROTECTION_FLAG_WELLBEING) != 0;
}
public void transfer(@NonNull String origPackageName, @NonNull String newPackageName) {
if (!origPackageName.equals(sourcePackageName)) {

View File

@@ -1637,6 +1637,12 @@ public class PermissionManagerService {
// Special permissions for the system default text classifier.
allowed = true;
}
if (!allowed && bp.isWellbeing()
&& pkg.packageName.equals(mPackageManagerInt.getKnownPackageName(
PackageManagerInternal.PACKAGE_WELLBEING, UserHandle.USER_SYSTEM))) {
// Special permission granted only to the OEM specified wellbeing app
allowed = true;
}
}
return allowed;
}