diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index c29936937ecde..0694c5fc26868 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -63,6 +63,8 @@ public abstract class PackageManagerInternal { public interface PackageListObserver { /** A package was added to the system. */ void onPackageAdded(@NonNull String packageName, int uid); + /** A package was changed - either installed for a specific user or updated. */ + default void onPackageChanged(@NonNull String packageName, int uid) {} /** A package was removed from the system. */ void onPackageRemoved(@NonNull String packageName, int uid); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 88a1ef3e84fa0..5b83f44e55e4e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2155,6 +2155,8 @@ public class PackageManagerService extends IPackageManager.Stub if (allNewUsers && !update) { notifyPackageAdded(packageName, res.uid); + } else { + notifyPackageChanged(packageName, res.uid); } // Log current value of "unknown sources" setting @@ -13761,6 +13763,22 @@ public class PackageManagerService extends IPackageManager.Stub } } + @Override + public void notifyPackageChanged(String packageName, int uid) { + final PackageListObserver[] observers; + synchronized (mPackages) { + if (mPackageListObservers.size() == 0) { + return; + } + final PackageListObserver[] observerArray = + new PackageListObserver[mPackageListObservers.size()]; + observers = mPackageListObservers.toArray(observerArray); + } + for (int i = observers.length - 1; i >= 0; --i) { + observers[i].onPackageChanged(packageName, uid); + } + } + @Override public void notifyPackageRemoved(String packageName, int uid) { final PackageListObserver[] observers; @@ -24987,5 +25005,6 @@ interface PackageSender { void sendPackageAddedForNewUsers(String packageName, boolean sendBootCompleted, boolean includeStopped, int appId, int[] userIds, int[] instantUserIds); void notifyPackageAdded(String packageName, int uid); + void notifyPackageChanged(String packageName, int uid); void notifyPackageRemoved(String packageName, int uid); } diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java index 68728af9528c8..6a03aedbe4f56 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java @@ -59,6 +59,11 @@ public class PackageManagerServiceTest { public void notifyPackageAdded(String packageName, int uid) { } + @Override + public void notifyPackageChanged(String packageName, int uid) { + + } + @Override public void notifyPackageRemoved(String packageName, int uid) { }