diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index b3cc627712e45..3a739d38ee5d2 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -191,8 +191,10 @@ public abstract class PackageManagerInternal { * * @param packageName package name of the default home, or {@code null} to remove * @param userId the user id + * @param callback the callback made after the default home as been updated */ - void setDefaultHomeAsync(@Nullable String packageName, @UserIdInt int userId); + void setDefaultHomeAsync(@Nullable String packageName, @UserIdInt int userId, + @NonNull Consumer callback); } /** diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 78aa5a0b66d7b..7c1f4b9017a84 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -19473,8 +19473,9 @@ public class PackageManagerService extends IPackageManager.Stub filter.dump(new LogPrinter(Log.INFO, TAG), " "); pir.addFilter(new PreferredActivity(filter, match, set, activity, always)); scheduleWritePackageRestrictionsLocked(userId); - postPreferredActivityChangedBroadcast(userId); - updateDefaultHomeLPw(userId); + if (!updateDefaultHomeLPw(userId)) { + postPreferredActivityChangedBroadcast(userId); + } } } @@ -20253,7 +20254,10 @@ public class PackageManagerService extends IPackageManager.Stub return null; } - private void updateDefaultHomeLPw(int userId) { + /** + * @return Whether the ACTION_PREFERRED_ACTIVITY_CHANGED broadcast has been scheduled. + */ + private boolean updateDefaultHomeLPw(int userId) { Intent intent = getHomeIntent(); List resolveInfos = queryIntentActivitiesInternal(intent, null, PackageManager.GET_META_DATA, userId); @@ -20264,15 +20268,20 @@ public class PackageManagerService extends IPackageManager.Stub ? preferredResolveInfo.activityInfo.packageName : null; String currentPackageName = mDefaultHomeProvider.getDefaultHome(userId); if (TextUtils.equals(currentPackageName, packageName)) { - return; + return false; } String[] callingPackages = getPackagesForUid(Binder.getCallingUid()); if (callingPackages != null && ArrayUtils.contains(callingPackages, mRequiredPermissionControllerPackage)) { // PermissionController manages default home directly. - return; + return false; } - mDefaultHomeProvider.setDefaultHomeAsync(packageName, userId); + mDefaultHomeProvider.setDefaultHomeAsync(packageName, userId, (successful) -> { + if (successful) { + postPreferredActivityChangedBroadcast(userId); + } + }); + return true; } @Override diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java index f4e10ede19d5e..b7e4c46b1ba2a 100644 --- a/services/core/java/com/android/server/role/RoleManagerService.java +++ b/services/core/java/com/android/server/role/RoleManagerService.java @@ -87,6 +87,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.function.Consumer; /** * Service for role management. @@ -787,19 +788,21 @@ public class RoleManagerService extends SystemService implements RoleUserState.C } @Override - public void setDefaultHomeAsync(@Nullable String packageName, @UserIdInt int userId) { - RemoteCallback callback = new RemoteCallback(result -> { + public void setDefaultHomeAsync(@Nullable String packageName, @UserIdInt int userId, + @NonNull Consumer callback) { + RemoteCallback remoteCallback = new RemoteCallback(result -> { boolean successful = result != null; if (!successful) { Slog.e(LOG_TAG, "Failed to set default home: " + packageName); } + callback.accept(successful); }); if (packageName != null) { getOrCreateControllerService(userId).onAddRoleHolder(RoleManager.ROLE_HOME, - packageName, 0, callback); + packageName, 0, remoteCallback); } else { getOrCreateControllerService(userId).onClearRoleHolders(RoleManager.ROLE_HOME, 0, - callback); + remoteCallback); } } }