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

Commit bb580670 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Progress toward installer public API: callbacks.

Instead of surfacing all the existing cryptic error codes, we're
going to classify them into broad categories when surfacing through
public API.  This change introduces InstallResultCallback and
UninstallResultCallback, and wires them up to existing AIDL
interfaces.

Also start defining general SessionObserver for apps interested
in general progress details, such as Launcher apps.  Details about
active sessions are returned through new InstallSessionInfo objects.

Bug: 14975160
Change-Id: I068e2b0c30135f6340f59ae0fff93c321047f8f9
parent 4901d62f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -130,6 +130,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/IPackageInstallerSession.aidl \
	core/java/android/content/pm/IPackageManager.aidl \
	core/java/android/content/pm/IPackageMoveObserver.aidl \
+36 −10
Original line number Diff line number Diff line
@@ -27,10 +27,11 @@ import android.content.pm.IPackageDataObserver;
import android.content.pm.IPackageDeleteObserver;
import android.content.pm.IPackageInstaller;
import android.content.pm.IPackageManager;
import android.content.pm.InstallSessionParams;
import android.content.pm.InstrumentationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageInstallerParams;
import android.content.pm.PackageInstaller.InstallResultCallback;
import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
@@ -768,6 +769,31 @@ public final class Pm {
        }
    }

    class LocalInstallResultCallback extends InstallResultCallback {
        boolean finished;
        boolean success;
        String msg;

        private void setResult(boolean success, String msg) {
            synchronized (this) {
                this.finished = true;
                this.success = success;
                this.msg = msg;
                notifyAll();
            }
        }

        @Override
        public void onSuccess() {
            setResult(true, null);
        }

        @Override
        public void onFailure(String msg) {
            setResult(false, msg);
        }
    }

    /**
     * Converts a failure code into a string by using reflection to find a matching constant
     * in PackageManager.
@@ -989,7 +1015,7 @@ public final class Pm {
    private void runInstallCreate() throws RemoteException {
        String installerPackageName = null;

        final PackageInstallerParams params = new PackageInstallerParams();
        final InstallSessionParams params = new InstallSessionParams();
        params.installFlags = PackageManager.INSTALL_ALL_USERS;
        params.fullInstall = true;

@@ -1084,21 +1110,21 @@ public final class Pm {
        try {
            session = new PackageInstaller.Session(mInstaller.openSession(sessionId));

            final LocalPackageInstallObserver observer = new LocalPackageInstallObserver();
            session.install(observer);
            final LocalInstallResultCallback callback = new LocalInstallResultCallback();
            session.install(callback);

            synchronized (observer) {
                while (!observer.finished) {
            synchronized (callback) {
                while (!callback.finished) {
                    try {
                        observer.wait();
                        callback.wait();
                    } catch (InterruptedException e) {
                    }
                }
                if (observer.result != PackageManager.INSTALL_SUCCEEDED) {
                    throw new IllegalStateException(
                            "Failure [" + installFailureToString(observer) + "]");
                if (!callback.success) {
                    throw new IllegalStateException("Failure [" + callback.msg + "]");
                }
            }

            System.out.println("Success");
        } finally {
            IoUtils.closeQuietly(session);
+8 −2
Original line number Diff line number Diff line
@@ -23,13 +23,14 @@ import android.os.Bundle;
public class PackageInstallObserver {
    private final IPackageInstallObserver2.Stub mBinder = new IPackageInstallObserver2.Stub() {
        @Override
        public void packageInstalled(String basePackageName, Bundle extras, int returnCode) {
        public void packageInstalled(String basePackageName, Bundle extras, int returnCode,
                String msg) {
            PackageInstallObserver.this.packageInstalled(basePackageName, extras, returnCode);
        }
    };

    /** {@hide} */
    public IPackageInstallObserver2.Stub getBinder() {
    public IPackageInstallObserver2 getBinder() {
        return mBinder;
    }

@@ -50,4 +51,9 @@ public class PackageInstallObserver {
     */
    public void packageInstalled(String basePackageName, Bundle extras, int returnCode) {
    }

    public void packageInstalled(String basePackageName, Bundle extras, int returnCode,
            String msg) {
        packageInstalled(basePackageName, extras, returnCode);
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ public class PackageUninstallObserver {
    };

    /** {@hide} */
    public IPackageDeleteObserver.Stub getBinder() {
    public IPackageDeleteObserver getBinder() {
        return mBinder;
    }

+1 −1
Original line number Diff line number Diff line
@@ -40,5 +40,5 @@ oneway interface IPackageInstallObserver2 {
     * </tr>
     * </table>
     */
    void packageInstalled(String basePackageName, in Bundle extras, int returnCode);
    void packageInstalled(String basePackageName, in Bundle extras, int returnCode, String msg);
}
Loading