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
This commit is contained in:
Robin Lee
2017-12-11 18:24:03 +01:00
parent cb1056f9b4
commit 1aeca095d3

View File

@@ -69,6 +69,7 @@ import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
public class DeviceAdminAdd extends Activity { public class DeviceAdminAdd extends Activity {
static final String TAG = "DeviceAdminAdd"; static final String TAG = "DeviceAdminAdd";
@@ -145,18 +146,14 @@ public class DeviceAdminAdd extends Activity {
DevicePolicyManager.EXTRA_DEVICE_ADMIN); DevicePolicyManager.EXTRA_DEVICE_ADMIN);
if (who == null) { if (who == null) {
String packageName = getIntent().getStringExtra(EXTRA_DEVICE_ADMIN_PACKAGE_NAME); String packageName = getIntent().getStringExtra(EXTRA_DEVICE_ADMIN_PACKAGE_NAME);
for (ComponentName component : mDPM.getActiveAdmins()) { Optional<ComponentName> installedAdmin = findAdminWithPackageName(packageName);
if (component.getPackageName().equals(packageName)) { if (!installedAdmin.isPresent()) {
who = component;
mUninstalling = true;
break;
}
}
if (who == null) {
Log.w(TAG, "No component specified in " + action); Log.w(TAG, "No component specified in " + action);
finish(); finish();
return; return;
} }
who = installedAdmin.get();
mUninstalling = true;
} }
if (action != null && action.equals(DevicePolicyManager.ACTION_SET_PROFILE_OWNER)) { 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 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<ComponentName> findAdminWithPackageName(String packageName) {
List<ComponentName> admins = mDPM.getActiveAdmins();
if (admins == null) {
return Optional.empty();
}
return admins.stream().filter(i -> i.getPackageName().equals(packageName)).findAny();
}
private boolean isAdminUninstallable() { private boolean isAdminUninstallable() {
// System apps can't be uninstalled. // System apps can't be uninstalled.
return !mDeviceAdmin.getActivityInfo().applicationInfo.isSystemApp(); return !mDeviceAdmin.getActivityInfo().applicationInfo.isSystemApp();