Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b2b06c6d authored by Jakob Schneider's avatar Jakob Schneider
Browse files

Bugfix to preserve archiveState during uninstall. Split out of the child CL at reviewer request.

Test: ArchiveManagerTest (covered in CTS test of child CL)
Bug: 290776158
Change-Id: I706079cc972c128f6b79ced651474b3cc7dff1c3
parent 7db0d77d
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static android.Manifest.permission.CONTROL_KEYGUARD;
import static android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
import static android.content.pm.PackageManager.DELETE_KEEP_DATA;
import static android.content.pm.PackageManager.DELETE_SUCCEEDED;
import static android.content.pm.PackageManager.MATCH_KNOWN_PACKAGES;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
@@ -66,6 +67,7 @@ import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import com.android.server.pm.pkg.AndroidPackage;
import com.android.server.pm.pkg.ArchiveState;
import com.android.server.pm.pkg.PackageStateInternal;
import com.android.server.pm.pkg.PackageUserState;
import com.android.server.wm.ActivityTaskManagerInternal;
@@ -454,7 +456,7 @@ final class DeletePackageHelper {
            // semantics than normal for uninstalling system apps.
            final boolean clearPackageStateAndReturn;
            synchronized (mPm.mLock) {
                markPackageUninstalledForUserLPw(ps, user);
                markPackageUninstalledForUserLPw(ps, user, flags);
                if (!systemApp) {
                    // Do not uninstall the APK if an app should be cached
                    boolean keepUninstalledPackage =
@@ -607,7 +609,7 @@ final class DeletePackageHelper {
    }

    @GuardedBy("mPm.mLock")
    private void markPackageUninstalledForUserLPw(PackageSetting ps, UserHandle user) {
    private void markPackageUninstalledForUserLPw(PackageSetting ps, UserHandle user, int flags) {
        final int[] userIds = (user == null || user.getIdentifier() == UserHandle.USER_ALL)
                ? mUserManagerInternal.getUserIds()
                : new int[] {user.getIdentifier()};
@@ -616,6 +618,12 @@ final class DeletePackageHelper {
                Slog.d(TAG, "Marking package:" + ps.getPackageName()
                        + " uninstalled for user:" + nextUserId);
            }
            // Preserve ArchiveState if this is not a full uninstall
            ArchiveState archiveState =
                    (flags & DELETE_KEEP_DATA) == 0
                            ? null
                            : ps.getUserStateOrDefault(nextUserId).getArchiveState();

            ps.setUserState(nextUserId,
                    ps.getCeDataInode(nextUserId),
                    COMPONENT_ENABLED_STATE_DEFAULT,
@@ -636,7 +644,7 @@ final class DeletePackageHelper {
                    null /*splashScreenTheme*/,
                    0 /*firstInstallTime*/,
                    PackageManager.USER_MIN_ASPECT_RATIO_UNSET,
                    null /*archiveState*/);
                    archiveState);
        }
        mPm.mSettings.writeKernelMappingLPr(ps);
    }