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

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

Merge "Package installation listener events."

parents 297d97fc a1031143
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ 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.InstallResultCallback;
import android.content.pm.PackageInstaller.CommitResultCallback;
import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
@@ -769,7 +769,7 @@ public final class Pm {
        }
    }

    class LocalInstallResultCallback extends InstallResultCallback {
    class LocalCommitResultCallback extends CommitResultCallback {
        boolean finished;
        boolean success;
        String msg;
@@ -1018,6 +1018,7 @@ public final class Pm {
        final InstallSessionParams params = new InstallSessionParams();
        params.installFlags = PackageManager.INSTALL_ALL_USERS;
        params.fullInstall = true;
        params.progressMax = -1;

        String opt;
        while ((opt = nextOption()) != null) {
@@ -1042,6 +1043,7 @@ public final class Pm {
                params.fullInstall = false;
            } else if (opt.equals("-S")) {
                params.deltaSize = Long.parseLong(nextOptionData());
                params.progressMax = (int) params.deltaSize;
            } else {
                throw new IllegalArgumentException("Unknown option " + opt);
            }
@@ -1093,7 +1095,8 @@ public final class Pm {
            out = session.openWrite(splitName, 0, sizeBytes);

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

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

            final LocalInstallResultCallback callback = new LocalInstallResultCallback();
            session.install(callback);
            final LocalCommitResultCallback callback = new LocalCommitResultCallback();
            session.commit(callback);

            synchronized (callback) {
                while (!callback.finished) {
+2 −1
Original line number Diff line number Diff line
@@ -21,7 +21,8 @@ import android.os.ParcelFileDescriptor;

/** {@hide} */
interface IPackageInstallerSession {
    void updateProgress(int progress);
    void setClientProgress(int progress);
    void addClientProgress(int progress);

    ParcelFileDescriptor openWrite(String name, long offsetBytes, long lengthBytes);

+27 −0
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;

import com.android.internal.util.IndentingPrintWriter;

/** {@hide} */
public class InstallSessionParams implements Parcelable {

@@ -37,6 +39,8 @@ public class InstallSessionParams implements Parcelable {
    /** {@hide} */
    public long deltaSize = -1;
    /** {@hide} */
    public int progressMax = 100;
    /** {@hide} */
    public String packageName;
    /** {@hide} */
    public Bitmap icon;
@@ -59,6 +63,7 @@ public class InstallSessionParams implements Parcelable {
        installLocation = source.readInt();
        signatures = (Signature[]) source.readParcelableArray(null);
        deltaSize = source.readLong();
        progressMax = source.readInt();
        packageName = source.readString();
        icon = source.readParcelable(null);
        title = source.readString();
@@ -87,6 +92,10 @@ public class InstallSessionParams implements Parcelable {
        this.deltaSize = deltaSize;
    }

    public void setProgressMax(int progressMax) {
        this.progressMax = progressMax;
    }

    public void setPackageName(String packageName) {
        this.packageName = packageName;
    }
@@ -107,6 +116,23 @@ public class InstallSessionParams implements Parcelable {
        this.referrerUri = referrerUri;
    }

    /** {@hide} */
    public void dump(IndentingPrintWriter pw) {
        pw.printPair("fullInstall", fullInstall);
        pw.printHexPair("installFlags", installFlags);
        pw.printPair("installLocation", installLocation);
        pw.printPair("signatures", (signatures != null));
        pw.printPair("deltaSize", deltaSize);
        pw.printPair("progressMax", progressMax);
        pw.printPair("packageName", packageName);
        pw.printPair("icon", (icon != null));
        pw.printPair("title", title);
        pw.printPair("originatingUri", originatingUri);
        pw.printPair("referrerUri", referrerUri);
        pw.printPair("abiOverride", abiOverride);
        pw.println();
    }

    @Override
    public int describeContents() {
        return 0;
@@ -119,6 +145,7 @@ public class InstallSessionParams implements Parcelable {
        dest.writeInt(installLocation);
        dest.writeParcelableArray(signatures, flags);
        dest.writeLong(deltaSize);
        dest.writeInt(progressMax);
        dest.writeString(packageName);
        dest.writeParcelable(icon, flags);
        dest.writeString(title != null ? title.toString() : null);
+39 −22
Original line number Diff line number Diff line
@@ -23,8 +23,10 @@ import android.os.Bundle;
import android.os.FileBridge;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.util.ExceptionUtils;

import java.io.Closeable;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;

@@ -64,9 +66,12 @@ public class PackageInstaller {
        observer.packageInstalled(packageName, null, returnCode);
    }

    public int createSession(InstallSessionParams params) {
    public int createSession(InstallSessionParams params) throws IOException {
        try {
            return mInstaller.createSession(mInstallerPackageName, params, mUserId);
        } catch (RuntimeException e) {
            ExceptionUtils.maybeUnwrapIOException(e);
            throw e;
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
        }
@@ -136,8 +141,7 @@ public class PackageInstaller {
        public abstract void onFinished(int sessionId, boolean success);
    }

    public void registerObserver(SessionObserver observer) {
        // TODO: consider restricting to current launcher app
    public void registerSessionObserver(SessionObserver observer) {
        try {
            mInstaller.registerObserver(observer.getBinder(), mUserId);
        } catch (RemoteException e) {
@@ -145,7 +149,7 @@ public class PackageInstaller {
        }
    }

    public void unregisterObserver(SessionObserver observer) {
    public void unregisterSessionObserver(SessionObserver observer) {
        try {
            mInstaller.unregisterObserver(observer.getBinder(), mUserId);
        } catch (RemoteException e) {
@@ -173,9 +177,18 @@ public class PackageInstaller {
            mSession = session;
        }

        public void updateProgress(int progress) {
        public void setProgress(int progress) {
            try {
                mSession.updateProgress(progress);
                mSession.setClientProgress(progress);
            } catch (RemoteException e) {
                throw e.rethrowAsRuntimeException();
            }
        }

        /** {@hide} */
        public void addProgress(int progress) {
            try {
                mSession.addClientProgress(progress);
            } catch (RemoteException e) {
                throw e.rethrowAsRuntimeException();
            }
@@ -187,19 +200,31 @@ public class PackageInstaller {
         * {@link OutputStream#flush()} to ensure bytes have been written to
         * disk.
         */
        public OutputStream openWrite(String splitName, long offsetBytes, long lengthBytes) {
        public OutputStream openWrite(String splitName, long offsetBytes, long lengthBytes)
                throws IOException {
            try {
                final ParcelFileDescriptor clientSocket = mSession.openWrite(splitName,
                        offsetBytes, lengthBytes);
                return new FileBridge.FileBridgeOutputStream(clientSocket.getFileDescriptor());
            } catch (RuntimeException e) {
                ExceptionUtils.maybeUnwrapIOException(e);
                throw e;
            } catch (RemoteException e) {
                throw e.rethrowAsRuntimeException();
                throw new IOException(e);
            }
        }

        public void install(InstallResultCallback callback) {
        public void fsync(OutputStream out) throws IOException {
            if (out instanceof FileBridge.FileBridgeOutputStream) {
                ((FileBridge.FileBridgeOutputStream) out).fsync();
            } else {
                throw new IllegalArgumentException("Unrecognized stream");
            }
        }

        public void commit(CommitResultCallback callback) {
            try {
                mSession.install(new InstallResultCallbackDelegate(callback).getBinder());
                mSession.install(new CommitResultCallbackDelegate(callback).getBinder());
            } catch (RemoteException e) {
                throw e.rethrowAsRuntimeException();
            }
@@ -246,16 +271,8 @@ public class PackageInstaller {
        }
    }

    public static abstract class InstallResultCallback {
        /**
         * The session installed successfully.
         */
    public static abstract class CommitResultCallback {
        public abstract void onSuccess();

        /**
         * General unclassified failure. You may be interested in overriding
         * more granular classifications.
         */
        public abstract void onFailure(String msg);

        /**
@@ -300,10 +317,10 @@ public class PackageInstaller {
        }
    }

    private static class InstallResultCallbackDelegate extends PackageInstallObserver {
        private final InstallResultCallback target;
    private static class CommitResultCallbackDelegate extends PackageInstallObserver {
        private final CommitResultCallback target;

        public InstallResultCallbackDelegate(InstallResultCallback target) {
        public CommitResultCallbackDelegate(CommitResultCallback target) {
            this.target = target;
        }

+1 −3
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@ import libcore.io.Streams;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.OutputStream;
import java.io.SyncFailedException;
import java.nio.ByteOrder;
import java.util.Arrays;

@@ -144,8 +143,7 @@ public class FileBridge extends Thread {
            }
        }

        @Override
        public void flush() throws IOException {
        public void fsync() throws IOException {
            writeCommandAndBlock(CMD_FSYNC, "fsync()");
        }

Loading