From fac4ddbd25e7ccaa763b9ac93ef1df5015b85628 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Mon, 28 Mar 2016 09:14:07 -0600 Subject: [PATCH] Work around buggy DMAgent. They're targeting new API level, but they aren't handling the new constants. Bug: 27785116 Change-Id: I8391294d963c86af1f948b91c7d1de6b7f44f66a --- .../DevicePolicyManagerService.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 7da0a9a391a59..d8b856b9b7539 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -4868,10 +4868,24 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { // we start using it for different purposes. ensureCallerPackage(callerPackage); + final ApplicationInfo ai; + try { + ai = mContext.getPackageManager().getApplicationInfo(callerPackage, 0); + } catch (NameNotFoundException e) { + throw new SecurityException(e); + } + + boolean legacyApp = false; + if (ai.targetSdkVersion <= Build.VERSION_CODES.M) { + legacyApp = true; + } else if ("com.google.android.apps.enterprise.dmagent".equals(ai.packageName) + && ai.versionCode == 697) { + // TODO: remove this once a new prebuilt is dropped + legacyApp = true; + } + final int rawStatus = getEncryptionStatus(); - if ((rawStatus == DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER) - && (callerPackage != null) - && (getTargetSdk(callerPackage, userHandle) <= VERSION_CODES.M)) { + if ((rawStatus == DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER) && legacyApp) { return DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE; } return rawStatus;