From b41314be76e45ffae4b2c8dd773249b036d8e457 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Thu, 4 Apr 2019 16:24:59 -0700 Subject: [PATCH] Defer broadcasting ACTION_DEFERRED_ACTIVITY_CHANGED until actual change Bug: 129906577 Test: Change home app, swipe up Change-Id: I1894cc3b5823dd8468fc41338d2401d97e9b66c2 --- .../content/pm/PackageManagerInternal.java | 4 +++- .../server/pm/PackageManagerService.java | 21 +++++++++++++------ .../server/role/RoleManagerService.java | 11 ++++++---- 3 files changed, 25 insertions(+), 11 deletions(-) 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); } } }