diff options
4 files changed, 65 insertions, 12 deletions
| diff --git a/services/core/java/com/android/server/pm/Computer.java b/services/core/java/com/android/server/pm/Computer.java index 79cd2a0b236f..92d469ccbfac 100644 --- a/services/core/java/com/android/server/pm/Computer.java +++ b/services/core/java/com/android/server/pm/Computer.java @@ -259,6 +259,19 @@ public interface Computer extends PackageDataSnapshot {       */      boolean shouldFilterApplicationIncludingUninstalled(@Nullable PackageStateInternal ps,              int callingUid, int userId); + +    /** +     * Different from +     * {@link #shouldFilterApplicationIncludingUninstalled(PackageStateInternal, int, int)}, the +     * function returns {@code true} if: +     * <ul> +     * <li>The target package is not archived. +     * <li>The package cannot be found in the device or has been uninstalled in the current user. +     * </ul> +     */ +    boolean shouldFilterApplicationIncludingUninstalledNotArchived( +            @Nullable PackageStateInternal ps, +            int callingUid, int userId);      /**       * Different from {@link #shouldFilterApplication(SharedUserSetting, int, int)}, the function       * returns {@code true} if packages with the same shared user are all uninstalled in the current diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java index 11a6d1b8f9a4..e5c4ccc73bc3 100644 --- a/services/core/java/com/android/server/pm/ComputerEngine.java +++ b/services/core/java/com/android/server/pm/ComputerEngine.java @@ -2455,7 +2455,8 @@ public class ComputerEngine implements Computer {       */      public final boolean shouldFilterApplication(@Nullable PackageStateInternal ps,              int callingUid, @Nullable ComponentName component, -            @PackageManager.ComponentType int componentType, int userId, boolean filterUninstall) { +            @PackageManager.ComponentType int componentType, int userId, boolean filterUninstall, +            boolean filterArchived) {          if (Process.isSdkSandboxUid(callingUid)) {              int clientAppUid = Process.getAppUidForSdkSandboxUid(callingUid);              // SDK sandbox should be able to see it's client app @@ -2469,14 +2470,20 @@ public class ComputerEngine implements Computer {          }          final String instantAppPkgName = getInstantAppPackageName(callingUid);          final boolean callerIsInstantApp = instantAppPkgName != null; +        final boolean packageArchivedForUser = ps != null && PackageArchiver.isArchived( +                ps.getUserStateOrDefault(userId));          // Don't treat hiddenUntilInstalled as an uninstalled state, phone app needs to access          // these hidden application details to customize carrier apps. Also, allowing the system          // caller accessing to application across users.          if (ps == null                  || (filterUninstall -                        && !isSystemOrRootOrShell(callingUid) -                        && !ps.isHiddenUntilInstalled() -                        && !ps.getUserStateOrDefault(userId).isInstalled())) { +                && !isSystemOrRootOrShell(callingUid) +                && !ps.isHiddenUntilInstalled() +                && !ps.getUserStateOrDefault(userId).isInstalled() +                // Archived packages behave like uninstalled packages. So if filterUninstall is +                // set to true, we dismiss filtering some uninstalled package only if it is +                // archived and filterArchived is set as false. +                && (!packageArchivedForUser || filterArchived))) {              // If caller is instant app or sdk sandbox and ps is null, pretend the application              // exists, but, needs to be filtered              return (callerIsInstantApp || filterUninstall || Process.isSdkSandboxUid(callingUid)); @@ -2524,7 +2531,20 @@ public class ComputerEngine implements Computer {      }      /** -     * @see #shouldFilterApplication(PackageStateInternal, int, ComponentName, int, int, boolean) +     * @see #shouldFilterApplication(PackageStateInternal, int, ComponentName, int, int, boolean, +     * boolean) +     */ +    public final boolean shouldFilterApplication(@Nullable PackageStateInternal ps, +            int callingUid, @Nullable ComponentName component, +            @PackageManager.ComponentType int componentType, int userId, boolean filterUninstall) { +        return shouldFilterApplication( +                ps, callingUid, component, componentType, userId, filterUninstall, +                true /* filterArchived */); +    } + +    /** +     * @see #shouldFilterApplication(PackageStateInternal, int, ComponentName, int, int, boolean, +     * boolean)       */      public final boolean shouldFilterApplication(@Nullable PackageStateInternal ps,              int callingUid, @Nullable ComponentName component, @@ -2534,7 +2554,8 @@ public class ComputerEngine implements Computer {      }      /** -     * @see #shouldFilterApplication(PackageStateInternal, int, ComponentName, int, int, boolean) +     * @see #shouldFilterApplication(PackageStateInternal, int, ComponentName, int, int, boolean, +     * boolean)       */      public final boolean shouldFilterApplication(              @Nullable PackageStateInternal ps, int callingUid, int userId) { @@ -2543,7 +2564,8 @@ public class ComputerEngine implements Computer {      }      /** -     * @see #shouldFilterApplication(PackageStateInternal, int, ComponentName, int, int, boolean) +     * @see #shouldFilterApplication(PackageStateInternal, int, ComponentName, int, int, boolean, +     * boolean)       */      public final boolean shouldFilterApplication(@NonNull SharedUserSetting sus,              int callingUid, int userId) { @@ -2558,7 +2580,8 @@ public class ComputerEngine implements Computer {      }      /** -     * @see #shouldFilterApplication(PackageStateInternal, int, ComponentName, int, int, boolean) +     * @see #shouldFilterApplication(PackageStateInternal, int, ComponentName, int, int, boolean, +     * boolean)       */      public final boolean shouldFilterApplicationIncludingUninstalled(              @Nullable PackageStateInternal ps, int callingUid, int userId) { @@ -2567,7 +2590,19 @@ public class ComputerEngine implements Computer {      }      /** -     * @see #shouldFilterApplication(PackageStateInternal, int, ComponentName, int, int, boolean) +     * @see #shouldFilterApplication(PackageStateInternal, int, ComponentName, int, int, boolean, +     * boolean) +     */ +    public final boolean shouldFilterApplicationIncludingUninstalledNotArchived( +            @Nullable PackageStateInternal ps, int callingUid, int userId) { +        return shouldFilterApplication( +                ps, callingUid, null, TYPE_UNKNOWN, userId, true /* filterUninstall */, +                false /* filterArchived */); +    } + +    /** +     * @see #shouldFilterApplication(PackageStateInternal, int, ComponentName, int, int, boolean, +     * boolean)       */      public final boolean shouldFilterApplicationIncludingUninstalled(              @NonNull SharedUserSetting sus, int callingUid, int userId) { @@ -5015,7 +5050,7 @@ public class ComputerEngine implements Computer {          String installerPackageName = installSource.mInstallerPackageName;          if (installerPackageName != null) {              final PackageStateInternal ps = mSettings.getPackage(installerPackageName); -            if (ps == null || shouldFilterApplicationIncludingUninstalled(ps, callingUid, +            if (ps == null || shouldFilterApplicationIncludingUninstalledNotArchived(ps, callingUid,                      UserHandle.getUserId(callingUid))) {                  installerPackageName = null;              } @@ -5033,7 +5068,8 @@ public class ComputerEngine implements Computer {              return InstallSource.EMPTY;          } -        if (ps == null || shouldFilterApplicationIncludingUninstalled(ps, callingUid, userId)) { +        if (ps == null || shouldFilterApplicationIncludingUninstalledNotArchived(ps, callingUid, +                userId)) {              return null;          } diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java index 65c6329587a5..3b3d79e7dee1 100644 --- a/services/core/java/com/android/server/pm/DeletePackageHelper.java +++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java @@ -440,7 +440,7 @@ final class DeletePackageHelper {          if (outInfo != null) {              // Remember which users are affected, before the installed states are modified              outInfo.mRemovedUsers = (systemApp || userId == UserHandle.USER_ALL) -                    ? ps.queryInstalledUsers(allUserHandles, /* installed= */true) +                    ? ps.queryUsersInstalledOrHasData(allUserHandles)                      : new int[]{userId};          } diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java index 72090f24a2ed..b50d0a07aa3a 100644 --- a/services/core/java/com/android/server/pm/PackageSetting.java +++ b/services/core/java/com/android/server/pm/PackageSetting.java @@ -779,6 +779,10 @@ public class PackageSetting extends SettingBase implements PackageStateInternal          return readUserState(userId).isInstalled();      } +    boolean isArchived(int userId) { +        return PackageArchiver.isArchived(readUserState(userId)); +    } +      int getInstallReason(int userId) {          return readUserState(userId).getInstallReason();      } |