summaryrefslogtreecommitdiffstats
path: root/core/java/android/content
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2014-07-12 18:09:46 -0700
committerJeff Sharkey <jsharkey@android.com>2014-07-12 21:12:25 -0700
commita10311434778ea1be1621c2251c0c8c2966f337b (patch)
tree3496202e354ae761d7c750e105c610f67f82542d /core/java/android/content
parente0b0bef75b66f0a87039c8f58c17b1596a2baebe (diff)
downloadframeworks_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.aidl3
-rw-r--r--core/java/android/content/pm/InstallSessionParams.java27
-rw-r--r--core/java/android/content/pm/PackageInstaller.java61
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;
}