diff --git a/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java b/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java index 2d324079fe..4a265592c5 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java +++ b/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java @@ -21,6 +21,7 @@ import android.app.Person; import android.content.Context; import android.content.pm.LauncherActivityInfo; import android.content.pm.LauncherApps; +import android.content.pm.LauncherUserInfo; import android.content.pm.ShortcutInfo; import android.graphics.drawable.ColorDrawable; import android.os.UserHandle; @@ -28,6 +29,7 @@ import android.os.UserManager; import android.util.ArrayMap; import android.window.RemoteTransition; +import com.android.launcher3.Flags; import com.android.launcher3.Utilities; import com.android.launcher3.util.UserIconInfo; import com.android.quickstep.util.FadeOutRemoteTransition; @@ -69,17 +71,32 @@ public class ApiWrapper { List usersActual = um.getUserProfiles(); if (usersActual != null) { for (UserHandle user : usersActual) { - long serial = um.getSerialNumberForUser(user); + if (android.os.Flags.allowPrivateProfile() && Flags.enablePrivateSpace()) { + LauncherApps launcherApps = context.getSystemService(LauncherApps.class); + LauncherUserInfo launcherUserInfo = launcherApps.getLauncherUserInfo(user); + // UserTypes not supported in Launcher are deemed to be the current + // Foreground User. + int userType = switch (launcherUserInfo.getUserType()) { + case UserManager.USER_TYPE_PROFILE_MANAGED -> UserIconInfo.TYPE_WORK; + case UserManager.USER_TYPE_PROFILE_CLONE -> UserIconInfo.TYPE_CLONED; + case UserManager.USER_TYPE_PROFILE_PRIVATE -> UserIconInfo.TYPE_PRIVATE; + default -> UserIconInfo.TYPE_MAIN; + }; + long serial = launcherUserInfo.getUserSerialNumber(); + users.put(user, new UserIconInfo(user, userType, serial)); + } else { + long serial = um.getSerialNumberForUser(user); - // Simple check to check if the provided user is work profile - // TODO: Migrate to a better platform API - NoopDrawable d = new NoopDrawable(); - boolean isWork = (d != context.getPackageManager().getUserBadgedIcon(d, user)); - UserIconInfo info = new UserIconInfo( - user, - isWork ? UserIconInfo.TYPE_WORK : UserIconInfo.TYPE_MAIN, - serial); - users.put(user, info); + // Simple check to check if the provided user is work profile + // TODO: Migrate to a better platform API + NoopDrawable d = new NoopDrawable(); + boolean isWork = (d != context.getPackageManager().getUserBadgedIcon(d, user)); + UserIconInfo info = new UserIconInfo( + user, + isWork ? UserIconInfo.TYPE_WORK : UserIconInfo.TYPE_MAIN, + serial); + users.put(user, info); + } } } return users; diff --git a/quickstep/src/com/android/quickstep/TaskIconCache.java b/quickstep/src/com/android/quickstep/TaskIconCache.java index 164a36607d..f0f8aece78 100644 --- a/quickstep/src/com/android/quickstep/TaskIconCache.java +++ b/quickstep/src/com/android/quickstep/TaskIconCache.java @@ -40,6 +40,7 @@ import com.android.launcher3.icons.BaseIconFactory; import com.android.launcher3.icons.BaseIconFactory.IconOptions; import com.android.launcher3.icons.BitmapInfo; import com.android.launcher3.icons.IconProvider; +import com.android.launcher3.pm.UserCache; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.DisplayController.DisplayInfoChangeListener; import com.android.launcher3.util.DisplayController.Info; @@ -233,7 +234,9 @@ public class TaskIconCache implements DisplayInfoChangeListener { } else { try (BaseIconFactory li = getIconFactory()) { BitmapInfo info = mDefaultIconBase.withFlags( - li.getBitmapFlagOp(new IconOptions().setUser(UserHandle.of(userId)))); + li.getBitmapFlagOp(new IconOptions() + .setUser(UserCache.INSTANCE.get(mContext) + .getUserInfo(UserHandle.of(userId))))); mDefaultIcons.put(userId, info); return info.newIcon(mContext); } @@ -249,7 +252,9 @@ public class TaskIconCache implements DisplayInfoChangeListener { // User version code O, so that the icon is always wrapped in an adaptive icon container return bif.createBadgedIconBitmap(drawable, - new IconOptions().setUser(UserHandle.of(userId)) + new IconOptions() + .setUser(UserCache.INSTANCE.get(mContext) + .getUserInfo(UserHandle.of(userId))) .setInstantApp(isInstantApp) .setExtractedColor(0)); } diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index e797147f10..8ba6d2c53e 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -56,7 +56,6 @@ import android.os.Build.VERSION_CODES; import android.os.DeadObjectException; import android.os.Handler; import android.os.Message; -import android.os.Process; import android.os.TransactionTooLargeException; import android.text.Spannable; import android.text.SpannableString; @@ -80,12 +79,15 @@ import androidx.core.graphics.ColorUtils; import com.android.launcher3.dragndrop.FolderAdaptiveIcon; import com.android.launcher3.graphics.TintedDrawableSpan; +import com.android.launcher3.icons.BaseIconFactory; +import com.android.launcher3.icons.BitmapInfo; import com.android.launcher3.icons.LauncherIcons; import com.android.launcher3.icons.ShortcutCachingLogic; import com.android.launcher3.icons.ThemedIconDrawable; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.ItemInfoWithIcon; import com.android.launcher3.pm.ShortcutConfigActivityInfo; +import com.android.launcher3.pm.UserCache; import com.android.launcher3.shortcuts.ShortcutKey; import com.android.launcher3.shortcuts.ShortcutRequest; import com.android.launcher3.testing.shared.ResourceUtils; @@ -674,11 +676,15 @@ public final class Utilities { } if (badge == null) { - badge = Process.myUserHandle().equals(info.user) - ? new ColorDrawable(Color.TRANSPARENT) - : context.getDrawable(useTheme - ? R.drawable.ic_work_app_badge_themed - : R.drawable.ic_work_app_badge); + try (LauncherIcons li = LauncherIcons.obtain(context)) { + badge = BitmapInfo.LOW_RES_INFO.withFlags( + li.getBitmapFlagOp(new BaseIconFactory.IconOptions().setUser( + UserCache.INSTANCE.get(context).getUserInfo(info.user)))) + .getBadgeDrawable(context, useTheme); + } + if (badge == null) { + badge = new ColorDrawable(Color.TRANSPARENT); + } } return Pair.create(result, badge); }