Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 71420b89 authored by Nicolas Prevot's avatar Nicolas Prevot Committed by Android (Google) Code Review
Browse files

Merge "Returning badged icons for components of corporate apps."

parents c25427a6 7f7b0c75
Loading
Loading
Loading
Loading
+21 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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 {
@@ -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;
+14 −3
Original line number Diff line number Diff line
@@ -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;

@@ -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) {
@@ -101,6 +109,7 @@ public class PackageItemInfo {
        banner = orig.banner;
        logo = orig.logo;
        metaData = orig.metaData;
        showUserIcon = orig.showUserIcon;
    }

    /**
@@ -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;
            }
@@ -288,6 +297,7 @@ public class PackageItemInfo {
        dest.writeInt(logo);
        dest.writeBundle(metaData);
        dest.writeInt(banner);
        dest.writeInt(showUserIcon);
    }
    
    protected PackageItemInfo(Parcel source) {
@@ -300,6 +310,7 @@ public class PackageItemInfo {
        logo = source.readInt();
        metaData = source.readBundle();
        banner = source.readInt();
        showUserIcon = source.readInt();
    }

    /**
+1 −1
Original line number Diff line number Diff line
@@ -3642,5 +3642,5 @@ public abstract class PackageManager {
    /**
     * @hide
     */
    public abstract Bitmap getUserIcon(int userId);
    public abstract Drawable loadItemIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo);
}
+5 −14
Original line number Diff line number Diff line
@@ -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;
@@ -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?
@@ -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);
    }
    
@@ -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;
@@ -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();
    }
@@ -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
@@ -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
+36 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
        }
@@ -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;
@@ -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;
        }
@@ -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 */
@@ -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