diff --git a/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java b/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java index 475f465d0e..2d324079fe 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java +++ b/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java @@ -22,11 +22,17 @@ import android.content.Context; import android.content.pm.LauncherActivityInfo; import android.content.pm.LauncherApps; import android.content.pm.ShortcutInfo; +import android.graphics.drawable.ColorDrawable; +import android.os.UserHandle; +import android.os.UserManager; +import android.util.ArrayMap; import android.window.RemoteTransition; import com.android.launcher3.Utilities; +import com.android.launcher3.util.UserIconInfo; import com.android.quickstep.util.FadeOutRemoteTransition; +import java.util.List; import java.util.Map; /** @@ -53,4 +59,41 @@ public class ApiWrapper { options.setRemoteTransition(new RemoteTransition(new FadeOutRemoteTransition())); return options; } + + /** + * Returns a map of all users on the device to their corresponding UI properties + */ + public static Map queryAllUsers(Context context) { + UserManager um = context.getSystemService(UserManager.class); + Map users = new ArrayMap<>(); + List usersActual = um.getUserProfiles(); + if (usersActual != null) { + for (UserHandle user : usersActual) { + 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); + } + } + return users; + } + + private static class NoopDrawable extends ColorDrawable { + @Override + public int getIntrinsicHeight() { + return 1; + } + + @Override + public int getIntrinsicWidth() { + return 1; + } + } } diff --git a/src/com/android/launcher3/icons/LauncherIcons.java b/src/com/android/launcher3/icons/LauncherIcons.java index 57fa8a256b..a15348bb57 100644 --- a/src/com/android/launcher3/icons/LauncherIcons.java +++ b/src/com/android/launcher3/icons/LauncherIcons.java @@ -20,11 +20,16 @@ import static com.android.launcher3.config.FeatureFlags.ENABLE_FORCED_MONO_ICON; import android.content.Context; import android.graphics.drawable.Drawable; +import android.os.UserHandle; + +import androidx.annotation.NonNull; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.graphics.IconShape; import com.android.launcher3.graphics.LauncherPreviewRenderer; +import com.android.launcher3.pm.UserCache; import com.android.launcher3.util.Themes; +import com.android.launcher3.util.UserIconInfo; /** * Wrapper class to provide access to {@link BaseIconFactory} and also to provide pool of this class @@ -107,6 +112,12 @@ public class LauncherIcons extends BaseIconFactory implements AutoCloseable { return mMonochromeIconFactory.wrap(base); } + @NonNull + @Override + protected UserIconInfo getUserInfo(@NonNull UserHandle user) { + return UserCache.INSTANCE.get(mContext).getUserInfo(user); + } + @Override public void close() { recycle(); diff --git a/src/com/android/launcher3/pm/UserCache.java b/src/com/android/launcher3/pm/UserCache.java index 92822ab79a..e2b12861c4 100644 --- a/src/com/android/launcher3/pm/UserCache.java +++ b/src/com/android/launcher3/pm/UserCache.java @@ -17,6 +17,7 @@ package com.android.launcher3.pm; import static com.android.launcher3.Utilities.ATLEAST_U; +import static com.android.launcher3.uioverrides.ApiWrapper.queryAllUsers; import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; import android.content.Context; @@ -24,7 +25,6 @@ import android.content.Intent; import android.os.Process; import android.os.UserHandle; import android.os.UserManager; -import android.util.ArrayMap; import androidx.annotation.AnyThread; import androidx.annotation.NonNull; @@ -33,6 +33,7 @@ import androidx.annotation.WorkerThread; import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.SafeCloseable; import com.android.launcher3.util.SimpleBroadcastReceiver; +import com.android.launcher3.util.UserIconInfo; import java.util.ArrayList; import java.util.Collections; @@ -65,7 +66,7 @@ public class UserCache implements SafeCloseable { private final Context mContext; @NonNull - private Map mUserToSerialMap; + private Map mUserToSerialMap; private UserCache(Context context) { mContext = context; @@ -103,7 +104,7 @@ public class UserCache implements SafeCloseable { @WorkerThread private void updateCache() { - mUserToSerialMap = queryAllUsers(mContext.getSystemService(UserManager.class)); + mUserToSerialMap = queryAllUsers(mContext); } /** @@ -118,19 +119,26 @@ public class UserCache implements SafeCloseable { * @see UserManager#getSerialNumberForUser(UserHandle) */ public long getSerialNumberForUser(UserHandle user) { - Long serial = mUserToSerialMap.get(user); - return serial == null ? 0 : serial; + return getUserInfo(user).userSerial; + } + + /** + * Returns the user properties for the provided user or default values + */ + @NonNull + public UserIconInfo getUserInfo(UserHandle user) { + UserIconInfo info = mUserToSerialMap.get(user); + return info == null ? new UserIconInfo(user, UserIconInfo.TYPE_MAIN) : info; } /** * @see UserManager#getUserForSerialNumber(long) */ public UserHandle getUserForSerialNumber(long serialNumber) { - Long value = serialNumber; return mUserToSerialMap .entrySet() .stream() - .filter(entry -> value.equals(entry.getValue())) + .filter(entry -> serialNumber == entry.getValue().userSerial) .findFirst() .map(Map.Entry::getKey) .orElse(Process.myUserHandle()); @@ -142,16 +150,4 @@ public class UserCache implements SafeCloseable { public List getUserProfiles() { return List.copyOf(mUserToSerialMap.keySet()); } - - private static Map queryAllUsers(UserManager userManager) { - Map users = new ArrayMap<>(); - List usersActual = userManager.getUserProfiles(); - if (usersActual != null) { - for (UserHandle user : usersActual) { - long serial = userManager.getSerialNumberForUser(user); - users.put(user, serial); - } - } - return users; - } } diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java b/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java index 599a59154a..fe5c1fd000 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java @@ -21,10 +21,16 @@ import android.app.Person; import android.content.Context; import android.content.pm.LauncherActivityInfo; import android.content.pm.ShortcutInfo; +import android.graphics.drawable.ColorDrawable; +import android.os.UserHandle; +import android.os.UserManager; +import android.util.ArrayMap; import com.android.launcher3.Utilities; +import com.android.launcher3.util.UserIconInfo; import java.util.Collections; +import java.util.List; import java.util.Map; /** @@ -48,4 +54,41 @@ public class ApiWrapper { public static ActivityOptions createFadeOutAnimOptions(Context context) { return ActivityOptions.makeCustomAnimation(context, 0, android.R.anim.fade_out); } + + /** + * Returns a map of all users on the device to their corresponding UI properties + */ + public static Map queryAllUsers(Context context) { + UserManager um = context.getSystemService(UserManager.class); + Map users = new ArrayMap<>(); + List usersActual = um.getUserProfiles(); + if (usersActual != null) { + for (UserHandle user : usersActual) { + 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); + } + } + return users; + } + + private static class NoopDrawable extends ColorDrawable { + @Override + public int getIntrinsicHeight() { + return 1; + } + + @Override + public int getIntrinsicWidth() { + return 1; + } + } }