diff options
| author | 2023-09-06 01:19:29 +0000 | |
|---|---|---|
| committer | 2023-09-06 01:19:29 +0000 | |
| commit | d1e5afd5144cc98b718483fe25555e4262f284fb (patch) | |
| tree | 33f773e52e385d9c2dc81b9738ba8aef4537b68e | |
| parent | 809f0523a03fc601e8982c50756e66ff9d650fe3 (diff) | |
| parent | 7079f24d27ef696e5d862eae3abf774922956813 (diff) | |
Merge "[pm] feature flag to turn on new MATCH_UNINSTALLED_PACKAGES behavior" into main
6 files changed, 54 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java index 7cac3e1b9842..88184c0cb490 100644 --- a/services/core/java/com/android/server/pm/PackageSetting.java +++ b/services/core/java/com/android/server/pm/PackageSetting.java @@ -818,7 +818,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal if (userState.isInstalled()) { return true; } - if (userState.getCeDataInode() > 0) { + if (userState.dataExists()) { return true; } } diff --git a/services/core/java/com/android/server/pm/flags.aconfig b/services/core/java/com/android/server/pm/flags.aconfig index 368a8432c805..7779c08e8d5a 100644 --- a/services/core/java/com/android/server/pm/flags.aconfig +++ b/services/core/java/com/android/server/pm/flags.aconfig @@ -6,3 +6,11 @@ flag { description: "Feature flag for Quarantined state" bug: "269127435" } + +flag { + name: "new_match_uninstalled_enabled" + namespace: "package_manager_service" + description: "Feature flag for new MATCH_UNINSTALLED_PACKAGES behavior" + bug: "298681254" + is_fixed_read_only: true +} diff --git a/services/core/java/com/android/server/pm/pkg/PackageUserState.java b/services/core/java/com/android/server/pm/pkg/PackageUserState.java index 7bc518c5516e..c05b3c2be622 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageUserState.java +++ b/services/core/java/com/android/server/pm/pkg/PackageUserState.java @@ -242,4 +242,11 @@ public interface PackageUserState { @Nullable ArchiveState getArchiveState(); + /** + * @return whether the data dir exists. True when the app is installed for the user, or when the + * app is uninstalled for the user with {@link PackageManager#DELETE_KEEP_DATA}. + * + * @hide + */ + boolean dataExists(); } diff --git a/services/core/java/com/android/server/pm/pkg/PackageUserStateDefault.java b/services/core/java/com/android/server/pm/pkg/PackageUserStateDefault.java index 3534d7564c50..fc4b6863b9b8 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageUserStateDefault.java +++ b/services/core/java/com/android/server/pm/pkg/PackageUserStateDefault.java @@ -196,4 +196,9 @@ class PackageUserStateDefault implements PackageUserStateInternal { public ArchiveState getArchiveState() { return null; } + + @Override + public boolean dataExists() { + return true; + } } diff --git a/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java b/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java index 2349fbff11a7..0b35d8ae16ea 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java +++ b/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java @@ -685,6 +685,10 @@ public class PackageUserStateImpl extends WatchableImpl implements PackageUserSt return false; } + @Override + public boolean dataExists() { + return getCeDataInode() > 0; + } diff --git a/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java b/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java index 54f7ebca1b66..9ab3060ce325 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java +++ b/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java @@ -27,6 +27,7 @@ import android.os.Debug; import android.util.DebugUtils; import android.util.Slog; +import com.android.server.pm.Flags; import com.android.server.pm.pkg.component.ParsedMainComponent; /** @hide */ @@ -82,15 +83,38 @@ public class PackageUserStateUtils { return reportIfDebug(matchesUnaware || matchesAware, flags); } + /** + * @return true if any of the following conditions is met: + * <p><ul> + * <li> If it is installed and not hidden for this user; + * <li> If it is installed but hidden for this user, still return true if + * {@link PackageManager#MATCH_UNINSTALLED_PACKAGES} or + * {@link PackageManager#MATCH_ARCHIVED_PACKAGES} is requested; + * <li> If MATCH_ANY_USER is requested, always return true, because the fact that + * this object exists means that the package must be installed or has data on at least one user; + * <li> (When feature enabled) If it is not installed but still has data (i.e., it was + * previously uninstalled with {@link PackageManager#DELETE_KEEP_DATA}), return true if the + * caller requested {@link PackageManager#MATCH_UNINSTALLED_PACKAGES} or + * {@link PackageManager#MATCH_ARCHIVED_PACKAGES}; + * </ul><p> + */ public static boolean isAvailable(@NonNull PackageUserState state, long flags) { - // True if it is installed for this user and it is not hidden. If it is hidden, - // still return true if the caller requested MATCH_UNINSTALLED_PACKAGES final boolean matchAnyUser = (flags & PackageManager.MATCH_ANY_USER) != 0; final boolean matchUninstalled = (flags & PackageManager.MATCH_UNINSTALLED_PACKAGES) != 0; final boolean matchArchived = (flags & PackageManager.MATCH_ARCHIVED_PACKAGES) != 0; - return matchAnyUser - || (state.isInstalled() - && (!state.isHidden() || matchUninstalled || matchArchived)); + final boolean matchDataExists = matchUninstalled || matchArchived; + + if (matchAnyUser) { + return true; + } + if (state.isInstalled()) { + if (!state.isHidden()) { + return true; + } else return matchDataExists; + } else { + // not installed + return matchDataExists && Flags.newMatchUninstalledEnabled() && state.dataExists(); + } } public static boolean reportIfDebug(boolean result, long flags) { |