Loading core/java/android/app/ApplicationPackageManager.java +21 −4 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import android.content.pm.IPackageStatsObserver; import android.content.pm.InstrumentationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; import android.content.pm.PackageItemInfo; import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.content.pm.PermissionGroupInfo; Loading @@ -49,6 +50,7 @@ import android.content.pm.VerifierDeviceIdentity; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Process; Loading @@ -69,6 +71,15 @@ final class ApplicationPackageManager extends PackageManager { private final static boolean DEBUG = false; private final static boolean DEBUG_ICONS = false; UserManager mUserManager; UserManager getUserManager() { if (mUserManager == null) { mUserManager = UserManager.get(mContext); } return mUserManager; } @Override public PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException { Loading Loading @@ -1500,10 +1511,16 @@ final class ApplicationPackageManager extends PackageManager { /** * @hide */ @Override public Bitmap getUserIcon(int userId) { UserManager um = UserManager.get(mContext); return um.getUserIcon(userId); public Drawable loadItemIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo) { if (itemInfo.showUserIcon != UserHandle.USER_NULL) { return new BitmapDrawable(getUserManager().getUserIcon(itemInfo.showUserIcon)); } Drawable dr = getDrawable(itemInfo.packageName, itemInfo.icon, appInfo); if (dr != null) { dr = getUserManager().getBadgedDrawableForUser(dr, new UserHandle(mContext.getUserId())); } return dr; } private final ContextImpl mContext; Loading core/java/android/content/pm/PackageItemInfo.java +14 −3 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.content.res.XmlResourceParser; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Parcel; import android.os.UserHandle; import android.text.TextUtils; import android.util.Printer; Loading Loading @@ -87,7 +88,14 @@ public class PackageItemInfo { */ public Bundle metaData; /** * If different of UserHandle.USER_NULL, The icon of this item will be the one of that user. * @hide */ public int showUserIcon; public PackageItemInfo() { showUserIcon = UserHandle.USER_NULL; } public PackageItemInfo(PackageItemInfo orig) { Loading @@ -101,6 +109,7 @@ public class PackageItemInfo { banner = orig.banner; logo = orig.logo; metaData = orig.metaData; showUserIcon = orig.showUserIcon; } /** Loading Loading @@ -143,8 +152,8 @@ public class PackageItemInfo { * such as the default activity icon. */ public Drawable loadIcon(PackageManager pm) { if (icon != 0) { Drawable dr = pm.getDrawable(packageName, icon, getApplicationInfo()); if (icon != 0 || showUserIcon != UserHandle.USER_NULL) { Drawable dr = pm.loadItemIcon(this, getApplicationInfo()); if (dr != null) { return dr; } Loading Loading @@ -288,6 +297,7 @@ public class PackageItemInfo { dest.writeInt(logo); dest.writeBundle(metaData); dest.writeInt(banner); dest.writeInt(showUserIcon); } protected PackageItemInfo(Parcel source) { Loading @@ -300,6 +310,7 @@ public class PackageItemInfo { logo = source.readInt(); metaData = source.readBundle(); banner = source.readInt(); showUserIcon = source.readInt(); } /** Loading core/java/android/content/pm/PackageManager.java +1 −1 Original line number Diff line number Diff line Loading @@ -3642,5 +3642,5 @@ public abstract class PackageManager { /** * @hide */ public abstract Bitmap getUserIcon(int userId); public abstract Drawable loadItemIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo); } core/java/android/content/pm/ResolveInfo.java +5 −14 Original line number Diff line number Diff line Loading @@ -19,8 +19,6 @@ 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; Loading Loading @@ -136,10 +134,9 @@ public class ResolveInfo implements Parcelable { public int targetUserId; /** * If true, then loadIcon will return the icon of the target user. * @hide */ public boolean showTargetUserIcon; public boolean noResourceId; /** * @hide Target comes from system process? Loading Loading @@ -217,10 +214,6 @@ public class ResolveInfo implements Parcelable { return dr; } } if (showTargetUserIcon) { Bitmap bm = pm.getUserIcon(targetUserId); return new BitmapDrawable(bm); } return ci.loadIcon(pm); } Loading @@ -232,9 +225,10 @@ public class ResolveInfo implements Parcelable { * @return The icon associated with this match. */ public final int getIconResource() { if (noResourceId) return 0; if (icon != 0) return icon; final ComponentInfo ci = getComponentInfo(); if (ci != null && !showTargetUserIcon) { if (ci != null) { return ci.getIconResource(); } return 0; Loading Loading @@ -312,9 +306,6 @@ public class ResolveInfo implements Parcelable { sb.append(" targetUserId="); sb.append(targetUserId); } if (showTargetUserIcon) { sb.append(" [showTargetUserIcon]"); } sb.append('}'); return sb.toString(); } Loading Loading @@ -351,8 +342,8 @@ public class ResolveInfo implements Parcelable { dest.writeInt(icon); dest.writeString(resolvePackageName); dest.writeInt(targetUserId); dest.writeInt(showTargetUserIcon ? 1 : 0); dest.writeInt(system ? 1 : 0); dest.writeInt(noResourceId ? 1 : 0); } public static final Creator<ResolveInfo> CREATOR Loading Loading @@ -396,8 +387,8 @@ public class ResolveInfo implements Parcelable { icon = source.readInt(); resolvePackageName = source.readString(); targetUserId = source.readInt(); showTargetUserIcon = source.readInt() != 0; system = source.readInt() != 0; noResourceId = source.readInt() != 0; } public static class DisplayNameComparator Loading services/core/java/com/android/server/pm/PackageManagerService.java +36 −2 Original line number Diff line number Diff line Loading @@ -105,6 +105,7 @@ import android.content.pm.ProviderInfo; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.pm.Signature; import android.content.pm.UserInfo; import android.content.pm.VerificationParams; import android.content.pm.VerifierDeviceIdentity; import android.content.pm.VerifierInfo; Loading Loading @@ -460,6 +461,9 @@ public class PackageManagerService extends IPackageManager.Stub { HashSet<PackageParser.Package> mDeferredDexOpt = null; // Cache of users who need badging. SparseBooleanArray mUserNeedsBadging = new SparseBooleanArray(); /** Token for keys in mPendingVerification. */ private int mPendingVerificationToken = 0; Loading Loading @@ -3411,7 +3415,6 @@ public class PackageManagerService extends IPackageManager.Stub { String className; if (targetUserId == UserHandle.USER_OWNER) { className = FORWARD_INTENT_TO_USER_OWNER; forwardingResolveInfo.showTargetUserIcon = true; } else { className = FORWARD_INTENT_TO_MANAGED_PROFILE; } Loading @@ -3419,6 +3422,10 @@ public class PackageManagerService extends IPackageManager.Stub { mAndroidApplication.packageName, className); ActivityInfo forwardingActivityInfo = getActivityInfo(forwardingActivityComponentName, 0, sourceUserId); if (targetUserId == UserHandle.USER_OWNER) { forwardingActivityInfo.showUserIcon = UserHandle.USER_OWNER; forwardingResolveInfo.noResourceId = true; } forwardingResolveInfo.activityInfo = forwardingActivityInfo; forwardingResolveInfo.priority = 0; forwardingResolveInfo.preferredOrder = 0; Loading Loading @@ -6847,7 +6854,11 @@ public class PackageManagerService extends IPackageManager.Stub { res.isDefault = info.hasDefault; res.labelRes = info.labelRes; res.nonLocalizedLabel = info.nonLocalizedLabel; if (userNeedsBadging(userId)) { res.noResourceId = true; } else { res.icon = info.icon; } res.system = isSystemApp(res.activityInfo.applicationInfo); return res; } Loading Loading @@ -12975,6 +12986,7 @@ public class PackageManagerService extends IPackageManager.Stub { // other disk I/O going on, that we'll let it slide for now. mInstaller.removeUserDataDirs(userHandle); } mUserNeedsBadging.delete(userHandle); } /** Called by UserManagerService */ Loading Loading @@ -13049,4 +13061,26 @@ public class PackageManagerService extends IPackageManager.Stub { public IPackageInstaller getPackageInstaller() { return mInstallerService; } private boolean userNeedsBadging(int userId) { int index = mUserNeedsBadging.indexOfKey(userId); if (index < 0) { final UserInfo userInfo; final long token = Binder.clearCallingIdentity(); try { userInfo = sUserManager.getUserInfo(userId); } finally { Binder.restoreCallingIdentity(token); } final boolean b; if (userInfo != null && userInfo.isManagedProfile()) { b = true; } else { b = false; } mUserNeedsBadging.put(userId, b); return b; } return mUserNeedsBadging.valueAt(index); } } Loading
core/java/android/app/ApplicationPackageManager.java +21 −4 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import android.content.pm.IPackageStatsObserver; import android.content.pm.InstrumentationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; import android.content.pm.PackageItemInfo; import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.content.pm.PermissionGroupInfo; Loading @@ -49,6 +50,7 @@ import android.content.pm.VerifierDeviceIdentity; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Process; Loading @@ -69,6 +71,15 @@ final class ApplicationPackageManager extends PackageManager { private final static boolean DEBUG = false; private final static boolean DEBUG_ICONS = false; UserManager mUserManager; UserManager getUserManager() { if (mUserManager == null) { mUserManager = UserManager.get(mContext); } return mUserManager; } @Override public PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException { Loading Loading @@ -1500,10 +1511,16 @@ final class ApplicationPackageManager extends PackageManager { /** * @hide */ @Override public Bitmap getUserIcon(int userId) { UserManager um = UserManager.get(mContext); return um.getUserIcon(userId); public Drawable loadItemIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo) { if (itemInfo.showUserIcon != UserHandle.USER_NULL) { return new BitmapDrawable(getUserManager().getUserIcon(itemInfo.showUserIcon)); } Drawable dr = getDrawable(itemInfo.packageName, itemInfo.icon, appInfo); if (dr != null) { dr = getUserManager().getBadgedDrawableForUser(dr, new UserHandle(mContext.getUserId())); } return dr; } private final ContextImpl mContext; Loading
core/java/android/content/pm/PackageItemInfo.java +14 −3 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.content.res.XmlResourceParser; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Parcel; import android.os.UserHandle; import android.text.TextUtils; import android.util.Printer; Loading Loading @@ -87,7 +88,14 @@ public class PackageItemInfo { */ public Bundle metaData; /** * If different of UserHandle.USER_NULL, The icon of this item will be the one of that user. * @hide */ public int showUserIcon; public PackageItemInfo() { showUserIcon = UserHandle.USER_NULL; } public PackageItemInfo(PackageItemInfo orig) { Loading @@ -101,6 +109,7 @@ public class PackageItemInfo { banner = orig.banner; logo = orig.logo; metaData = orig.metaData; showUserIcon = orig.showUserIcon; } /** Loading Loading @@ -143,8 +152,8 @@ public class PackageItemInfo { * such as the default activity icon. */ public Drawable loadIcon(PackageManager pm) { if (icon != 0) { Drawable dr = pm.getDrawable(packageName, icon, getApplicationInfo()); if (icon != 0 || showUserIcon != UserHandle.USER_NULL) { Drawable dr = pm.loadItemIcon(this, getApplicationInfo()); if (dr != null) { return dr; } Loading Loading @@ -288,6 +297,7 @@ public class PackageItemInfo { dest.writeInt(logo); dest.writeBundle(metaData); dest.writeInt(banner); dest.writeInt(showUserIcon); } protected PackageItemInfo(Parcel source) { Loading @@ -300,6 +310,7 @@ public class PackageItemInfo { logo = source.readInt(); metaData = source.readBundle(); banner = source.readInt(); showUserIcon = source.readInt(); } /** Loading
core/java/android/content/pm/PackageManager.java +1 −1 Original line number Diff line number Diff line Loading @@ -3642,5 +3642,5 @@ public abstract class PackageManager { /** * @hide */ public abstract Bitmap getUserIcon(int userId); public abstract Drawable loadItemIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo); }
core/java/android/content/pm/ResolveInfo.java +5 −14 Original line number Diff line number Diff line Loading @@ -19,8 +19,6 @@ 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; Loading Loading @@ -136,10 +134,9 @@ public class ResolveInfo implements Parcelable { public int targetUserId; /** * If true, then loadIcon will return the icon of the target user. * @hide */ public boolean showTargetUserIcon; public boolean noResourceId; /** * @hide Target comes from system process? Loading Loading @@ -217,10 +214,6 @@ public class ResolveInfo implements Parcelable { return dr; } } if (showTargetUserIcon) { Bitmap bm = pm.getUserIcon(targetUserId); return new BitmapDrawable(bm); } return ci.loadIcon(pm); } Loading @@ -232,9 +225,10 @@ public class ResolveInfo implements Parcelable { * @return The icon associated with this match. */ public final int getIconResource() { if (noResourceId) return 0; if (icon != 0) return icon; final ComponentInfo ci = getComponentInfo(); if (ci != null && !showTargetUserIcon) { if (ci != null) { return ci.getIconResource(); } return 0; Loading Loading @@ -312,9 +306,6 @@ public class ResolveInfo implements Parcelable { sb.append(" targetUserId="); sb.append(targetUserId); } if (showTargetUserIcon) { sb.append(" [showTargetUserIcon]"); } sb.append('}'); return sb.toString(); } Loading Loading @@ -351,8 +342,8 @@ public class ResolveInfo implements Parcelable { dest.writeInt(icon); dest.writeString(resolvePackageName); dest.writeInt(targetUserId); dest.writeInt(showTargetUserIcon ? 1 : 0); dest.writeInt(system ? 1 : 0); dest.writeInt(noResourceId ? 1 : 0); } public static final Creator<ResolveInfo> CREATOR Loading Loading @@ -396,8 +387,8 @@ public class ResolveInfo implements Parcelable { icon = source.readInt(); resolvePackageName = source.readString(); targetUserId = source.readInt(); showTargetUserIcon = source.readInt() != 0; system = source.readInt() != 0; noResourceId = source.readInt() != 0; } public static class DisplayNameComparator Loading
services/core/java/com/android/server/pm/PackageManagerService.java +36 −2 Original line number Diff line number Diff line Loading @@ -105,6 +105,7 @@ import android.content.pm.ProviderInfo; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.pm.Signature; import android.content.pm.UserInfo; import android.content.pm.VerificationParams; import android.content.pm.VerifierDeviceIdentity; import android.content.pm.VerifierInfo; Loading Loading @@ -460,6 +461,9 @@ public class PackageManagerService extends IPackageManager.Stub { HashSet<PackageParser.Package> mDeferredDexOpt = null; // Cache of users who need badging. SparseBooleanArray mUserNeedsBadging = new SparseBooleanArray(); /** Token for keys in mPendingVerification. */ private int mPendingVerificationToken = 0; Loading Loading @@ -3411,7 +3415,6 @@ public class PackageManagerService extends IPackageManager.Stub { String className; if (targetUserId == UserHandle.USER_OWNER) { className = FORWARD_INTENT_TO_USER_OWNER; forwardingResolveInfo.showTargetUserIcon = true; } else { className = FORWARD_INTENT_TO_MANAGED_PROFILE; } Loading @@ -3419,6 +3422,10 @@ public class PackageManagerService extends IPackageManager.Stub { mAndroidApplication.packageName, className); ActivityInfo forwardingActivityInfo = getActivityInfo(forwardingActivityComponentName, 0, sourceUserId); if (targetUserId == UserHandle.USER_OWNER) { forwardingActivityInfo.showUserIcon = UserHandle.USER_OWNER; forwardingResolveInfo.noResourceId = true; } forwardingResolveInfo.activityInfo = forwardingActivityInfo; forwardingResolveInfo.priority = 0; forwardingResolveInfo.preferredOrder = 0; Loading Loading @@ -6847,7 +6854,11 @@ public class PackageManagerService extends IPackageManager.Stub { res.isDefault = info.hasDefault; res.labelRes = info.labelRes; res.nonLocalizedLabel = info.nonLocalizedLabel; if (userNeedsBadging(userId)) { res.noResourceId = true; } else { res.icon = info.icon; } res.system = isSystemApp(res.activityInfo.applicationInfo); return res; } Loading Loading @@ -12975,6 +12986,7 @@ public class PackageManagerService extends IPackageManager.Stub { // other disk I/O going on, that we'll let it slide for now. mInstaller.removeUserDataDirs(userHandle); } mUserNeedsBadging.delete(userHandle); } /** Called by UserManagerService */ Loading Loading @@ -13049,4 +13061,26 @@ public class PackageManagerService extends IPackageManager.Stub { public IPackageInstaller getPackageInstaller() { return mInstallerService; } private boolean userNeedsBadging(int userId) { int index = mUserNeedsBadging.indexOfKey(userId); if (index < 0) { final UserInfo userInfo; final long token = Binder.clearCallingIdentity(); try { userInfo = sUserManager.getUserInfo(userId); } finally { Binder.restoreCallingIdentity(token); } final boolean b; if (userInfo != null && userInfo.isManagedProfile()) { b = true; } else { b = false; } mUserNeedsBadging.put(userId, b); return b; } return mUserNeedsBadging.valueAt(index); } }