diff options
author | Jeff Sharkey <jsharkey@android.com> | 2014-07-12 18:09:46 -0700 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2014-07-12 21:12:25 -0700 |
commit | a10311434778ea1be1621c2251c0c8c2966f337b (patch) | |
tree | 3496202e354ae761d7c750e105c610f67f82542d /core/java/android/content | |
parent | e0b0bef75b66f0a87039c8f58c17b1596a2baebe (diff) | |
download | frameworks_base-a10311434778ea1be1621c2251c0c8c2966f337b.zip frameworks_base-a10311434778ea1be1621c2251c0c8c2966f337b.tar.gz frameworks_base-a10311434778ea1be1621c2251c0c8c2966f337b.tar.bz2 |
Package installation listener events.
Flesh out implementation of install session observers. Carve out 20%
of published install progress for final system operations such as
dexopt, etc.
Add dumpsys output for active install sessions. Create explicit
fsync() instead of overriding meaning of flush(). Hack to throw
IOExceptions over Binder calls.
Bug: 14975160, 15348430
Change-Id: I874457e40c45d2661bc0a526df9285ffea4bb77c
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; } |