diff options
author | 2024-09-10 19:20:42 +0000 | |
---|---|---|
committer | 2024-11-13 21:35:05 +0000 | |
commit | 39dee43e12e27171cd13cbb6a7c397fd96fc2da2 (patch) | |
tree | 87f1200d4f6f6b76e4e16f0d29d05b2c7cb15828 | |
parent | be17fb8a6337a43cae4d7b5db7aef38965346f40 (diff) |
Listen to LauncherUserInfo config changes and hide/unhide private space
entrypoint accordingly
Flag: android.multiuser.add_launcher_user_config
Bug: 346553745
Test: Manual - verified on device
Test: atest LauncherAppsTests
Change-Id: I202c4c76af4f96d5b3226daffcfebc2f9b9703b1
-rw-r--r-- | Android.bp | 1 | ||||
-rw-r--r-- | quickstep/src/com/android/launcher3/uioverrides/SystemApiWrapper.kt | 28 | ||||
-rw-r--r-- | src/com/android/launcher3/LauncherAppState.java | 4 | ||||
-rw-r--r-- | src/com/android/launcher3/allapps/PrivateProfileManager.java | 19 | ||||
-rw-r--r-- | src/com/android/launcher3/model/ModelLauncherCallbacks.kt | 14 | ||||
-rw-r--r-- | src/com/android/launcher3/pm/UserCache.java | 5 | ||||
-rw-r--r-- | src/com/android/launcher3/util/ApiWrapper.java | 33 |
7 files changed, 80 insertions, 24 deletions
diff --git a/Android.bp b/Android.bp index 73d0fce260..df9615631f 100644 --- a/Android.bp +++ b/Android.bp @@ -25,6 +25,7 @@ java_defaults { name: "launcher-non-platform-apis-defaults", static_libs: [ "android.os.flags-aconfig-java", + "android.multiuser.flags-aconfig-java", "android.appwidget.flags-aconfig-java", "com.android.window.flags.window-aconfig-java", ], diff --git a/quickstep/src/com/android/launcher3/uioverrides/SystemApiWrapper.kt b/quickstep/src/com/android/launcher3/uioverrides/SystemApiWrapper.kt index 374db6ae6f..2946242ac7 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/SystemApiWrapper.kt +++ b/quickstep/src/com/android/launcher3/uioverrides/SystemApiWrapper.kt @@ -27,6 +27,7 @@ import android.content.pm.ApplicationInfo import android.content.pm.LauncherActivityInfo import android.content.pm.LauncherApps import android.content.pm.ShortcutInfo +import android.multiuser.Flags.addLauncherUserConfig import android.os.Bundle import android.os.Flags.allowPrivateProfile import android.os.IBinder @@ -74,16 +75,14 @@ open class SystemApiWrapper @Inject constructor(@ApplicationContext context: Con mContext.getSystemService(UserManager::class.java)!!.userProfiles?.forEach { user -> mContext.getSystemService(LauncherApps::class.java)!!.getLauncherUserInfo(user)?.apply { users[user] = - UserIconInfo( - user, - when (userType) { - UserManager.USER_TYPE_PROFILE_MANAGED -> UserIconInfo.TYPE_WORK - UserManager.USER_TYPE_PROFILE_CLONE -> UserIconInfo.TYPE_CLONED - UserManager.USER_TYPE_PROFILE_PRIVATE -> UserIconInfo.TYPE_PRIVATE - else -> UserIconInfo.TYPE_MAIN - }, - userSerialNumber.toLong(), - ) + if (addLauncherUserConfig()) + UserIconInfo( + user, + getUserIconType(userType), + userSerialNumber.toLong(), + userConfig, + ) + else UserIconInfo(user, getUserIconType(userType), userSerialNumber.toLong()) } } return users @@ -192,4 +191,13 @@ open class SystemApiWrapper @Inject constructor(@ApplicationContext context: Con override fun getApplicationInfoHash(appInfo: ApplicationInfo): String = (appInfo.sourceDir?.hashCode() ?: 0).toString() + " " + appInfo.longVersionCode + + fun getUserIconType(userType: String): Int { + return when (userType) { + UserManager.USER_TYPE_PROFILE_MANAGED -> UserIconInfo.TYPE_WORK + UserManager.USER_TYPE_PROFILE_CLONE -> UserIconInfo.TYPE_CLONED + UserManager.USER_TYPE_PROFILE_PRIVATE -> UserIconInfo.TYPE_PRIVATE + else -> UserIconInfo.TYPE_MAIN + } + } } diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java index 01d0a740d7..3936fe6564 100644 --- a/src/com/android/launcher3/LauncherAppState.java +++ b/src/com/android/launcher3/LauncherAppState.java @@ -188,7 +188,9 @@ public class LauncherAppState implements SafeCloseable { mOnTerminateCallback.add(() -> settingsCache.unregister(NOTIFICATION_BADGING_URI, notificationLister)); // Register an observer to notify Launcher about Private Space settings toggle. - registerPrivateSpaceHideWhenLockListener(settingsCache); + if (!android.multiuser.Flags.addLauncherUserConfig()) { + registerPrivateSpaceHideWhenLockListener(settingsCache); + } } public LauncherAppState(Context context, @Nullable String iconCacheFileName) { diff --git a/src/com/android/launcher3/allapps/PrivateProfileManager.java b/src/com/android/launcher3/allapps/PrivateProfileManager.java index 21dce14bbf..e1c1b39493 100644 --- a/src/com/android/launcher3/allapps/PrivateProfileManager.java +++ b/src/com/android/launcher3/allapps/PrivateProfileManager.java @@ -16,6 +16,7 @@ package com.android.launcher3.allapps; +import static android.content.pm.LauncherUserInfo.PRIVATE_SPACE_ENTRYPOINT_HIDDEN; import static android.view.View.GONE; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; @@ -43,6 +44,7 @@ import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; +import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.os.UserHandle; @@ -78,11 +80,13 @@ import com.android.launcher3.pm.UserCache; import com.android.launcher3.util.ApiWrapper; import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.SettingsCache; +import com.android.launcher3.util.UserIconInfo; import com.android.launcher3.views.ActivityContext; import com.android.launcher3.views.RecyclerViewFastScroller; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.function.Predicate; /** @@ -209,9 +213,20 @@ public class PrivateProfileManager extends UserProfileManager { } /** Whether private profile should be hidden on Launcher. */ + @SuppressLint("NewApi") public boolean isPrivateSpaceHidden() { - return getCurrentState() == STATE_DISABLED && SettingsCache.INSTANCE - .get(mAllApps.getContext()).getValue(PRIVATE_SPACE_HIDE_WHEN_LOCKED_URI, 0); + UserHandle profileHandle = getProfileUser(); + if (android.multiuser.Flags.addLauncherUserConfig() && !Objects.isNull(profileHandle)) { + UserIconInfo userInconInfo = UserCache.INSTANCE.get(mAllApps.getContext()).getUserInfo( + profileHandle); + + return getCurrentState() == STATE_DISABLED && userInconInfo.getUserConfig().getBoolean( + PRIVATE_SPACE_ENTRYPOINT_HIDDEN, false); + } + + return getCurrentState() == STATE_DISABLED && SettingsCache.INSTANCE.get( + mAllApps.getContext()).getValue(PRIVATE_SPACE_HIDE_WHEN_LOCKED_URI, 0); + } /** diff --git a/src/com/android/launcher3/model/ModelLauncherCallbacks.kt b/src/com/android/launcher3/model/ModelLauncherCallbacks.kt index 7ba2dad553..ba4908ca8a 100644 --- a/src/com/android/launcher3/model/ModelLauncherCallbacks.kt +++ b/src/com/android/launcher3/model/ModelLauncherCallbacks.kt @@ -16,7 +16,9 @@ package com.android.launcher3.model +import android.annotation.SuppressLint import android.content.pm.LauncherApps +import android.content.pm.LauncherUserInfo import android.content.pm.PackageInstaller.SessionInfo import android.content.pm.ShortcutInfo import android.os.UserHandle @@ -32,6 +34,7 @@ import com.android.launcher3.model.PackageUpdatedTask.OP_UNSUSPEND import com.android.launcher3.model.PackageUpdatedTask.OP_UPDATE import com.android.launcher3.pm.InstallSessionTracker import com.android.launcher3.pm.PackageInstallInfo +import com.android.launcher3.pm.UserCache import com.android.launcher3.util.PackageUserKey import java.util.function.Consumer @@ -134,6 +137,17 @@ class ModelLauncherCallbacks(private var taskExecutor: Consumer<ModelUpdateTask> } } + @SuppressLint("NewApi") + override fun onUserConfigChanged(launcherUserInfo: LauncherUserInfo) { + FileLog.d(TAG, "onUserConfigChanged for user ${launcherUserInfo.userType}") + if (android.multiuser.Flags.addLauncherUserConfig()) { + taskExecutor.accept { taskController, _, _ -> + UserCache.INSTANCE.get(taskController.app.context).updateCache() + taskController.app.model.forceReload() + } + } + } + companion object { private const val TAG = "LauncherAppsCallbackImpl" } diff --git a/src/com/android/launcher3/pm/UserCache.java b/src/com/android/launcher3/pm/UserCache.java index e8619610a8..69f4469e02 100644 --- a/src/com/android/launcher3/pm/UserCache.java +++ b/src/com/android/launcher3/pm/UserCache.java @@ -26,7 +26,6 @@ import android.os.UserHandle; import android.os.UserManager; import android.util.ArrayMap; -import androidx.annotation.AnyThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -111,7 +110,7 @@ public class UserCache implements SafeCloseable { updateCache(); } - @AnyThread + @WorkerThread private void onUsersChanged(Intent intent) { MODEL_EXECUTOR.execute(this::updateCache); UserHandle user = intent.getParcelableExtra(Intent.EXTRA_USER); @@ -123,7 +122,7 @@ public class UserCache implements SafeCloseable { } @WorkerThread - private void updateCache() { + public void updateCache() { mUserToSerialMap = ApiWrapper.INSTANCE.get(mContext).queryAllUsers(); mUserToPreInstallAppMap = fetchPreInstallApps(); } diff --git a/src/com/android/launcher3/util/ApiWrapper.java b/src/com/android/launcher3/util/ApiWrapper.java index 467a7ec54f..35fc9f5d80 100644 --- a/src/com/android/launcher3/util/ApiWrapper.java +++ b/src/com/android/launcher3/util/ApiWrapper.java @@ -16,8 +16,11 @@ package com.android.launcher3.util; +import static android.multiuser.Flags.addLauncherUserConfig; + import static com.android.launcher3.LauncherConstants.ActivityCodes.REQUEST_HOME_ROLE; +import android.annotation.SuppressLint; import android.app.ActivityOptions; import android.app.Person; import android.app.role.RoleManager; @@ -25,9 +28,12 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; 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.net.Uri; +import android.os.Build; import android.os.UserHandle; import android.os.UserManager; import android.util.ArrayMap; @@ -45,6 +51,7 @@ import com.android.launcher3.dagger.LauncherAppSingleton; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Objects; import javax.inject.Inject; @@ -85,22 +92,32 @@ public class ApiWrapper { /** * Returns a map of all users on the device to their corresponding UI properties */ + @SuppressLint("NewApi") public Map<UserHandle, UserIconInfo> queryAllUsers() { UserManager um = mContext.getSystemService(UserManager.class); Map<UserHandle, UserIconInfo> users = new ArrayMap<>(); List<UserHandle> 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 != mContext.getPackageManager().getUserBadgedIcon(d, user)); - UserIconInfo info = new UserIconInfo( - user, - isWork ? UserIconInfo.TYPE_WORK : UserIconInfo.TYPE_MAIN, - serial); + UserIconInfo info; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { + LauncherUserInfo userInfo = Objects.requireNonNull( + mContext.getSystemService(LauncherApps.class)).getLauncherUserInfo( + user); + long serial = Objects.requireNonNull(userInfo).getUserSerialNumber(); + info = addLauncherUserConfig() ? new UserIconInfo(user, + isWork ? UserIconInfo.TYPE_WORK : UserIconInfo.TYPE_MAIN, serial, + userInfo.getUserConfig()) : new UserIconInfo(user, + isWork ? UserIconInfo.TYPE_WORK : UserIconInfo.TYPE_MAIN, 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 + info = new UserIconInfo(user, + isWork ? UserIconInfo.TYPE_WORK : UserIconInfo.TYPE_MAIN, serial); + } users.put(user, info); } } |