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

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

Merge "PackageInstaller changes based on feedback." into lmp-dev

parents 91838ded 16c8e3f4
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -131,7 +131,7 @@ LOCAL_SRC_FILES += \
	core/java/android/content/pm/IPackageInstallObserver.aidl \
	core/java/android/content/pm/IPackageInstallObserver2.aidl \
	core/java/android/content/pm/IPackageInstaller.aidl \
	core/java/android/content/pm/IPackageInstallerObserver.aidl \
	core/java/android/content/pm/IPackageInstallerCallback.aidl \
	core/java/android/content/pm/IPackageInstallerSession.aidl \
	core/java/android/content/pm/IPackageManager.aidl \
	core/java/android/content/pm/IPackageMoveObserver.aidl \
+39 −35
Original line number Diff line number Diff line
@@ -8454,32 +8454,31 @@ package android.content.pm {
  public class InstallSessionInfo implements android.os.Parcelable {
    method public int describeContents();
    method public android.graphics.Bitmap getIcon();
    method public android.graphics.Bitmap getAppIcon();
    method public java.lang.CharSequence getAppLabel();
    method public java.lang.String getAppPackageName();
    method public java.lang.String getInstallerPackageName();
    method public java.lang.String getPackageName();
    method public int getProgress();
    method public float 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();
    ctor public InstallSessionParams(int);
    method public int describeContents();
    method public void setDeltaSize(long);
    method public void setIcon(android.graphics.Bitmap);
    method public void setAppIcon(android.graphics.Bitmap);
    method public void setAppLabel(java.lang.CharSequence);
    method public void setAppPackageName(java.lang.String);
    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 setSize(long);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator CREATOR;
    field public static final int MODE_FULL_INSTALL = 1; // 0x1
    field public static final int MODE_INHERIT_EXISTING = 2; // 0x2
  }
  public class InstrumentationInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
@@ -8580,42 +8579,47 @@ package android.content.pm {
  }
  public class PackageInstaller {
    method public void addSessionCallback(android.content.pm.PackageInstaller.SessionCallback);
    method public void addSessionCallback(android.content.pm.PackageInstaller.SessionCallback, android.os.Handler);
    method public int createSession(android.content.pm.InstallSessionParams) throws java.io.IOException;
    method public java.util.List<android.content.pm.InstallSessionInfo> getActiveSessions();
    method public java.util.List<android.content.pm.InstallSessionInfo> getAllSessions();
    method public java.util.List<android.content.pm.InstallSessionInfo> getMySessions();
    method public android.content.pm.InstallSessionInfo getSessionInfo(int);
    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);
    method public void removeSessionCallback(android.content.pm.PackageInstaller.SessionCallback);
    method public void uninstall(java.lang.String, android.content.pm.PackageInstaller.UninstallCallback);
  }
  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);
  public static abstract class PackageInstaller.CommitCallback {
    ctor public PackageInstaller.CommitCallback();
    method public abstract void onFailure(int, java.lang.String, android.os.Bundle);
    method public abstract void onSuccess();
    field public static final java.lang.String EXTRA_PACKAGE_NAME = "android.content.pm.extra.PACKAGE_NAME";
    field public static final int FAILURE_CONFLICT = 2; // 0x2
    field public static final int FAILURE_INCOMPATIBLE = 4; // 0x4
    field public static final int FAILURE_INVALID = 1; // 0x1
    field public static final int FAILURE_STORAGE = 3; // 0x3
    field public static final int FAILURE_UNKNOWN = 0; // 0x0
  }
  public static class PackageInstaller.Session implements java.io.Closeable {
    method public void abandon();
    method public void close();
    method public void commit(android.content.pm.PackageInstaller.CommitResultCallback);
    method public void destroy();
    method public void commit(android.content.pm.PackageInstaller.CommitCallback);
    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);
    method public void setProgress(float);
  }
  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.SessionCallback {
    ctor public PackageInstaller.SessionCallback();
    method public abstract void onCreated(int);
    method public abstract void onFinished(int, boolean);
    method public abstract void onProgressChanged(int, float);
  }
  public static abstract class PackageInstaller.UninstallResultCallback {
    ctor public PackageInstaller.UninstallResultCallback();
  public static abstract class PackageInstaller.UninstallCallback {
    ctor public PackageInstaller.UninstallCallback();
    method public abstract void onFailure(java.lang.String);
    method public abstract void onSuccess();
  }
@@ -8682,7 +8686,6 @@ 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.pm.KeySet getKeySetByAlias(java.lang.String, java.lang.String);
@@ -8692,6 +8695,7 @@ package android.content.pm {
    method public android.content.pm.PackageInfo getPackageArchiveInfo(java.lang.String, int);
    method public abstract int[] getPackageGids(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract android.content.pm.PackageInfo getPackageInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract android.content.pm.PackageInstaller getPackageInstaller();
    method public abstract java.lang.String[] getPackagesForUid(int);
    method public abstract java.util.List<android.content.pm.PackageInfo> getPackagesHoldingPermissions(java.lang.String[], int);
    method public abstract android.content.pm.PermissionGroupInfo getPermissionGroupInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
@@ -30130,7 +30134,6 @@ 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.pm.KeySet getKeySetByAlias(java.lang.String, java.lang.String);
@@ -30139,6 +30142,7 @@ package android.test.mock {
    method public java.lang.String getNameForUid(int);
    method public int[] getPackageGids(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
    method public android.content.pm.PackageInfo getPackageInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public android.content.pm.PackageInstaller getPackageInstaller();
    method public java.lang.String[] getPackagesForUid(int);
    method public java.util.List<android.content.pm.PackageInfo> getPackagesHoldingPermissions(java.lang.String[], int);
    method public android.content.pm.PermissionGroupInfo getPermissionGroupInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+22 −19
Original line number Diff line number Diff line
@@ -27,11 +27,12 @@ import android.content.pm.IPackageDataObserver;
import android.content.pm.IPackageDeleteObserver;
import android.content.pm.IPackageInstaller;
import android.content.pm.IPackageManager;
import android.content.pm.InstallSessionInfo;
import android.content.pm.InstallSessionParams;
import android.content.pm.InstrumentationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageInstaller.CommitResultCallback;
import android.content.pm.PackageInstaller.CommitCallback;
import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
@@ -157,8 +158,8 @@ public final class Pm {
            return;
        }

        if ("install-destroy".equals(op)) {
            runInstallDestroy();
        if ("install-abandon".equals(op) || "install-destroy".equals(op)) {
            runInstallAbandon();
            return;
        }

@@ -770,7 +771,7 @@ public final class Pm {
        }
    }

    class LocalCommitResultCallback extends CommitResultCallback {
    class LocalCommitCallback extends CommitCallback {
        boolean finished;
        boolean success;
        String msg;
@@ -790,7 +791,7 @@ public final class Pm {
        }

        @Override
        public void onFailure(String msg) {
        public void onFailure(int failureReason, String msg, Bundle extras) {
            setResult(false, msg);
        }
    }
@@ -996,10 +997,9 @@ public final class Pm {
    private void runInstallCreate() throws RemoteException {
        String installerPackageName = null;

        final InstallSessionParams params = new InstallSessionParams();
        final InstallSessionParams params = new InstallSessionParams(
                InstallSessionParams.MODE_FULL_INSTALL);
        params.installFlags = PackageManager.INSTALL_ALL_USERS;
        params.setModeFullInstall();
        params.setProgressMax(-1);

        String opt;
        while ((opt = nextOption()) != null) {
@@ -1021,11 +1021,9 @@ public final class Pm {
            } else if (opt.equals("-d")) {
                params.installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE;
            } else if (opt.equals("-p")) {
                params.setModeInheritExisting();
                params.mode = InstallSessionParams.MODE_INHERIT_EXISTING;
            } else if (opt.equals("-S")) {
                final long deltaSize = Long.parseLong(nextOptionData());
                params.setDeltaSize(deltaSize);
                params.setProgressMax((int) params.deltaSize);
                params.setSize(Long.parseLong(nextOptionData()));
            } else if (opt.equals("--abi")) {
                params.abiOverride = checkAbiArgument(nextOptionData());
            } else {
@@ -1033,7 +1031,7 @@ public final class Pm {
            }
        }

        final int sessionId = mInstaller.createSession(installerPackageName, params,
        final int sessionId = mInstaller.createSession(params, installerPackageName,
                UserHandle.USER_OWNER);

        // NOTE: adb depends on parsing this string
@@ -1080,7 +1078,12 @@ public final class Pm {

            final int n = Streams.copy(in, out);
            session.fsync(out);
            session.addProgress(n);

            final InstallSessionInfo info = mInstaller.getSessionInfo(sessionId);
            if (info.sizeBytes > 0) {
                final float fraction = ((float) n / (float) info.sizeBytes);
                session.addProgress(fraction);
            }

            System.out.println("Success: streamed " + n + " bytes");
        } finally {
@@ -1097,7 +1100,7 @@ public final class Pm {
        try {
            session = new PackageInstaller.Session(mInstaller.openSession(sessionId));

            final LocalCommitResultCallback callback = new LocalCommitResultCallback();
            final LocalCommitCallback callback = new LocalCommitCallback();
            session.commit(callback);

            synchronized (callback) {
@@ -1118,13 +1121,13 @@ public final class Pm {
        }
    }

    private void runInstallDestroy() throws RemoteException {
    private void runInstallAbandon() throws RemoteException {
        final int sessionId = Integer.parseInt(nextArg());

        PackageInstaller.Session session = null;
        try {
            session = new PackageInstaller.Session(mInstaller.openSession(sessionId));
            session.destroy();
            session.abandon();
            System.out.println("Success");
        } finally {
            IoUtils.closeQuietly(session);
@@ -1743,7 +1746,7 @@ public final class Pm {
        System.err.println("       pm install-create [-lrtsfdp] [-i PACKAGE] [-S BYTES]");
        System.err.println("       pm install-write [-S BYTES] SESSION_ID SPLIT_NAME [PATH]");
        System.err.println("       pm install-commit SESSION_ID");
        System.err.println("       pm install-destroy SESSION_ID");
        System.err.println("       pm install-abandon SESSION_ID");
        System.err.println("       pm uninstall [-k] [--user USER_ID] PACKAGE");
        System.err.println("       pm set-installer PACKAGE INSTALLER");
        System.err.println("       pm clear [--user USER_ID] PACKAGE");
@@ -1813,7 +1816,7 @@ public final class Pm {
        System.err.println("    -S: size in bytes of package, required for stdin");
        System.err.println("");
        System.err.println("pm install-commit: perform install of fully staged session");
        System.err.println("pm install-destroy: destroy session");
        System.err.println("pm install-abandon: abandon session");
        System.err.println("");
        System.err.println("pm set-installer: set installer package name");
        System.err.println("");
+25 −10
Original line number Diff line number Diff line
@@ -61,7 +61,10 @@ import android.os.UserManager;
import android.util.ArrayMap;
import android.util.Log;
import android.view.Display;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.Preconditions;

import dalvik.system.VMRuntime;

import java.lang.ref.WeakReference;
@@ -74,14 +77,21 @@ final class ApplicationPackageManager extends PackageManager {
    private final static boolean DEBUG = false;
    private final static boolean DEBUG_ICONS = false;

    UserManager mUserManager;
    private final Object mLock = new Object();

    @GuardedBy("mLock")
    private UserManager mUserManager;
    @GuardedBy("mLock")
    private PackageInstaller mInstaller;

    UserManager getUserManager() {
        synchronized (mLock) {
            if (mUserManager == null) {
                mUserManager = UserManager.get(mContext);
            }
            return mUserManager;
        }
    }

    @Override
    public PackageInfo getPackageInfo(String packageName, int flags)
@@ -1543,14 +1553,19 @@ final class ApplicationPackageManager extends PackageManager {
    }

    @Override
    public PackageInstaller getInstaller() {
    public PackageInstaller getPackageInstaller() {
        synchronized (mLock) {
            if (mInstaller == null) {
                try {
            return new PackageInstaller(this, mPM.getPackageInstaller(), mContext.getPackageName(),
                    mContext.getUserId());
                    mInstaller = new PackageInstaller(this, mPM.getPackageInstaller(),
                            mContext.getPackageName(), mContext.getUserId());
                } catch (RemoteException e) {
                    throw e.rethrowAsRuntimeException();
                }
            }
            return mInstaller;
        }
    }

    @Override
    public boolean isPackageAvailable(String packageName) {
+7 −5
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@
package android.content.pm;

import android.content.pm.IPackageDeleteObserver;
import android.content.pm.IPackageInstallerObserver;
import android.content.pm.IPackageInstallerCallback;
import android.content.pm.IPackageInstallerSession;
import android.content.pm.InstallSessionInfo;
import android.content.pm.InstallSessionParams;
@@ -25,13 +25,15 @@ import android.os.ParcelFileDescriptor;

/** {@hide} */
interface IPackageInstaller {
    int createSession(String installerPackageName, in InstallSessionParams params, int userId);
    int createSession(in InstallSessionParams params, String installerPackageName, int userId);
    IPackageInstallerSession openSession(int sessionId);

    List<InstallSessionInfo> getSessions(int userId);
    InstallSessionInfo getSessionInfo(int sessionId);
    List<InstallSessionInfo> getAllSessions(int userId);
    List<InstallSessionInfo> getMySessions(String installerPackageName, int userId);

    void registerObserver(IPackageInstallerObserver observer, int userId);
    void unregisterObserver(IPackageInstallerObserver observer, int userId);
    void registerCallback(IPackageInstallerCallback callback, int userId);
    void unregisterCallback(IPackageInstallerCallback callback);

    void uninstall(String packageName, int flags, in IPackageDeleteObserver observer, int userId);
    void uninstallSplit(String packageName, String splitName, int flags, in IPackageDeleteObserver observer, int userId);
Loading