Loading cmds/pm/src/com/android/commands/pm/Pm.java +8 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -769,7 +769,7 @@ public final class Pm { } } class LocalInstallResultCallback extends InstallResultCallback { class LocalCommitResultCallback extends CommitResultCallback { boolean finished; boolean success; String msg; Loading Loading @@ -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) { Loading @@ -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); } Loading Loading @@ -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 { Loading @@ -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) { Loading core/java/android/content/pm/IPackageInstallerSession.aidl +2 −1 Original line number Diff line number Diff line Loading @@ -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); Loading core/java/android/content/pm/InstallSessionParams.java +27 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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; Loading @@ -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(); Loading Loading @@ -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; } Loading @@ -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; Loading @@ -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); Loading core/java/android/content/pm/PackageInstaller.java +39 −22 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); } Loading Loading @@ -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) { Loading @@ -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) { Loading Loading @@ -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(); } Loading @@ -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(); } Loading Loading @@ -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); /** Loading Loading @@ -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; } Loading core/java/android/os/FileBridge.java +1 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading
cmds/pm/src/com/android/commands/pm/Pm.java +8 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -769,7 +769,7 @@ public final class Pm { } } class LocalInstallResultCallback extends InstallResultCallback { class LocalCommitResultCallback extends CommitResultCallback { boolean finished; boolean success; String msg; Loading Loading @@ -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) { Loading @@ -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); } Loading Loading @@ -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 { Loading @@ -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) { Loading
core/java/android/content/pm/IPackageInstallerSession.aidl +2 −1 Original line number Diff line number Diff line Loading @@ -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); Loading
core/java/android/content/pm/InstallSessionParams.java +27 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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; Loading @@ -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(); Loading Loading @@ -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; } Loading @@ -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; Loading @@ -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); Loading
core/java/android/content/pm/PackageInstaller.java +39 −22 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); } Loading Loading @@ -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) { Loading @@ -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) { Loading Loading @@ -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(); } Loading @@ -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(); } Loading Loading @@ -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); /** Loading Loading @@ -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; } Loading
core/java/android/os/FileBridge.java +1 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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