diff options
3 files changed, 71 insertions, 0 deletions
diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index 6886cdefc28a..f7ff39429ca4 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -997,6 +997,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 f240d85572c4..f9ae9b8f6879 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 965f68bdcaf3..05d96a036060 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -27040,6 +27040,28 @@ public class PackageManagerService extends IPackageManager.Stub } @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) { final PackageSetting ps = getPackageSettingForUser(packageName, filterCallingUid, |