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

Commit 50302a39 authored by Songchun Fan's avatar Songchun Fan
Browse files

[pm] add PackageInfo.getArchiveTimeMillis API

New field to show when the app was archived for a user.

Next step is to reset it to zero after package reinstall.

BUG: 310027113
Test: atest
android.content.pm.cts.PackageInstallerArchiveTest#testGetArchiveTimeMillis

Change-Id: I42abc73c49f2449438212efc89c990b99cfa9bbb
parent e7491875
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -3861,6 +3861,10 @@ package android.content.pm {
    field @RequiresPermission(android.Manifest.permission.ACCESS_SHORTCUTS) public static final int FLAG_GET_PERSONS_DATA = 2048; // 0x800
  }
  public class PackageInfo implements android.os.Parcelable {
    method @FlaggedApi("android.content.pm.archiving") public long getArchiveTimeMillis();
  }
  public class PackageInstaller {
    method @NonNull public android.content.pm.PackageInstaller.InstallInfo readInstallInfo(@NonNull java.io.File, int) throws android.content.pm.PackageInstaller.PackageParsingException;
    method @NonNull public android.content.pm.PackageInstaller.InstallInfo readInstallInfo(@NonNull android.os.ParcelFileDescriptor, @Nullable String, int) throws android.content.pm.PackageInstaller.PackageParsingException;
+31 −0
Original line number Diff line number Diff line
@@ -16,8 +16,11 @@

package android.content.pm;

import android.annotation.CurrentTimeMillisLong;
import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Build;
import android.os.Parcel;
@@ -243,6 +246,14 @@ public class PackageInfo implements Parcelable {
    @Nullable
    public Attribution[] attributions;

    /**
     * The time at which the app was archived for the user.  Units are as
     * per {@link System#currentTimeMillis()}.
     * @hide
     */
    @CurrentTimeMillisLong
    private long mArchiveTimeMillis;

    /**
     * Flag for {@link #requestedPermissionsFlags}: the requested permission
     * is required for the application to run; the user can not optionally
@@ -508,6 +519,24 @@ public class PackageInfo implements Parcelable {
        return overlayTarget != null && mOverlayIsStatic;
    }

    /**
     * Returns the time at which the app was archived for the user.  Units are as
     * per {@link System#currentTimeMillis()}.
     * @hide
     */
    @SystemApi
    @FlaggedApi(Flags.FLAG_ARCHIVING)
    public @CurrentTimeMillisLong long getArchiveTimeMillis() {
        return mArchiveTimeMillis;
    }

    /**
     * @hide
     */
    public void setArchiveTimeMillis(@CurrentTimeMillisLong long value) {
        mArchiveTimeMillis = value;
    }

    @Override
    public String toString() {
        return "PackageInfo{"
@@ -575,6 +604,7 @@ public class PackageInfo implements Parcelable {
        }
        dest.writeBoolean(isApex);
        dest.writeBoolean(isActiveApex);
        dest.writeLong(mArchiveTimeMillis);
        dest.restoreAllowSquashing(prevAllowSquashing);
    }

@@ -640,5 +670,6 @@ public class PackageInfo implements Parcelable {
        }
        isApex = source.readBoolean();
        isActiveApex = source.readBoolean();
        mArchiveTimeMillis = source.readLong();
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -1533,6 +1533,7 @@ public class ComputerEngine implements Computer {
                    ai, flags, state, userId);
            pi.signingInfo = ps.getSigningInfo();
            pi.signatures = getDeprecatedSignatures(pi.signingInfo.getSigningDetails(), flags);
            pi.setArchiveTimeMillis(state.getArchiveTimeMillis());

            if (DEBUG_PACKAGE_INFO) {
                Log.v(TAG, "ps.pkg is n/a for ["
+5 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS;
import static android.content.pm.Flags.sdkLibIndependence;
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_ARCHIVE;
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;
@@ -606,6 +607,10 @@ final class DeletePackageHelper {
                    firstInstallTime,
                    PackageManager.USER_MIN_ASPECT_RATIO_UNSET,
                    archiveState);

            if ((flags & DELETE_ARCHIVE) != 0) {
                ps.modifyUserState(nextUserId).setArchiveTimeMillis(System.currentTimeMillis());
            }
        }
        mPm.mSettings.writeKernelMappingLPr(ps);
    }
+5 −0
Original line number Diff line number Diff line
@@ -768,6 +768,11 @@ public class PackageSetting extends SettingBase implements PackageStateInternal
        onChanged();
    }

    void setArchiveTimeMillis(long value, int userId) {
        modifyUserState(userId).setArchiveTimeMillis(value);
        onChanged();
    }

    boolean getInstalled(int userId) {
        return readUserState(userId).isInstalled();
    }
Loading