diff options
4 files changed, 52 insertions, 68 deletions
diff --git a/core/java/android/app/admin/DeviceAdminInfo.java b/core/java/android/app/admin/DeviceAdminInfo.java index 4e9adf09c351..1de1d2fbb822 100644 --- a/core/java/android/app/admin/DeviceAdminInfo.java +++ b/core/java/android/app/admin/DeviceAdminInfo.java @@ -240,7 +240,7 @@ public final class DeviceAdminInfo implements Parcelable { /** * The BroadcastReceiver that implements this device admin component. */ - final ResolveInfo mReceiver; + final ActivityInfo mActivityInfo; /** * Whether this should be visible to the user. @@ -252,29 +252,42 @@ public final class DeviceAdminInfo implements Parcelable { */ int mUsesPolicies; + + /** + * Constructor. + * + * @param context The Context in which we are parsing the device admin. + * @param resolveInfo The ResolveInfo returned from the package manager about + * this device admin's component. + */ + public DeviceAdminInfo(Context context, ResolveInfo resolveInfo) + throws XmlPullParserException, IOException { + this(context, resolveInfo.activityInfo); + } /** * Constructor. * * @param context The Context in which we are parsing the device admin. - * @param receiver The ResolveInfo returned from the package manager about + * @param activityInfo The ActivityInfo returned from the package manager about * this device admin's component. + * + * @hide */ - public DeviceAdminInfo(Context context, ResolveInfo receiver) + public DeviceAdminInfo(Context context, ActivityInfo activityInfo) throws XmlPullParserException, IOException { - mReceiver = receiver; - ActivityInfo ai = receiver.activityInfo; + mActivityInfo = activityInfo; PackageManager pm = context.getPackageManager(); XmlResourceParser parser = null; try { - parser = ai.loadXmlMetaData(pm, DeviceAdminReceiver.DEVICE_ADMIN_META_DATA); + parser = mActivityInfo.loadXmlMetaData(pm, DeviceAdminReceiver.DEVICE_ADMIN_META_DATA); if (parser == null) { throw new XmlPullParserException("No " + DeviceAdminReceiver.DEVICE_ADMIN_META_DATA + " meta-data"); } - Resources res = pm.getResourcesForApplication(ai.applicationInfo); + Resources res = pm.getResourcesForApplication(mActivityInfo.applicationInfo); AttributeSet attrs = Xml.asAttributeSet(parser); @@ -324,14 +337,14 @@ public final class DeviceAdminInfo implements Parcelable { } } catch (NameNotFoundException e) { throw new XmlPullParserException( - "Unable to create context for: " + ai.packageName); + "Unable to create context for: " + mActivityInfo.packageName); } finally { if (parser != null) parser.close(); } } DeviceAdminInfo(Parcel source) { - mReceiver = ResolveInfo.CREATOR.createFromParcel(source); + mActivityInfo = ActivityInfo.CREATOR.createFromParcel(source); mUsesPolicies = source.readInt(); } @@ -339,7 +352,7 @@ public final class DeviceAdminInfo implements Parcelable { * Return the .apk package that implements this device admin. */ public String getPackageName() { - return mReceiver.activityInfo.packageName; + return mActivityInfo.packageName; } /** @@ -347,7 +360,7 @@ public final class DeviceAdminInfo implements Parcelable { * this device admin. */ public String getReceiverName() { - return mReceiver.activityInfo.name; + return mActivityInfo.name; } /** @@ -355,7 +368,7 @@ public final class DeviceAdminInfo implements Parcelable { * device admin. Do not modify the returned object. */ public ActivityInfo getActivityInfo() { - return mReceiver.activityInfo; + return mActivityInfo; } /** @@ -363,8 +376,8 @@ public final class DeviceAdminInfo implements Parcelable { */ @NonNull public ComponentName getComponent() { - return new ComponentName(mReceiver.activityInfo.packageName, - mReceiver.activityInfo.name); + return new ComponentName(mActivityInfo.packageName, + mActivityInfo.name); } /** @@ -374,7 +387,7 @@ public final class DeviceAdminInfo implements Parcelable { * resources. */ public CharSequence loadLabel(PackageManager pm) { - return mReceiver.loadLabel(pm); + return mActivityInfo.loadLabel(pm); } /** @@ -384,15 +397,9 @@ public final class DeviceAdminInfo implements Parcelable { * resources. */ public CharSequence loadDescription(PackageManager pm) throws NotFoundException { - if (mReceiver.activityInfo.descriptionRes != 0) { - String packageName = mReceiver.resolvePackageName; - ApplicationInfo applicationInfo = null; - if (packageName == null) { - packageName = mReceiver.activityInfo.packageName; - applicationInfo = mReceiver.activityInfo.applicationInfo; - } - return pm.getText(packageName, - mReceiver.activityInfo.descriptionRes, applicationInfo); + if (mActivityInfo.descriptionRes != 0) { + return pm.getText(mActivityInfo.packageName, + mActivityInfo.descriptionRes, mActivityInfo.applicationInfo); } throw new NotFoundException(); } @@ -404,7 +411,7 @@ public final class DeviceAdminInfo implements Parcelable { * resources. */ public Drawable loadIcon(PackageManager pm) { - return mReceiver.loadIcon(pm); + return mActivityInfo.loadIcon(pm); } /** @@ -464,12 +471,12 @@ public final class DeviceAdminInfo implements Parcelable { public void dump(Printer pw, String prefix) { pw.println(prefix + "Receiver:"); - mReceiver.dump(pw, prefix + " "); + mActivityInfo.dump(pw, prefix + " "); } @Override public String toString() { - return "DeviceAdminInfo{" + mReceiver.activityInfo.name + "}"; + return "DeviceAdminInfo{" + mActivityInfo.name + "}"; } /** @@ -479,7 +486,7 @@ public final class DeviceAdminInfo implements Parcelable { * @param flags The flags used for parceling. */ public void writeToParcel(Parcel dest, int flags) { - mReceiver.writeToParcel(dest, flags); + mActivityInfo.writeToParcel(dest, flags); dest.writeInt(mUsesPolicies); } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 27f098c597d5..74fe13ac1961 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -3172,31 +3172,6 @@ public class DevicePolicyManager { } /** - * Returns the DeviceAdminInfo as defined by the administrator's package info & meta-data - * @hide - */ - public DeviceAdminInfo getAdminInfo(@NonNull ComponentName cn) { - ActivityInfo ai; - try { - ai = mContext.getPackageManager().getReceiverInfo(cn, - PackageManager.GET_META_DATA); - } catch (PackageManager.NameNotFoundException e) { - Log.w(TAG, "Unable to retrieve device policy " + cn, e); - return null; - } - - ResolveInfo ri = new ResolveInfo(); - ri.activityInfo = ai; - - try { - return new DeviceAdminInfo(mContext, ri); - } catch (XmlPullParserException | IOException e) { - Log.w(TAG, "Unable to parse device policy " + cn, e); - return null; - } - } - - /** * @hide */ public void getRemoveWarning(@Nullable ComponentName admin, RemoteCallback result) { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 6db147df66f9..60c3a35017d4 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -2053,31 +2053,31 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return null; } enforceFullCrossUsersPermission(userHandle); - Intent resolveIntent = new Intent(); - resolveIntent.setComponent(adminName); - List<ResolveInfo> infos = mContext.getPackageManager().queryBroadcastReceiversAsUser( - resolveIntent, - PackageManager.GET_META_DATA | PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS | - PackageManager.MATCH_ENCRYPTION_AWARE_AND_UNAWARE, - userHandle); - if (infos == null || infos.size() <= 0) { + ActivityInfo ai = null; + try { + ai = mIPackageManager.getReceiverInfo(adminName, + PackageManager.GET_META_DATA | + PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS | + PackageManager.MATCH_ENCRYPTION_AWARE_AND_UNAWARE, userHandle); + } catch (RemoteException e) { + // shouldn't happen. + } + if (ai == null) { throw new IllegalArgumentException("Unknown admin: " + adminName); } - final ResolveInfo ri = infos.get(0); - - if (!permission.BIND_DEVICE_ADMIN.equals(ri.activityInfo.permission)) { + if (!permission.BIND_DEVICE_ADMIN.equals(ai.permission)) { final String message = "DeviceAdminReceiver " + adminName + " must be protected with " + permission.BIND_DEVICE_ADMIN; Slog.w(LOG_TAG, message); if (throwForMissiongPermission && - ri.activityInfo.applicationInfo.targetSdkVersion > Build.VERSION_CODES.M) { + ai.applicationInfo.targetSdkVersion > Build.VERSION_CODES.M) { throw new IllegalArgumentException(message); } } try { - return new DeviceAdminInfo(mContext, ri); + return new DeviceAdminInfo(mContext, ai); } catch (XmlPullParserException | IOException e) { Slog.w(LOG_TAG, "Bad device admin requested for user=" + userHandle + ": " + adminName, e); diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java index ca436442d75a..c80ca6c996a2 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java @@ -154,8 +154,10 @@ public abstract class DpmTestBase extends AndroidTestCase { aci.packageName = admin.getPackageName(); aci.name = admin.getClassName(); - doReturn(realResolveInfo).when(mMockContext.packageManager).queryBroadcastReceiversAsUser( - MockUtils.checkIntentComponent(admin), + // Note we don't set up queryBroadcastReceivers. We don't use it in DPMS. + + doReturn(aci).when(mMockContext.ipackageManager).getReceiverInfo( + eq(admin), anyInt(), eq(UserHandle.getUserId(packageUid))); |