diff options
Diffstat (limited to 'services/java/com/android/server/DevicePolicyManagerService.java')
-rw-r--r-- | services/java/com/android/server/DevicePolicyManagerService.java | 62 |
1 files changed, 59 insertions, 3 deletions
diff --git a/services/java/com/android/server/DevicePolicyManagerService.java b/services/java/com/android/server/DevicePolicyManagerService.java index a267e0f..ac65aa9 100644 --- a/services/java/com/android/server/DevicePolicyManagerService.java +++ b/services/java/com/android/server/DevicePolicyManagerService.java @@ -17,6 +17,8 @@ package com.android.server; import com.android.common.FastXmlSerializer; +import com.android.common.XmlUtils; +import com.android.internal.content.PackageMonitor; import com.android.internal.widget.LockPatternUtils; import org.xmlpull.v1.XmlPullParser; @@ -34,6 +36,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.content.pm.PackageManager.NameNotFoundException; import android.os.Binder; import android.os.IBinder; import android.os.IPowerManager; @@ -58,9 +61,10 @@ import java.util.List; * Implementation of the device policy APIs. */ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { - private static final String TAG = "DevicePolicyManagerService"; + static final String TAG = "DevicePolicyManagerService"; - private final Context mContext; + final Context mContext; + final MyPackageMonitor mMonitor; IPowerManager mIPowerManager; @@ -89,6 +93,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { void writeToXml(XmlSerializer out) throws IllegalArgumentException, IllegalStateException, IOException { + out.startTag(null, "policies"); + info.writePoliciesToXml(out); + out.endTag(null, "policies"); if (passwordQuality != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { out.startTag(null, "password-quality"); out.attribute(null, "value", Integer.toString(passwordQuality)); @@ -121,7 +128,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { continue; } String tag = parser.getName(); - if ("password-quality".equals(tag)) { + if ("policies".equals(tag)) { + info.readPoliciesFromXml(parser); + } else if ("password-quality".equals(tag)) { passwordQuality = Integer.parseInt( parser.getAttributeValue(null, "value")); } else if ("min-password-length".equals(tag)) { @@ -133,6 +142,35 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } else if ("max-failed-password-wipe".equals(tag)) { maximumFailedPasswordsForWipe = Integer.parseInt( parser.getAttributeValue(null, "value")); + } else { + Log.w(TAG, "Unknown admin tag: " + tag); + } + XmlUtils.skipCurrentTag(parser); + } + } + } + + class MyPackageMonitor extends PackageMonitor { + public void onSomePackagesChanged() { + synchronized (DevicePolicyManagerService.this) { + for (int i=mAdminList.size()-1; i>=0; i--) { + ActiveAdmin aa = mAdminList.get(i); + int change = isPackageDisappearing(aa.info.getPackageName()); + if (change == PACKAGE_PERMANENT_CHANGE + || change == PACKAGE_TEMPORARY_CHANGE) { + Log.w(TAG, "Admin unexpectedly uninstalled: " + + aa.info.getComponent()); + mAdminList.remove(i); + } else if (isPackageModified(aa.info.getPackageName())) { + try { + mContext.getPackageManager().getReceiverInfo( + aa.info.getComponent(), 0); + } catch (NameNotFoundException e) { + Log.w(TAG, "Admin package change removed component: " + + aa.info.getComponent()); + mAdminList.remove(i); + } + } } } } @@ -143,6 +181,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { */ public DevicePolicyManagerService(Context context) { mContext = context; + mMonitor = new MyPackageMonitor(); + mMonitor.register(context, true); } private IPowerManager getIPowerManager() { @@ -336,6 +376,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } else if ("failed-password-attempts".equals(tag)) { mFailedPasswordAttempts = Integer.parseInt( parser.getAttributeValue(null, "value")); + XmlUtils.skipCurrentTag(parser); + } else { + Log.w(TAG, "Unknown tag: " + tag); + XmlUtils.skipCurrentTag(parser); } } } catch (NullPointerException e) { @@ -420,6 +464,18 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } + public boolean packageHasActiveAdmins(String packageName) { + synchronized (this) { + final int N = mAdminList.size(); + for (int i=0; i<N; i++) { + if (mAdminList.get(i).info.getPackageName().equals(packageName)) { + return true; + } + } + return false; + } + } + public void removeActiveAdmin(ComponentName adminReceiver) { synchronized (this) { ActiveAdmin admin = getActiveAdminUncheckedLocked(adminReceiver); |