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

Commit 69ea974f authored by Jeff Sharkey's avatar Jeff Sharkey Committed by Android (Google) Code Review
Browse files

Merge "Public API for PackageInstaller!" into lmp-dev

parents 969167dc 6c833e07
Loading
Loading
Loading
Loading
+78 −0
Original line number Original line Diff line number Diff line
@@ -8358,6 +8358,36 @@ package android.content.pm {
    field public int reqGlEsVersion;
    field public int reqGlEsVersion;
  }
  }
  public class InstallSessionInfo implements android.os.Parcelable {
    method public int describeContents();
    method public android.graphics.Bitmap getIcon();
    method public java.lang.String getInstallerPackageName();
    method public java.lang.String getPackageName();
    method public int getProgress();
    method public int getSessionId();
    method public java.lang.CharSequence getTitle();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator CREATOR;
  }
  public class InstallSessionParams implements android.os.Parcelable {
    ctor public InstallSessionParams();
    method public int describeContents();
    method public void setDeltaSize(long);
    method public void setIcon(android.graphics.Bitmap);
    method public void setInstallLocation(int);
    method public void setModeFullInstall();
    method public void setModeInheritExisting();
    method public void setOriginatingUri(android.net.Uri);
    method public void setPackageName(java.lang.String);
    method public void setProgressMax(int);
    method public void setReferrerUri(android.net.Uri);
    method public void setSignatures(android.content.pm.Signature[]);
    method public void setTitle(java.lang.CharSequence);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator CREATOR;
  }
  public class InstrumentationInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
  public class InstrumentationInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
    ctor public InstrumentationInfo();
    ctor public InstrumentationInfo();
    ctor public InstrumentationInfo(android.content.pm.InstrumentationInfo);
    ctor public InstrumentationInfo(android.content.pm.InstrumentationInfo);
