Loading core/java/android/app/admin/DeviceAdminInfo.java +35 −28 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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); Loading Loading @@ -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(); } Loading @@ -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; } /** Loading @@ -347,7 +360,7 @@ public final class DeviceAdminInfo implements Parcelable { * this device admin. */ public String getReceiverName() { return mReceiver.activityInfo.name; return mActivityInfo.name; } /** Loading @@ -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; } /** Loading @@ -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); } /** Loading @@ -374,7 +387,7 @@ public final class DeviceAdminInfo implements Parcelable { * resources. */ public CharSequence loadLabel(PackageManager pm) { return mReceiver.loadLabel(pm); return mActivityInfo.loadLabel(pm); } /** Loading @@ -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(); } Loading @@ -404,7 +411,7 @@ public final class DeviceAdminInfo implements Parcelable { * resources. */ public Drawable loadIcon(PackageManager pm) { return mReceiver.loadIcon(pm); return mActivityInfo.loadIcon(pm); } /** Loading Loading @@ -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 + "}"; } /** Loading @@ -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); } Loading core/java/android/app/admin/DevicePolicyManager.java +0 −25 Original line number Diff line number Diff line Loading @@ -3171,31 +3171,6 @@ public class DevicePolicyManager { setActiveAdmin(policyReceiver, refreshing, myUserId()); } /** * 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 */ Loading services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +13 −13 Original line number Diff line number Diff line Loading @@ -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); Loading services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java +4 −2 Original line number Diff line number Diff line Loading @@ -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))); Loading Loading
core/java/android/app/admin/DeviceAdminInfo.java +35 −28 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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); Loading Loading @@ -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(); } Loading @@ -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; } /** Loading @@ -347,7 +360,7 @@ public final class DeviceAdminInfo implements Parcelable { * this device admin. */ public String getReceiverName() { return mReceiver.activityInfo.name; return mActivityInfo.name; } /** Loading @@ -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; } /** Loading @@ -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); } /** Loading @@ -374,7 +387,7 @@ public final class DeviceAdminInfo implements Parcelable { * resources. */ public CharSequence loadLabel(PackageManager pm) { return mReceiver.loadLabel(pm); return mActivityInfo.loadLabel(pm); } /** Loading @@ -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(); } Loading @@ -404,7 +411,7 @@ public final class DeviceAdminInfo implements Parcelable { * resources. */ public Drawable loadIcon(PackageManager pm) { return mReceiver.loadIcon(pm); return mActivityInfo.loadIcon(pm); } /** Loading Loading @@ -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 + "}"; } /** Loading @@ -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); } Loading
core/java/android/app/admin/DevicePolicyManager.java +0 −25 Original line number Diff line number Diff line Loading @@ -3171,31 +3171,6 @@ public class DevicePolicyManager { setActiveAdmin(policyReceiver, refreshing, myUserId()); } /** * 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 */ Loading
services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +13 −13 Original line number Diff line number Diff line Loading @@ -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); Loading
services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java +4 −2 Original line number Diff line number Diff line Loading @@ -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))); Loading