diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 3b3e0704606e9..b199984740f24 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -698,7 +698,13 @@ public class ApplicationPackageManager extends PackageManager { @SuppressWarnings("unchecked") @Override public List getInstalledApplications(int flags) { - final int userId = mContext.getUserId(); + return getInstalledApplicationsAsUser(flags, mContext.getUserId()); + } + + /** @hide */ + @SuppressWarnings("unchecked") + @Override + public List getInstalledApplicationsAsUser(int flags, int userId) { try { ParceledListSlice parceledList = mPM.getInstalledApplications(flags, userId); diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 052fa61f5a5c0..b3dd0e56caf9c 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -3513,6 +3513,36 @@ public abstract class PackageManager { */ public abstract List getInstalledApplications(@ApplicationInfoFlags int flags); + /** + * Return a List of all application packages that are installed on the device, for a specific + * user. If flag GET_UNINSTALLED_PACKAGES has been set, a list of all applications including + * those deleted with {@code DONT_DELETE_DATA} (partially installed apps with data directory) + * will be returned. + * + * @param flags Additional option flags. Use any combination of + * {@link #GET_META_DATA}, {@link #GET_SHARED_LIBRARY_FILES}, + * {@link #MATCH_SYSTEM_ONLY}, {@link #MATCH_UNINSTALLED_PACKAGES} + * to modify the data returned. + * @param userId The user for whom the installed applications are to be listed + * + * @return A List of ApplicationInfo objects, one for each installed application. + * In the unlikely case there are no installed packages, an empty list + * is returned. If flag {@code MATCH_UNINSTALLED_PACKAGES} is set, the + * application information is retrieved from the list of uninstalled + * applications (which includes installed applications as well as + * applications with data directory i.e. applications which had been + * deleted with {@code DONT_DELETE_DATA} flag set). + * @hide + * + * @see #GET_META_DATA + * @see #GET_SHARED_LIBRARY_FILES + * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS + * @see #MATCH_SYSTEM_ONLY + * @see #MATCH_UNINSTALLED_PACKAGES + */ + public abstract List getInstalledApplicationsAsUser( + @ApplicationInfoFlags int flags, @UserIdInt int userId); + /** * Gets the ephemeral applications the user recently used. Requires * holding "android.permission.ACCESS_EPHEMERAL_APPS". diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java index 330dbab5bab33..fee3aa508810b 100644 --- a/test-runner/src/android/test/mock/MockPackageManager.java +++ b/test-runner/src/android/test/mock/MockPackageManager.java @@ -314,6 +314,12 @@ public class MockPackageManager extends PackageManager { throw new UnsupportedOperationException(); } + /** @hide */ + @Override + public List getInstalledApplicationsAsUser(int flags, int userId) { + throw new UnsupportedOperationException(); + } + /** @hide */ @Override public List getEphemeralApplications() { diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java index b3ed9e1a01649..0b169bd474c6b 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java @@ -271,6 +271,11 @@ public class BridgePackageManager extends PackageManager { return null; } + @Override + public List getInstalledApplicationsAsUser(int flags, int userId) { + return null; + } + @Override public List getEphemeralApplications() { return null;