@@ -8425,6 +8455,9 @@ package android.content.pm {
    method public int describeContents();
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator CREATOR;
    field public static final android.os.Parcelable.Creator CREATOR;
    field public static final int INSTALL_LOCATION_AUTO = 0; // 0x0
    field public static final int INSTALL_LOCATION_INTERNAL_ONLY = 1; // 0x1
    field public static final int INSTALL_LOCATION_PREFER_EXTERNAL = 2; // 0x2
    field public static final int REQUESTED_PERMISSION_GRANTED = 2; // 0x2
    field public static final int REQUESTED_PERMISSION_GRANTED = 2; // 0x2
    field public static final int REQUESTED_PERMISSION_REQUIRED = 1; // 0x1
    field public static final int REQUESTED_PERMISSION_REQUIRED = 1; // 0x1
    field public android.content.pm.ActivityInfo[] activities;
    field public android.content.pm.ActivityInfo[] activities;
@@ -8432,6 +8465,7 @@ package android.content.pm {
    field public android.content.pm.ConfigurationInfo[] configPreferences;
    field public android.content.pm.ConfigurationInfo[] configPreferences;
    field public long firstInstallTime;
    field public long firstInstallTime;
    field public int[] gids;
    field public int[] gids;
    field public int installLocation;
    field public android.content.pm.InstrumentationInfo[] instrumentation;
    field public android.content.pm.InstrumentationInfo[] instrumentation;
    field public long lastUpdateTime;
    field public long lastUpdateTime;
    field public java.lang.String packageName;
    field public java.lang.String packageName;
@@ -8445,10 +8479,52 @@ package android.content.pm {
    field public java.lang.String sharedUserId;
    field public java.lang.String sharedUserId;
    field public int sharedUserLabel;
    field public int sharedUserLabel;
    field public android.content.pm.Signature[] signatures;
    field public android.content.pm.Signature[] signatures;
    field public java.lang.String[] splitNames;
    field public int versionCode;
    field public int versionCode;
    field public java.lang.String versionName;
    field public java.lang.String versionName;
  }
  }
  public class PackageInstaller {
    method public int createSession(android.content.pm.InstallSessionParams) throws java.io.IOException;
    method public java.util.List<android.content.pm.InstallSessionInfo> getActiveSessions();
    method public android.content.pm.PackageInstaller.Session openSession(int);
    method public void registerSessionObserver(android.content.pm.PackageInstaller.SessionObserver);
    method public void uninstall(java.lang.String, android.content.pm.PackageInstaller.UninstallResultCallback);
    method public void unregisterSessionObserver(android.content.pm.PackageInstaller.SessionObserver);
  }
  public static abstract class PackageInstaller.CommitResultCallback {
    ctor public PackageInstaller.CommitResultCallback();
    method public abstract void onFailure(java.lang.String);
    method public void onFailureConflict(java.lang.String, java.lang.String);
    method public void onFailureIncompatible(java.lang.String);
    method public void onFailureInvalid(java.lang.String);
    method public void onFailureStorage(java.lang.String);
    method public abstract void onSuccess();
  }
  public static class PackageInstaller.Session implements java.io.Closeable {
    method public void close();
    method public void commit(android.content.pm.PackageInstaller.CommitResultCallback);
    method public void destroy();
    method public void fsync(java.io.OutputStream) throws java.io.IOException;
    method public java.io.OutputStream openWrite(java.lang.String, long, long) throws java.io.IOException;
    method public void setProgress(int);
  }
  public static abstract class PackageInstaller.SessionObserver {
    ctor public PackageInstaller.SessionObserver();
    method public abstract void onCreated(android.content.pm.InstallSessionInfo);
    method public abstract void onFinalized(int, boolean);
    method public abstract void onProgress(int, int);
  }
  public static abstract class PackageInstaller.UninstallResultCallback {
    ctor public PackageInstaller.UninstallResultCallback();
    method public abstract void onFailure(java.lang.String);
    method public abstract void onSuccess();
  }
  public class PackageItemInfo {
  public class PackageItemInfo {
    ctor public PackageItemInfo();
    ctor public PackageItemInfo();
    ctor public PackageItemInfo(android.content.pm.PackageItemInfo);
    ctor public PackageItemInfo(android.content.pm.PackageItemInfo);
@@ -8511,6 +8587,7 @@ package android.content.pm {
    method public abstract android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo);
    method public abstract android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo);
    method public abstract java.util.List<android.content.pm.ApplicationInfo> getInstalledApplications(int);
    method public abstract java.util.List<android.content.pm.ApplicationInfo> getInstalledApplications(int);
    method public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackages(int);
    method public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackages(int);
    method public abstract android.content.pm.PackageInstaller getInstaller();
    method public abstract java.lang.String getInstallerPackageName(java.lang.String);
    method public abstract java.lang.String getInstallerPackageName(java.lang.String);
    method public abstract android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract android.content.pm.KeySet getKeySetByAlias(java.lang.String, java.lang.String);
    method public abstract android.content.pm.KeySet getKeySetByAlias(java.lang.String, java.lang.String);
@@ -29433,6 +29510,7 @@ package android.test.mock {
    method public android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo);
    method public android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo);
    method public java.util.List<android.content.pm.ApplicationInfo> getInstalledApplications(int);
    method public java.util.List<android.content.pm.ApplicationInfo> getInstalledApplications(int);
    method public java.util.List<android.content.pm.PackageInfo> getInstalledPackages(int);
    method public java.util.List<android.content.pm.PackageInfo> getInstalledPackages(int);
    method public android.content.pm.PackageInstaller getInstaller();
    method public java.lang.String getInstallerPackageName(java.lang.String);
    method public java.lang.String getInstallerPackageName(java.lang.String);
    method public android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public android.content.Intent getLaunchIntentForPackage(java.lang.String);
    method public android.content.Intent getLaunchIntentForPackage(java.lang.String);
+2 −2
Original line number Original line Diff line number Diff line
@@ -998,7 +998,7 @@ public final class Pm {


        final InstallSessionParams params = new InstallSessionParams();
        final InstallSessionParams params = new InstallSessionParams();
        params.installFlags = PackageManager.INSTALL_ALL_USERS;
        params.installFlags = PackageManager.INSTALL_ALL_USERS;
        params.fullInstall = true;
        params.mode = InstallSessionParams.MODE_FULL_INSTALL;
        params.progressMax = -1;
        params.progressMax = -1;


        String opt;
        String opt;
@@ -1021,7 +1021,7 @@ public final class Pm {
            } else if (opt.equals("-d")) {
            } else if (opt.equals("-d")) {
                params.installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE;
                params.installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE;
            } else if (opt.equals("-p")) {
            } else if (opt.equals("-p")) {
                params.fullInstall = false;
                params.mode = InstallSessionParams.MODE_INHERIT_EXISTING;
            } else if (opt.equals("-S")) {
            } else if (opt.equals("-S")) {
                params.deltaSize = Long.parseLong(nextOptionData());
                params.deltaSize = Long.parseLong(nextOptionData());
                params.progressMax = (int) params.deltaSize;
                params.progressMax = (int) params.deltaSize;
+10 −1
Original line number Original line Diff line number Diff line
@@ -1520,7 +1520,7 @@ final class ApplicationPackageManager extends PackageManager {
    }
    }


    @Override
    @Override
    public PackageInstaller getPackageInstaller() {
    public PackageInstaller getInstaller() {
        try {
        try {
            return new PackageInstaller(this, mPM.getPackageInstaller(), mContext.getPackageName(),
            return new PackageInstaller(this, mPM.getPackageInstaller(), mContext.getPackageName(),
                    mContext.getUserId());
                    mContext.getUserId());
@@ -1529,6 +1529,15 @@ final class ApplicationPackageManager extends PackageManager {
        }
        }
    }
    }


    @Override
    public boolean isPackageAvailable(String packageName) {
        try {
            return mPM.isPackageAvailable(packageName, mContext.getUserId());
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
        }
    }

    /**
    /**
     * @hide
     * @hide
     */
     */
+64 −4
Original line number Original line Diff line number Diff line
@@ -20,15 +20,25 @@ import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Parcelable;


/** {@hide} */
/**
 * Details for an active install session.
 */
public class InstallSessionInfo implements Parcelable {
public class InstallSessionInfo implements Parcelable {

    /** {@hide} */
    public int sessionId;
    public int sessionId;
    /** {@hide} */
    public String installerPackageName;
    public String installerPackageName;
    /** {@hide} */
    public int progress;
    public int progress;


    public boolean fullInstall;
    /** {@hide} */
    public int mode;
    /** {@hide} */
    public String packageName;
    public String packageName;
    /** {@hide} */
    public Bitmap icon;
    public Bitmap icon;
    /** {@hide} */
    public CharSequence title;
    public CharSequence title;


    /** {@hide} */
    /** {@hide} */
@@ -41,12 +51,62 @@ public class InstallSessionInfo implements Parcelable {
        installerPackageName = source.readString();
        installerPackageName = source.readString();
        progress = source.readInt();
        progress = source.readInt();


        fullInstall = source.readInt() != 0;
        mode = source.readInt();
        packageName = source.readString();
        packageName = source.readString();
        icon = source.readParcelable(null);
        icon = source.readParcelable(null);
        title = source.readString();
        title = source.readString();
    }
    }


    /**
     * Return the ID for this session.
     */
    public int getSessionId() {
        return sessionId;
    }

    /**
     * Return the package name of the app that owns this session.
     */
    public String getInstallerPackageName() {
        return installerPackageName;
    }

    /**
     * Return current overall progress of this session, between 0 and 100.
     * <p>
     * Note that this progress may not directly correspond to the value reported
     * by {@link PackageInstaller.Session#setProgress(int)}, as the system may
     * carve out a portion of the overall progress to represent its own internal
     * installation work.
     */
    public int getProgress() {
        return progress;
    }

    /**
     * Return the package name this session is working with. May be {@code null}
     * if unknown.
     */
    public String getPackageName() {
        return packageName;
    }

    /**
     * Return an icon representing the app being installed. May be {@code null}
     * if unavailable.
     */
    public Bitmap getIcon() {
        return icon;
    }

    /**
     * Return a title representing the app being installed. May be {@code null}
     * if unavailable.
     */
    public CharSequence getTitle() {
        return title;
    }

    @Override
    @Override
    public int describeContents() {
    public int describeContents() {
        return 0;
        return 0;
@@ -58,7 +118,7 @@ public class InstallSessionInfo implements Parcelable {
        dest.writeString(installerPackageName);
        dest.writeString(installerPackageName);
        dest.writeInt(progress);
        dest.writeInt(progress);


        dest.writeInt(fullInstall ? 1 : 0);
        dest.writeInt(mode);
        dest.writeString(packageName);
        dest.writeString(packageName);
        dest.writeParcelable(icon, flags);
        dest.writeParcelable(icon, flags);
        dest.writeString(title != null ? title.toString() : null);
        dest.writeString(title != null ? title.toString() : null);
+74 −9
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package android.content.pm;
package android.content.pm;


import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap;
import android.net.Uri;
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcel;
@@ -23,13 +24,22 @@ import android.os.Parcelable;


import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.IndentingPrintWriter;


/** {@hide} */
/**
 * Parameters for creating a new {@link PackageInstaller.Session}.
 */
public class InstallSessionParams implements Parcelable {
public class InstallSessionParams implements Parcelable {


    // TODO: extend to support remaining VerificationParams
    // TODO: extend to support remaining VerificationParams


    /** {@hide} */
    /** {@hide} */
    public boolean fullInstall;
    public static final int MODE_INVALID = 0;
    /** {@hide} */
    public static final int MODE_FULL_INSTALL = 1;
    /** {@hide} */
    public static final int MODE_INHERIT_EXISTING = 2;

    /** {@hide} */
    public int mode = MODE_INVALID;
    /** {@hide} */
    /** {@hide} */
    public int installFlags;
    public int installFlags;
    /** {@hide} */
    /** {@hide} */
@@ -58,7 +68,7 @@ public class InstallSessionParams implements Parcelable {


    /** {@hide} */
    /** {@hide} */
    public InstallSessionParams(Parcel source) {
    public InstallSessionParams(Parcel source) {
        fullInstall = source.readInt() != 0;
        mode = source.readInt();
        installFlags = source.readInt();
        installFlags = source.readInt();
        installLocation = source.readInt();
        installLocation = source.readInt();
        signatures = (Signature[]) source.readParcelableArray(null);
        signatures = (Signature[]) source.readParcelableArray(null);
@@ -72,53 +82,108 @@ public class InstallSessionParams implements Parcelable {
        abiOverride = source.readString();
        abiOverride = source.readString();
    }
    }


    public void setFullInstall(boolean fullInstall) {
    /**
        this.fullInstall = fullInstall;
     * Set session mode indicating that it should fully replace any existing
     * APKs for this application.
     */
    public void setModeFullInstall() {
        this.mode = MODE_FULL_INSTALL;
    }
    }


    public void setInstallFlags(int installFlags) {
    /**
        this.installFlags = installFlags;
     * Set session mode indicating that it should inherit any existing APKs for
     * this application, unless they are explicitly overridden (by split name)
     * in the session.
     */
    public void setModeInheritExisting() {
        this.mode = MODE_INHERIT_EXISTING;
    }
    }


    /**
     * Provide value of {@link PackageInfo#installLocation}, which may be used
     * to determine where the app will be staged. Defaults to
     * {@link PackageInfo#INSTALL_LOCATION_INTERNAL_ONLY}.
     */
    public void setInstallLocation(int installLocation) {
    public void setInstallLocation(int installLocation) {
        this.installLocation = installLocation;
        this.installLocation = installLocation;
    }
    }


    /**
     * Optionally provide the required value of {@link PackageInfo#signatures}.
     * This can be used to assert that all staged APKs have been signed with
     * this set of specific certificates. Regardless of this value, all APKs in
     * the application must have the same signing certificates.
     */
    public void setSignatures(Signature[] signatures) {
    public void setSignatures(Signature[] signatures) {
        this.signatures = signatures;
        this.signatures = signatures;
    }
    }


    /**
     * Indicate the expected growth in disk usage resulting from this session.
     * This may be used to ensure enough disk space exists before proceeding, or
     * to estimate container size for installations living on external storage.
     * <p>
     * This value should only reflect APK sizes.
     */
    public void setDeltaSize(long deltaSize) {
    public void setDeltaSize(long deltaSize) {
        this.deltaSize = deltaSize;
        this.deltaSize = deltaSize;
    }
    }


    /**
     * Set the maximum progress for this session, used for normalization
     * purposes.
     *
     * @see PackageInstaller.Session#setProgress(int)
     */
    public void setProgressMax(int progressMax) {
    public void setProgressMax(int progressMax) {
        this.progressMax = progressMax;
        this.progressMax = progressMax;
    }
    }


    /**
     * Optionally set the package name this session will be working with. It's
     * strongly recommended that you provide this value when known.
     */
    public void setPackageName(String packageName) {
    public void setPackageName(String packageName) {
        this.packageName = packageName;
        this.packageName = packageName;
    }
    }


    /**
     * Optionally set an icon representing the app being installed.
     */
    public void setIcon(Bitmap icon) {
    public void setIcon(Bitmap icon) {
        this.icon = icon;
        this.icon = icon;
    }
    }


    /**
     * Optionally set a title representing the app being installed.
     */
    public void setTitle(CharSequence title) {
    public void setTitle(CharSequence title) {
        this.title = title;
        this.title = title;
    }
    }


    /**
     * Optionally set the URI where this package was downloaded from. Used for
     * verification purposes.
     *
     * @see Intent#EXTRA_ORIGINATING_URI
     */
    public void setOriginatingUri(Uri originatingUri) {
    public void setOriginatingUri(Uri originatingUri) {
        this.originatingUri = originatingUri;
        this.originatingUri = originatingUri;
    }
    }


    /**
     * Optionally set the URI that referred you to install this package. Used
     * for verification purposes.
     *
     * @see Intent#EXTRA_REFERRER
     */
    public void setReferrerUri(Uri referrerUri) {
    public void setReferrerUri(Uri referrerUri) {
        this.referrerUri = referrerUri;
        this.referrerUri = referrerUri;
    }
    }


    /** {@hide} */
    /** {@hide} */
    public void dump(IndentingPrintWriter pw) {
    public void dump(IndentingPrintWriter pw) {
        pw.printPair("fullInstall", fullInstall);
        pw.printPair("mode", mode);
        pw.printHexPair("installFlags", installFlags);
        pw.printHexPair("installFlags", installFlags);
        pw.printPair("installLocation", installLocation);
        pw.printPair("installLocation", installLocation);
        pw.printPair("signatures", (signatures != null));
        pw.printPair("signatures", (signatures != null));
@@ -140,7 +205,7 @@ public class InstallSessionParams implements Parcelable {


    @Override
    @Override
    public void writeToParcel(Parcel dest, int flags) {
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(fullInstall ? 1 : 0);
        dest.writeInt(mode);
        dest.writeInt(installFlags);
        dest.writeInt(installFlags);
        dest.writeInt(installLocation);
        dest.writeInt(installLocation);
        dest.writeParcelableArray(signatures, flags);
        dest.writeParcelableArray(signatures, flags);
Loading