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

Commit 6c833e07 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Public API for PackageInstaller!

Flesh out documentation and finalize first cut of API.  Also surface
installLocation and splitNames through PackageInfo.

Bug: 14975160, 15348430
Change-Id: Ic27696d20ed06e508aa3526218e9cb20835af6a0
parent 5c6a8e32
Loading
Loading
Loading
Loading
+78 −0
Original line number Diff line number Diff line
@@ -8352,6 +8352,36 @@ package android.content.pm {
    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 {
    ctor public InstrumentationInfo();
    ctor public InstrumentationInfo(android.content.pm.InstrumentationInfo);
@@ -8416,6 +8446,9 @@ package android.content.pm {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    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_REQUIRED = 1; // 0x1
    field public android.content.pm.ActivityInfo[] activities;
@@ -8423,6 +8456,7 @@ package android.content.pm {
    field public android.content.pm.ConfigurationInfo[] configPreferences;
    field public long firstInstallTime;
    field public int[] gids;
    field public int installLocation;
    field public android.content.pm.InstrumentationInfo[] instrumentation;
    field public long lastUpdateTime;
    field public java.lang.String packageName;
@@ -8436,10 +8470,52 @@ package android.content.pm {
    field public java.lang.String sharedUserId;
    field public int sharedUserLabel;
    field public android.content.pm.Signature[] signatures;
    field public java.lang.String[] splitNames;
    field public int versionCode;
    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 {
    ctor public PackageItemInfo();
    ctor public PackageItemInfo(android.content.pm.PackageItemInfo);
@@ -8502,6 +8578,7 @@ package android.content.pm {
    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.PackageInfo> getInstalledPackages(int);
    method public abstract android.content.pm.PackageInstaller getInstaller();
    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.Intent getLaunchIntentForPackage(java.lang.String);
@@ -29362,6 +29439,7 @@ package android.test.mock {
    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.PackageInfo> getInstalledPackages(int);
    method public android.content.pm.PackageInstaller getInstaller();
    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.Intent getLaunchIntentForPackage(java.lang.String);
+2 −2
Original line number Diff line number Diff line
@@ -1017,7 +1017,7 @@ public final class Pm {

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

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

    @Override
    public PackageInstaller getPackageInstaller() {
    public PackageInstaller getInstaller() {
        try {
            return new PackageInstaller(this, mPM.getPackageInstaller(), mContext.getPackageName(),
                    mContext.getUserId());
@@ -1470,6 +1470,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
     */
+64 −4
Original line number Diff line number Diff line
@@ -20,15 +20,25 @@ import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcelable;

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

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

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

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

        fullInstall = source.readInt() != 0;
        mode = source.readInt();
        packageName = source.readString();
        icon = source.readParcelable(null);
        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
    public int describeContents() {
        return 0;
@@ -58,7 +118,7 @@ public class InstallSessionInfo implements Parcelable {
        dest.writeString(installerPackageName);
        dest.writeInt(progress);

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

package android.content.pm;

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

import com.android.internal.util.IndentingPrintWriter;

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

    // TODO: extend to support remaining VerificationParams

    /** {@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} */
    public int installFlags;
    /** {@hide} */
@@ -58,7 +68,7 @@ public class InstallSessionParams implements Parcelable {

    /** {@hide} */
    public InstallSessionParams(Parcel source) {
        fullInstall = source.readInt() != 0;
        mode = source.readInt();
        installFlags = source.readInt();
        installLocation = source.readInt();
        signatures = (Signature[]) source.readParcelableArray(null);
@@ -72,53 +82,108 @@ public class InstallSessionParams implements Parcelable {
        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) {
        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) {
        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) {
        this.deltaSize = deltaSize;
    }

    /**
     * Set the maximum progress for this session, used for normalization
     * purposes.
     *
     * @see PackageInstaller.Session#setProgress(int)
     */
    public void setProgressMax(int 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) {
        this.packageName = packageName;
    }

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

    /**
     * Optionally set a title representing the app being installed.
     */
    public void setTitle(CharSequence 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) {
        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) {
        this.referrerUri = referrerUri;
    }

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

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