diff options
Diffstat (limited to 'core/java/android/content')
-rw-r--r-- | core/java/android/content/pm/IPackageInstallerSession.aidl | 3 | ||||
-rw-r--r-- | core/java/android/content/pm/InstallSessionParams.java | 27 | ||||
-rw-r--r-- | core/java/android/content/pm/PackageInstaller.java | 61 |
3 files changed, 68 insertions, 23 deletions
diff --git a/core/java/android/content/pm/IPackageInstallerSession.aidl b/core/java/android/content/pm/IPackageInstallerSession.aidl index f881acd..d6775d4 100644 --- a/core/java/android/content/pm/IPackageInstallerSession.aidl +++ b/core/java/android/content/pm/IPackageInstallerSession.aidl @@ -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); diff --git a/core/java/android/content/pm/InstallSessionParams.java b/core/java/android/content/pm/InstallSessionParams.java index f683523..43e3314 100644 --- a/core/java/android/content/pm/InstallSessionParams.java +++ b/core/java/android/content/pm/InstallSessionParams.java @@ -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); diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index 9d756f7..401be06 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -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; } |