From 3971d145c9ee9bc448de78ddf18fb991e4618652 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Tue, 9 Feb 2021 02:03:48 +0000 Subject: [PATCH] [pm/launcher] add back progress listening in PackageManagerInternal (This partially reverts ag/13481636) Turns out Launcher still uses LauncherApps.onPackageLoadingProgressChanged(), which relies on the internal listener exposed via PackageManagerInternal. Adding it back. We don't need the unregister method, because all the progress listeners will be automatically removed when the app is fully loaded. BUG: 175135603 Test: manual with incremental install via Phonesky Change-Id: Ief09d3c7775080f35568b6ec51d6351a9373f04e --- .../content/pm/PackageManagerInternal.java | 12 ++++++ .../server/pm/LauncherAppsService.java | 37 +++++++++++++++++++ .../server/pm/PackageManagerService.java | 22 +++++++++++ 3 files changed, 71 insertions(+) diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index 6886cdefc28ad..f7ff39429ca47 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -996,6 +996,18 @@ public abstract class PackageManagerInternal { */ public abstract boolean isSuspendingAnyPackages(String suspendingPackage, int userId); + /** + * Register to listen for loading progress of an installed package. + * The listener is automatically unregistered when the app is fully loaded. + * @param packageName The name of the installed package + * @param callback To loading reporting progress + * @param userId The user under which to check. + * @return Whether the registration was successful. It can fail if the package has not been + * installed yet. + */ + public abstract boolean registerInstalledLoadingProgressCallback(@NonNull String packageName, + @NonNull InstalledLoadingProgressCallback callback, int userId); + /** * Returns the string representation of a known package. For example, * {@link #PACKAGE_SETUP_WIZARD} is represented by the string Setup Wizard. diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index f240d85572c43..f9ae9b8f6879b 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -1317,6 +1317,10 @@ public class LauncherAppsService extends SystemService { mListeners.finishBroadcast(); } super.onPackageAdded(packageName, uid); + PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class); + pmi.registerInstalledLoadingProgressCallback(packageName, + new PackageLoadingProgressCallback(packageName, user), + user.getIdentifier()); } @Override @@ -1538,5 +1542,38 @@ public class LauncherAppsService extends SystemService { checkCallbackCount(); } } + + class PackageLoadingProgressCallback extends + PackageManagerInternal.InstalledLoadingProgressCallback { + private String mPackageName; + private UserHandle mUser; + + PackageLoadingProgressCallback(String packageName, UserHandle user) { + super(mCallbackHandler); + mPackageName = packageName; + mUser = user; + } + + @Override + public void onLoadingProgressChanged(float progress) { + final int n = mListeners.beginBroadcast(); + try { + for (int i = 0; i < n; i++) { + IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); + BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(cookie.user, mUser, "onLoadingProgressChanged")) { + continue; + } + try { + listener.onPackageLoadingProgressChanged(mUser, mPackageName, progress); + } catch (RemoteException re) { + Slog.d(TAG, "Callback failed ", re); + } + } + } finally { + mListeners.finishBroadcast(); + } + } + } } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 965f68bdcaf32..05d96a036060a 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -27039,6 +27039,28 @@ public class PackageManagerService extends IPackageManager.Stub return PackageManagerService.this.isSuspendingAnyPackages(suspendingPackage, userId); } + @Override + public boolean registerInstalledLoadingProgressCallback(String packageName, + PackageManagerInternal.InstalledLoadingProgressCallback callback, int userId) { + final PackageSetting ps = getPackageSettingForUser(packageName, Binder.getCallingUid(), + userId); + if (ps == null) { + return false; + } + if (!ps.isPackageLoading()) { + Slog.w(TAG, + "Failed registering loading progress callback. Package is fully loaded."); + return false; + } + if (mIncrementalManager == null) { + Slog.w(TAG, + "Failed registering loading progress callback. Incremental is not enabled"); + return false; + } + return mIncrementalManager.registerLoadingProgressCallback(ps.getPathString(), + (IPackageLoadingProgressCallback) callback.getBinder()); + } + @Override public IncrementalStatesInfo getIncrementalStatesInfo( @NonNull String packageName, int filterCallingUid, int userId) {