Loading core/java/android/app/ApplicationPackageManager.java +11 −0 Original line number Diff line number Diff line Loading @@ -48,11 +48,13 @@ import android.content.pm.VerificationParams; import android.content.pm.VerifierDeviceIdentity; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; import android.util.ArrayMap; import android.util.Log; import android.view.Display; Loading Loading @@ -1490,6 +1492,15 @@ final class ApplicationPackageManager extends PackageManager { } } /** * @hide */ @Override public Bitmap getUserIcon(int userId) { UserManager um = UserManager.get(mContext); return um.getUserIcon(userId); } private final ContextImpl mContext; private final IPackageManager mPM; Loading core/java/android/content/pm/PackageManager.java +5 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.content.IntentSender; import android.content.pm.PackageParser.PackageParserException; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Environment; Loading Loading @@ -3618,4 +3619,8 @@ public abstract class PackageManager { */ public abstract void addCrossProfileIntentsForPackage(String packageName, int sourceUserId, int targetUserId); /** * @hide */ public abstract Bitmap getUserIcon(int userId); } core/java/android/content/pm/ResolveInfo.java +42 −1 Original line number Diff line number Diff line Loading @@ -19,8 +19,11 @@ package android.content.pm; import android.content.ComponentName; import android.content.IntentFilter; import android.graphics.drawable.Drawable; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; import android.text.TextUtils; import android.util.Printer; import android.util.Slog; Loading Loading @@ -126,6 +129,18 @@ public class ResolveInfo implements Parcelable { */ public String resolvePackageName; /** * If not equal to UserHandle.USER_CURRENT, then the intent will be forwarded to this user. * @hide */ public int targetUserId; /** * If true, then loadIcon will return the icon of the target user. * @hide */ public boolean showTargetUserIcon; /** * @hide Target comes from system process? */ Loading Loading @@ -202,6 +217,10 @@ public class ResolveInfo implements Parcelable { return dr; } } if (showTargetUserIcon) { Bitmap bm = pm.getUserIcon(targetUserId); return new BitmapDrawable(bm); } return ci.loadIcon(pm); } Loading @@ -215,7 +234,9 @@ public class ResolveInfo implements Parcelable { public final int getIconResource() { if (icon != 0) return icon; final ComponentInfo ci = getComponentInfo(); if (ci != null) return ci.getIconResource(); if (ci != null && !showTargetUserIcon) { return ci.getIconResource(); } return 0; } Loading Loading @@ -250,6 +271,7 @@ public class ResolveInfo implements Parcelable { } public ResolveInfo() { targetUserId = UserHandle.USER_CURRENT; } public ResolveInfo(ResolveInfo orig) { Loading @@ -266,6 +288,7 @@ public class ResolveInfo implements Parcelable { icon = orig.icon; resolvePackageName = orig.resolvePackageName; system = orig.system; targetUserId = orig.targetUserId; } public String toString() { Loading @@ -285,6 +308,13 @@ public class ResolveInfo implements Parcelable { } sb.append(" m=0x"); sb.append(Integer.toHexString(match)); if (targetUserId != UserHandle.USER_CURRENT) { sb.append(" targetUserId="); sb.append(targetUserId); } if (showTargetUserIcon) { sb.append(" [showTargetUserIcon]"); } sb.append('}'); return sb.toString(); } Loading Loading @@ -320,6 +350,8 @@ public class ResolveInfo implements Parcelable { TextUtils.writeToParcel(nonLocalizedLabel, dest, parcelableFlags); dest.writeInt(icon); dest.writeString(resolvePackageName); dest.writeInt(targetUserId); dest.writeInt(showTargetUserIcon ? 1 : 0); dest.writeInt(system ? 1 : 0); } Loading Loading @@ -363,6 +395,8 @@ public class ResolveInfo implements Parcelable { = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); icon = source.readInt(); resolvePackageName = source.readString(); targetUserId = source.readInt(); showTargetUserIcon = source.readInt() != 0; system = source.readInt() != 0; } Loading @@ -374,6 +408,13 @@ public class ResolveInfo implements Parcelable { } public final int compare(ResolveInfo a, ResolveInfo b) { // We want to put the one targeted to another user at the end of the dialog. if (a.targetUserId != UserHandle.USER_CURRENT) { return 1; } if (b.targetUserId != UserHandle.USER_CURRENT) { return -1; } CharSequence sa = a.loadLabel(mPM); if (sa == null) sa = a.activityInfo.name; CharSequence sb = b.loadLabel(mPM); Loading services/core/java/com/android/server/pm/PackageManagerService.java +3 −1 Original line number Diff line number Diff line Loading @@ -3577,9 +3577,11 @@ public class PackageManagerService extends IPackageManager.Stub { private ResolveInfo createForwardingResolveInfo(IntentFilter filter, int sourceUserId, int targetUserId) { ResolveInfo forwardingResolveInfo = new ResolveInfo(); String className; if (targetUserId == UserHandle.USER_OWNER) { className = FORWARD_INTENT_TO_USER_OWNER; forwardingResolveInfo.showTargetUserIcon = true; } else { className = FORWARD_INTENT_TO_MANAGED_PROFILE; } Loading @@ -3587,13 +3589,13 @@ public class PackageManagerService extends IPackageManager.Stub { mAndroidApplication.packageName, className); ActivityInfo forwardingActivityInfo = getActivityInfo(forwardingActivityComponentName, 0, sourceUserId); ResolveInfo forwardingResolveInfo = new ResolveInfo(); forwardingResolveInfo.activityInfo = forwardingActivityInfo; forwardingResolveInfo.priority = 0; forwardingResolveInfo.preferredOrder = 0; forwardingResolveInfo.match = 0; forwardingResolveInfo.isDefault = true; forwardingResolveInfo.filter = filter; forwardingResolveInfo.targetUserId = targetUserId; return forwardingResolveInfo; } Loading services/core/java/com/android/server/pm/UserManagerService.java +5 −1 Original line number Diff line number Diff line Loading @@ -412,13 +412,17 @@ public class UserManagerService extends IUserManager.Stub { @Override public Bitmap getUserIcon(int userId) { checkManageUsersPermission("read users"); synchronized (mPackagesLock) { UserInfo info = mUsers.get(userId); if (info == null || info.partial) { Slog.w(LOG_TAG, "getUserIcon: unknown user #" + userId); return null; } int callingGroupId = mUsers.get(UserHandle.getCallingUserId()).profileGroupId; if (callingGroupId == UserInfo.NO_PROFILE_GROUP_ID || callingGroupId != info.profileGroupId) { checkManageUsersPermission("get the icon of a user who is not related"); } if (info.iconPath == null) { return null; } Loading Loading
core/java/android/app/ApplicationPackageManager.java +11 −0 Original line number Diff line number Diff line Loading @@ -48,11 +48,13 @@ import android.content.pm.VerificationParams; import android.content.pm.VerifierDeviceIdentity; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; import android.util.ArrayMap; import android.util.Log; import android.view.Display; Loading Loading @@ -1490,6 +1492,15 @@ final class ApplicationPackageManager extends PackageManager { } } /** * @hide */ @Override public Bitmap getUserIcon(int userId) { UserManager um = UserManager.get(mContext); return um.getUserIcon(userId); } private final ContextImpl mContext; private final IPackageManager mPM; Loading
core/java/android/content/pm/PackageManager.java +5 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.content.IntentSender; import android.content.pm.PackageParser.PackageParserException; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Environment; Loading Loading @@ -3618,4 +3619,8 @@ public abstract class PackageManager { */ public abstract void addCrossProfileIntentsForPackage(String packageName, int sourceUserId, int targetUserId); /** * @hide */ public abstract Bitmap getUserIcon(int userId); }
core/java/android/content/pm/ResolveInfo.java +42 −1 Original line number Diff line number Diff line Loading @@ -19,8 +19,11 @@ package android.content.pm; import android.content.ComponentName; import android.content.IntentFilter; import android.graphics.drawable.Drawable; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; import android.text.TextUtils; import android.util.Printer; import android.util.Slog; Loading Loading @@ -126,6 +129,18 @@ public class ResolveInfo implements Parcelable { */ public String resolvePackageName; /** * If not equal to UserHandle.USER_CURRENT, then the intent will be forwarded to this user. * @hide */ public int targetUserId; /** * If true, then loadIcon will return the icon of the target user. * @hide */ public boolean showTargetUserIcon; /** * @hide Target comes from system process? */ Loading Loading @@ -202,6 +217,10 @@ public class ResolveInfo implements Parcelable { return dr; } } if (showTargetUserIcon) { Bitmap bm = pm.getUserIcon(targetUserId); return new BitmapDrawable(bm); } return ci.loadIcon(pm); } Loading @@ -215,7 +234,9 @@ public class ResolveInfo implements Parcelable { public final int getIconResource() { if (icon != 0) return icon; final ComponentInfo ci = getComponentInfo(); if (ci != null) return ci.getIconResource(); if (ci != null && !showTargetUserIcon) { return ci.getIconResource(); } return 0; } Loading Loading @@ -250,6 +271,7 @@ public class ResolveInfo implements Parcelable { } public ResolveInfo() { targetUserId = UserHandle.USER_CURRENT; } public ResolveInfo(ResolveInfo orig) { Loading @@ -266,6 +288,7 @@ public class ResolveInfo implements Parcelable { icon = orig.icon; resolvePackageName = orig.resolvePackageName; system = orig.system; targetUserId = orig.targetUserId; } public String toString() { Loading @@ -285,6 +308,13 @@ public class ResolveInfo implements Parcelable { } sb.append(" m=0x"); sb.append(Integer.toHexString(match)); if (targetUserId != UserHandle.USER_CURRENT) { sb.append(" targetUserId="); sb.append(targetUserId); } if (showTargetUserIcon) { sb.append(" [showTargetUserIcon]"); } sb.append('}'); return sb.toString(); } Loading Loading @@ -320,6 +350,8 @@ public class ResolveInfo implements Parcelable { TextUtils.writeToParcel(nonLocalizedLabel, dest, parcelableFlags); dest.writeInt(icon); dest.writeString(resolvePackageName); dest.writeInt(targetUserId); dest.writeInt(showTargetUserIcon ? 1 : 0); dest.writeInt(system ? 1 : 0); } Loading Loading @@ -363,6 +395,8 @@ public class ResolveInfo implements Parcelable { = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); icon = source.readInt(); resolvePackageName = source.readString(); targetUserId = source.readInt(); showTargetUserIcon = source.readInt() != 0; system = source.readInt() != 0; } Loading @@ -374,6 +408,13 @@ public class ResolveInfo implements Parcelable { } public final int compare(ResolveInfo a, ResolveInfo b) { // We want to put the one targeted to another user at the end of the dialog. if (a.targetUserId != UserHandle.USER_CURRENT) { return 1; } if (b.targetUserId != UserHandle.USER_CURRENT) { return -1; } CharSequence sa = a.loadLabel(mPM); if (sa == null) sa = a.activityInfo.name; CharSequence sb = b.loadLabel(mPM); Loading
services/core/java/com/android/server/pm/PackageManagerService.java +3 −1 Original line number Diff line number Diff line Loading @@ -3577,9 +3577,11 @@ public class PackageManagerService extends IPackageManager.Stub { private ResolveInfo createForwardingResolveInfo(IntentFilter filter, int sourceUserId, int targetUserId) { ResolveInfo forwardingResolveInfo = new ResolveInfo(); String className; if (targetUserId == UserHandle.USER_OWNER) { className = FORWARD_INTENT_TO_USER_OWNER; forwardingResolveInfo.showTargetUserIcon = true; } else { className = FORWARD_INTENT_TO_MANAGED_PROFILE; } Loading @@ -3587,13 +3589,13 @@ public class PackageManagerService extends IPackageManager.Stub { mAndroidApplication.packageName, className); ActivityInfo forwardingActivityInfo = getActivityInfo(forwardingActivityComponentName, 0, sourceUserId); ResolveInfo forwardingResolveInfo = new ResolveInfo(); forwardingResolveInfo.activityInfo = forwardingActivityInfo; forwardingResolveInfo.priority = 0; forwardingResolveInfo.preferredOrder = 0; forwardingResolveInfo.match = 0; forwardingResolveInfo.isDefault = true; forwardingResolveInfo.filter = filter; forwardingResolveInfo.targetUserId = targetUserId; return forwardingResolveInfo; } Loading
services/core/java/com/android/server/pm/UserManagerService.java +5 −1 Original line number Diff line number Diff line Loading @@ -412,13 +412,17 @@ public class UserManagerService extends IUserManager.Stub { @Override public Bitmap getUserIcon(int userId) { checkManageUsersPermission("read users"); synchronized (mPackagesLock) { UserInfo info = mUsers.get(userId); if (info == null || info.partial) { Slog.w(LOG_TAG, "getUserIcon: unknown user #" + userId); return null; } int callingGroupId = mUsers.get(UserHandle.getCallingUserId()).profileGroupId; if (callingGroupId == UserInfo.NO_PROFILE_GROUP_ID || callingGroupId != info.profileGroupId) { checkManageUsersPermission("get the icon of a user who is not related"); } if (info.iconPath == null) { return null; } Loading