From 96fb932666539e2b3be26ef91eb248a9ace5678e Mon Sep 17 00:00:00 2001 From: Fyodor Kupolov Date: Mon, 1 Dec 2014 15:08:09 -0800 Subject: [PATCH] Added isRemovingAdmin method Added isRemovingAdmin method, so that clients can query if device admin is currently being removed. Bug: 17609838 Change-Id: I82547a9eeb228fcf8ac2a6e639ca1a75fa41d161 --- .../app/admin/DevicePolicyManager.java | 16 ++++++++++++ .../app/admin/IDevicePolicyManager.aidl | 2 ++ .../DevicePolicyManagerService.java | 25 +++++++++++++++++-- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 47530997eb6e2..ead89b302ecd2 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -504,6 +504,22 @@ public class DevicePolicyManager { } return false; } + /** + * Return true if the given administrator component is currently being removed + * for the user. + * @hide + */ + public boolean isRemovingAdmin(ComponentName who, int userId) { + if (mService != null) { + try { + return mService.isRemovingAdmin(who, userId); + } catch (RemoteException e) { + Log.w(TAG, "Failed talking with device policy service", e); + } + } + return false; + } + /** * Return a list of all currently active device administrator's component diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index d144ae846c188..0ca60c0065759 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -196,4 +196,6 @@ interface IDevicePolicyManager { void setAutoTimeRequired(in ComponentName who, int userHandle, boolean required); boolean getAutoTimeRequired(); + + boolean isRemovingAdmin(in ComponentName adminReceiver, int userHandle); } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 2201d2b7c306a..5e63cad611ab9 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -120,7 +120,6 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; -import java.security.cert.CertificateEncodingException; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; @@ -265,6 +264,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { = new HashMap(); final ArrayList mAdminList = new ArrayList(); + final ArrayList mRemovingAdmins + = new ArrayList(); // This is the list of component allowed to start lock task mode. final List mLockTaskPackages = new ArrayList(); @@ -1202,6 +1203,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { void removeActiveAdminLocked(final ComponentName adminReceiver, int userHandle) { final ActiveAdmin admin = getActiveAdminUncheckedLocked(adminReceiver, userHandle); if (admin != null) { + synchronized (this) { + getUserData(userHandle).mRemovingAdmins.add(adminReceiver); + } sendAdminCommandLocked(admin, DeviceAdminReceiver.ACTION_DEVICE_ADMIN_DISABLED, new BroadcastReceiver() { @@ -1221,9 +1225,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } saveSettingsLocked(userHandle); updateMaximumTimeToLockLocked(policy); + policy.mRemovingAdmins.remove(adminReceiver); } } - }); + }); } } @@ -1788,6 +1793,18 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } + @Override + public boolean isRemovingAdmin(ComponentName adminReceiver, int userHandle) { + if (!mHasFeature) { + return false; + } + enforceCrossUserPermission(userHandle); + synchronized (this) { + DevicePolicyData policyData = getUserData(userHandle); + return policyData.mRemovingAdmins.contains(adminReceiver); + } + } + public boolean hasGrantedPolicy(ComponentName adminReceiver, int policyId, int userHandle) { if (!mHasFeature) { return false; @@ -4091,6 +4108,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { ap.dump(" ", pw); } } + if (!policy.mRemovingAdmins.isEmpty()) { + p.println(" Removing Device Admins (User " + policy.mUserHandle + "): " + + policy.mRemovingAdmins); + } pw.println(" "); pw.print(" mPasswordOwner="); pw.println(policy.mPasswordOwner);