From 1aeca095d380c3cef633d7f97588bc04000f3496 Mon Sep 17 00:00:00 2001 From: Robin Lee Date: Mon, 11 Dec 2017 18:24:03 +0100 Subject: [PATCH] Handle getActiveAdmins() == null safely. Test: adb install -r $OUT/system/priv-app/Settings/Settings.apk && adb shell am start -n com.android.settings/.DeviceAdminAdd --es android.app.extra.DEVICE_ADMIN_PACKAGE_NAME com.example.nonexistent Change-Id: I1e3cf406e8053f6dbf99669f33b7c16648c9c8f8 Fix: 70491813 --- src/com/android/settings/DeviceAdminAdd.java | 25 +++++++++++++------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/DeviceAdminAdd.java b/src/com/android/settings/DeviceAdminAdd.java index 2fd769b42a2..0ad882df9a2 100644 --- a/src/com/android/settings/DeviceAdminAdd.java +++ b/src/com/android/settings/DeviceAdminAdd.java @@ -69,6 +69,7 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Optional; public class DeviceAdminAdd extends Activity { static final String TAG = "DeviceAdminAdd"; @@ -145,18 +146,14 @@ public class DeviceAdminAdd extends Activity { DevicePolicyManager.EXTRA_DEVICE_ADMIN); if (who == null) { String packageName = getIntent().getStringExtra(EXTRA_DEVICE_ADMIN_PACKAGE_NAME); - for (ComponentName component : mDPM.getActiveAdmins()) { - if (component.getPackageName().equals(packageName)) { - who = component; - mUninstalling = true; - break; - } - } - if (who == null) { + Optional installedAdmin = findAdminWithPackageName(packageName); + if (!installedAdmin.isPresent()) { Log.w(TAG, "No component specified in " + action); finish(); return; } + who = installedAdmin.get(); + mUninstalling = true; } if (action != null && action.equals(DevicePolicyManager.ACTION_SET_PROFILE_OWNER)) { @@ -692,6 +689,18 @@ public class DeviceAdminAdd extends Activity { return info != null ? info.isManagedProfile() : false; } + /** + * @return an {@link Optional} containing the admin with a given package name, if it exists, + * or {@link Optional#empty()} otherwise. + */ + private Optional findAdminWithPackageName(String packageName) { + List admins = mDPM.getActiveAdmins(); + if (admins == null) { + return Optional.empty(); + } + return admins.stream().filter(i -> i.getPackageName().equals(packageName)).findAny(); + } + private boolean isAdminUninstallable() { // System apps can't be uninstalled. return !mDeviceAdmin.getActivityInfo().applicationInfo.isSystemApp();