diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminListItem.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminListItem.java index 305281c4620..370a4dfe12f 100644 --- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminListItem.java +++ b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminListItem.java @@ -30,6 +30,7 @@ class DeviceAdminListItem implements Comparable { private static final String TAG = "DeviceAdminListItem"; + private final UserHandle mUserHandle; private final String mKey; private final DeviceAdminInfo mInfo; private final CharSequence mName; @@ -39,7 +40,8 @@ class DeviceAdminListItem implements Comparable { public DeviceAdminListItem(Context context, DeviceAdminInfo info) { mInfo = info; - mKey = mInfo.getComponent().flattenToString(); + mUserHandle = new UserHandle(getUserIdFromDeviceAdminInfo(mInfo)); + mKey = mUserHandle.getIdentifier() + "@" + mInfo.getComponent().flattenToString(); mDPM = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); final PackageManager pm = context.getPackageManager(); mName = mInfo.loadLabel(pm); @@ -48,8 +50,7 @@ class DeviceAdminListItem implements Comparable { } catch (Resources.NotFoundException exception) { Log.w(TAG, "Setting description to null because can't find resource: " + mKey); } - mIcon = pm.getUserBadgedIcon(mInfo.loadIcon(pm), - new UserHandle(DeviceAdminUtils.getUserIdFromDeviceAdminInfo(mInfo))); + mIcon = pm.getUserBadgedIcon(mInfo.loadIcon(pm), mUserHandle); } @Override @@ -70,8 +71,7 @@ class DeviceAdminListItem implements Comparable { } public boolean isActive() { - return mDPM.isAdminActiveAsUser(mInfo.getComponent(), - DeviceAdminUtils.getUserIdFromDeviceAdminInfo(mInfo)); + return mDPM.isAdminActiveAsUser(mInfo.getComponent(), getUserIdFromDeviceAdminInfo(mInfo)); } public Drawable getIcon() { @@ -79,16 +79,25 @@ class DeviceAdminListItem implements Comparable { } public boolean isEnabled() { - return !mDPM.isRemovingAdmin(mInfo.getComponent(), - DeviceAdminUtils.getUserIdFromDeviceAdminInfo(mInfo)); + return !mDPM.isRemovingAdmin(mInfo.getComponent(), getUserIdFromDeviceAdminInfo(mInfo)); } public UserHandle getUser() { - return new UserHandle(DeviceAdminUtils.getUserIdFromDeviceAdminInfo(mInfo)); + return new UserHandle(getUserIdFromDeviceAdminInfo(mInfo)); } public Intent getLaunchIntent(Context context) { return new Intent(context, DeviceAdminAdd.class) .putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mInfo.getComponent()); } + + /** + * Extracts the user id from a device admin info object. + * + * @param adminInfo the device administrator info. + * @return identifier of the user associated with the device admin. + */ + private static int getUserIdFromDeviceAdminInfo(DeviceAdminInfo adminInfo) { + return UserHandle.getUserId(adminInfo.getActivityInfo().applicationInfo.uid); + } } diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminListPreferenceController.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminListPreferenceController.java index 319d62f66c3..7b139d9770a 100644 --- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminListPreferenceController.java +++ b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminListPreferenceController.java @@ -53,6 +53,9 @@ import com.android.settingslib.core.lifecycle.events.OnStop; import com.android.settingslib.widget.FooterPreference; import com.android.settingslib.widget.FooterPreferenceMixinCompat; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -249,8 +252,7 @@ public class DeviceAdminListPreferenceController extends BasePreferenceControlle Log.w(TAG, "Unable to load component: " + activeAdmin); continue; } - final DeviceAdminInfo deviceAdminInfo = DeviceAdminUtils.createDeviceAdminInfo( - mContext, ai); + final DeviceAdminInfo deviceAdminInfo = createDeviceAdminInfo(mContext, ai); if (deviceAdminInfo == null) { continue; } @@ -286,7 +288,7 @@ public class DeviceAdminListPreferenceController extends BasePreferenceControlle && alreadyAddedComponents.contains(riComponentName)) { continue; } - DeviceAdminInfo deviceAdminInfo = DeviceAdminUtils.createDeviceAdminInfo( + DeviceAdminInfo deviceAdminInfo = createDeviceAdminInfo( mContext, resolveInfo.activityInfo); // add only visible ones (note: active admins are added regardless of visibility) if (deviceAdminInfo != null && deviceAdminInfo.isVisible()) { @@ -297,4 +299,20 @@ public class DeviceAdminListPreferenceController extends BasePreferenceControlle } } } + + /** + * Creates a device admin info object for the resolved intent that points to the component of + * the device admin. + * + * @param ai ActivityInfo for the admin component. + * @return new {@link DeviceAdminInfo} object or null if there was an error. + */ + private static DeviceAdminInfo createDeviceAdminInfo(Context context, ActivityInfo ai) { + try { + return new DeviceAdminInfo(context, ai); + } catch (XmlPullParserException | IOException e) { + Log.w(TAG, "Skipping " + ai, e); + } + return null; + } } diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminUtils.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminUtils.java deleted file mode 100644 index 13d9d20bece..00000000000 --- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminUtils.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settings.applications.specialaccess.deviceadmin; - -import android.app.admin.DeviceAdminInfo; -import android.content.Context; -import android.content.pm.ActivityInfo; -import android.os.UserHandle; -import android.util.Log; - -import org.xmlpull.v1.XmlPullParserException; - -import java.io.IOException; - -public class DeviceAdminUtils { - - private static final String TAG = "DeviceAdminUtils"; - - /** - * Creates a device admin info object for the resolved intent that points to the component of - * the device admin. - * - * @param ai ActivityInfo for the admin component. - * @return new {@link DeviceAdminInfo} object or null if there was an error. - */ - public static DeviceAdminInfo createDeviceAdminInfo(Context context, ActivityInfo ai) { - try { - return new DeviceAdminInfo(context, ai); - } catch (XmlPullParserException | IOException e) { - Log.w(TAG, "Skipping " + ai, e); - } - return null; - } - - /** - * Extracts the user id from a device admin info object. - * - * @param adminInfo the device administrator info. - * @return identifier of the user associated with the device admin. - */ - public static int getUserIdFromDeviceAdminInfo(DeviceAdminInfo adminInfo) { - return UserHandle.getUserId(adminInfo.getActivityInfo().applicationInfo.uid); - } -} diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminListItemTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminListItemTest.java index 17703e334dd..7392fb1376a 100644 --- a/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminListItemTest.java +++ b/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminListItemTest.java @@ -67,7 +67,7 @@ public class DeviceAdminListItemTest { DeviceAdminListItem item = new DeviceAdminListItem(mContext, mDeviceAdminInfo); - assertThat(item.getKey()).isEqualTo(cn.flattenToShortString()); + assertThat(item.getKey()).isEqualTo("0@" + cn.flattenToShortString()); assertThat(item.getName()).isEqualTo(label); assertThat(item.getDescription()).isEqualTo(description); }