Merge "Separate active state from open/close." into lmp-dev

This commit is contained in:
Jeff Sharkey
2014-09-05 23:28:30 +00:00
committed by Android (Google) Code Review
5 changed files with 92 additions and 75 deletions

View File

@@ -8686,7 +8686,7 @@ package android.content.pm {
method public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getAllSessions();
method public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getMySessions();
method public android.content.pm.PackageInstaller.SessionInfo getSessionInfo(int);
method public android.content.pm.PackageInstaller.Session openSession(int);
method public android.content.pm.PackageInstaller.Session openSession(int) throws java.io.IOException;
method public void registerSessionCallback(android.content.pm.PackageInstaller.SessionCallback);
method public void registerSessionCallback(android.content.pm.PackageInstaller.SessionCallback, android.os.Handler);
method public void uninstall(java.lang.String, android.content.IntentSender);
@@ -8719,16 +8719,15 @@ package android.content.pm {
method public java.lang.String[] getNames() throws java.io.IOException;
method public java.io.InputStream openRead(java.lang.String) throws java.io.IOException;
method public java.io.OutputStream openWrite(java.lang.String, long, long) throws java.io.IOException;
method public void setProgress(float);
method public void setStagingProgress(float);
}
public static abstract class PackageInstaller.SessionCallback {
ctor public PackageInstaller.SessionCallback();
method public abstract void onActiveChanged(int, boolean);
method public abstract void onBadgingChanged(int);
method public abstract void onClosed(int);
method public abstract void onCreated(int);
method public abstract void onFinished(int, boolean);
method public abstract void onOpened(int);
method public abstract void onProgressChanged(int, float);
}
@@ -8741,7 +8740,7 @@ package android.content.pm {
method public java.lang.String getInstallerPackageName();
method public float getProgress();
method public int getSessionId();
method public boolean isOpen();
method public boolean isActive();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
}

View File

@@ -20,8 +20,7 @@ package android.content.pm;
oneway interface IPackageInstallerCallback {
void onSessionCreated(int sessionId);
void onSessionBadgingChanged(int sessionId);
void onSessionOpened(int sessionId);
void onSessionActiveChanged(int sessionId, boolean active);
void onSessionProgressChanged(int sessionId, float progress);
void onSessionClosed(int sessionId);
void onSessionFinished(int sessionId, boolean success);
}

View File

@@ -304,9 +304,12 @@ public class PackageInstaller {
* Open an existing session to actively perform work. To succeed, the caller
* must be the owner of the install session.
*/
public @NonNull Session openSession(int sessionId) {
public @NonNull Session openSession(int sessionId) throws IOException {
try {
return new Session(mInstaller.openSession(sessionId));
} catch (RuntimeException e) {
ExceptionUtils.maybeUnwrapIOException(e);
throw e;
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
}
@@ -363,7 +366,7 @@ public class PackageInstaller {
public @NonNull List<SessionInfo> getAllSessions() {
final ApplicationInfo info = mContext.getApplicationInfo();
if ("com.google.android.googlequicksearchbox".equals(info.packageName)
&& info.versionCode <= 300400070) {
&& info.versionCode <= 300400110) {
Log.d(TAG, "Ignoring callback request from old prebuilt");
return Collections.EMPTY_LIST;
}
@@ -436,26 +439,31 @@ public class PackageInstaller {
public abstract void onBadgingChanged(int sessionId);
/**
* Session has been opened. A session is usually opened when the
* installer is actively writing data.
* Active state for session has been changed.
* <p>
* A session is considered active whenever there is ongoing forward
* progress being made, such as the installer holding an open
* {@link Session} instance while streaming data into place, or the
* system optimizing code as the result of
* {@link Session#commit(IntentSender)}.
* <p>
* If the installer closes the {@link Session} without committing, the
* session is considered inactive until the installer opens the session
* again.
*/
public abstract void onOpened(int sessionId);
public abstract void onActiveChanged(int sessionId, boolean active);
/**
* Progress for given session has been updated.
* <p>
* Note that this progress may not directly correspond to the value
* reported by {@link PackageInstaller.Session#setProgress(float)}, as
* the system may carve out a portion of the overall progress to
* represent its own internal installation work.
* reported by
* {@link PackageInstaller.Session#setStagingProgress(float)}, as the
* system may carve out a portion of the overall progress to represent
* its own internal installation work.
*/
public abstract void onProgressChanged(int sessionId, float progress);
/**
* Session has been closed.
*/
public abstract void onClosed(int sessionId);
/**
* Session has completely finished, either with success or failure.
*/
@@ -467,10 +475,9 @@ public class PackageInstaller {
Handler.Callback {
private static final int MSG_SESSION_CREATED = 1;
private static final int MSG_SESSION_BADGING_CHANGED = 2;
private static final int MSG_SESSION_OPENED = 3;
private static final int MSG_SESSION_ACTIVE_CHANGED = 3;
private static final int MSG_SESSION_PROGRESS_CHANGED = 4;
private static final int MSG_SESSION_CLOSED = 5;
private static final int MSG_SESSION_FINISHED = 6;
private static final int MSG_SESSION_FINISHED = 5;
final SessionCallback mCallback;
final Handler mHandler;
@@ -482,24 +489,23 @@ public class PackageInstaller {
@Override
public boolean handleMessage(Message msg) {
final int sessionId = msg.arg1;
switch (msg.what) {
case MSG_SESSION_CREATED:
mCallback.onCreated(msg.arg1);
mCallback.onCreated(sessionId);
return true;
case MSG_SESSION_BADGING_CHANGED:
mCallback.onBadgingChanged(msg.arg1);
mCallback.onBadgingChanged(sessionId);
return true;
case MSG_SESSION_OPENED:
mCallback.onOpened(msg.arg1);
case MSG_SESSION_ACTIVE_CHANGED:
final boolean active = msg.arg2 != 0;
mCallback.onActiveChanged(sessionId, active);
return true;
case MSG_SESSION_PROGRESS_CHANGED:
mCallback.onProgressChanged(msg.arg1, (float) msg.obj);
return true;
case MSG_SESSION_CLOSED:
mCallback.onClosed(msg.arg1);
mCallback.onProgressChanged(sessionId, (float) msg.obj);
return true;
case MSG_SESSION_FINISHED:
mCallback.onFinished(msg.arg1, msg.arg2 != 0);
mCallback.onFinished(sessionId, msg.arg2 != 0);
return true;
}
return false;
@@ -516,8 +522,9 @@ public class PackageInstaller {
}
@Override
public void onSessionOpened(int sessionId) {
mHandler.obtainMessage(MSG_SESSION_OPENED, sessionId, 0).sendToTarget();
public void onSessionActiveChanged(int sessionId, boolean active) {
mHandler.obtainMessage(MSG_SESSION_ACTIVE_CHANGED, sessionId, active ? 1 : 0)
.sendToTarget();
}
@Override
@@ -526,11 +533,6 @@ public class PackageInstaller {
.sendToTarget();
}
@Override
public void onSessionClosed(int sessionId) {
mHandler.obtainMessage(MSG_SESSION_CLOSED, sessionId, 0).sendToTarget();
}
@Override
public void onSessionFinished(int sessionId, boolean success) {
mHandler.obtainMessage(MSG_SESSION_FINISHED, sessionId, success ? 1 : 0)
@@ -567,7 +569,7 @@ public class PackageInstaller {
// TODO: remove this temporary guard once we have new prebuilts
final ApplicationInfo info = mContext.getApplicationInfo();
if ("com.google.android.googlequicksearchbox".equals(info.packageName)
&& info.versionCode <= 300400070) {
&& info.versionCode <= 300400110) {
Log.d(TAG, "Ignoring callback request from old prebuilt");
return;
}
@@ -629,10 +631,22 @@ public class PackageInstaller {
mSession = session;
}
/**
* Set current progress. Valid values are anywhere between 0 and 1.
*/
/** {@hide} */
@Deprecated
public void setProgress(float progress) {
setStagingProgress(progress);
}
/**
* Set current progress of staging this session. Valid values are
* anywhere between 0 and 1.
* <p>
* Note that this progress may not directly correspond to the value
* reported by {@link SessionCallback#onProgressChanged(int, float)}, as
* the system may carve out a portion of the overall progress to
* represent its own internal installation work.
*/
public void setStagingProgress(float progress) {
try {
mSession.setClientProgress(progress);
} catch (RemoteException e) {
@@ -986,7 +1000,7 @@ public class PackageInstaller {
/** {@hide} */
public boolean sealed;
/** {@hide} */
public boolean open;
public boolean active;
/** {@hide} */
public int mode;
@@ -1010,7 +1024,7 @@ public class PackageInstaller {
resolvedBaseCodePath = source.readString();
progress = source.readFloat();
sealed = source.readInt() != 0;
open = source.readInt() != 0;
active = source.readInt() != 0;
mode = source.readInt();
sizeBytes = source.readLong();
@@ -1036,20 +1050,37 @@ public class PackageInstaller {
/**
* Return current overall progress of this session, between 0 and 1.
* <p>
* Note that this progress may not directly correspond to the value reported
* by {@link PackageInstaller.Session#setProgress(float)}, as the system may
* carve out a portion of the overall progress to represent its own internal
* installation work.
* Note that this progress may not directly correspond to the value
* reported by
* {@link PackageInstaller.Session#setStagingProgress(float)}, as the
* system may carve out a portion of the overall progress to represent
* its own internal installation work.
*/
public float getProgress() {
return progress;
}
/**
* Return if this session is currently open.
* Return if this session is currently active.
* <p>
* A session is considered active whenever there is ongoing forward
* progress being made, such as the installer holding an open
* {@link Session} instance while streaming data into place, or the
* system optimizing code as the result of
* {@link Session#commit(IntentSender)}.
* <p>
* If the installer closes the {@link Session} without committing, the
* session is considered inactive until the installer opens the session
* again.
*/
public boolean isActive() {
return active;
}
/** {@hide} */
@Deprecated
public boolean isOpen() {
return open;
return isActive();
}
/**
@@ -1105,7 +1136,7 @@ public class PackageInstaller {
dest.writeString(resolvedBaseCodePath);
dest.writeFloat(progress);
dest.writeInt(sealed ? 1 : 0);
dest.writeInt(open ? 1 : 0);
dest.writeInt(active ? 1 : 0);
dest.writeInt(mode);
dest.writeLong(sizeBytes);

View File

@@ -897,10 +897,9 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
private static class Callbacks extends Handler {
private static final int MSG_SESSION_CREATED = 1;
private static final int MSG_SESSION_BADGING_CHANGED = 2;
private static final int MSG_SESSION_OPENED = 3;
private static final int MSG_SESSION_ACTIVE_CHANGED = 3;
private static final int MSG_SESSION_PROGRESS_CHANGED = 4;
private static final int MSG_SESSION_CLOSED = 5;
private static final int MSG_SESSION_FINISHED = 6;
private static final int MSG_SESSION_FINISHED = 5;
private final RemoteCallbackList<IPackageInstallerCallback>
mCallbacks = new RemoteCallbackList<>();
@@ -945,15 +944,12 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
case MSG_SESSION_BADGING_CHANGED:
callback.onSessionBadgingChanged(sessionId);
break;
case MSG_SESSION_OPENED:
callback.onSessionOpened(sessionId);
case MSG_SESSION_ACTIVE_CHANGED:
callback.onSessionActiveChanged(sessionId, (boolean) msg.obj);
break;
case MSG_SESSION_PROGRESS_CHANGED:
callback.onSessionProgressChanged(sessionId, (float) msg.obj);
break;
case MSG_SESSION_CLOSED:
callback.onSessionClosed(sessionId);
break;
case MSG_SESSION_FINISHED:
callback.onSessionFinished(sessionId, (boolean) msg.obj);
break;
@@ -968,18 +964,14 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
obtainMessage(MSG_SESSION_BADGING_CHANGED, sessionId, userId).sendToTarget();
}
private void notifySessionOpened(int sessionId, int userId) {
obtainMessage(MSG_SESSION_OPENED, sessionId, userId).sendToTarget();
private void notifySessionActiveChanged(int sessionId, int userId, boolean active) {
obtainMessage(MSG_SESSION_ACTIVE_CHANGED, sessionId, userId, active).sendToTarget();
}
private void notifySessionProgressChanged(int sessionId, int userId, float progress) {
obtainMessage(MSG_SESSION_PROGRESS_CHANGED, sessionId, userId, progress).sendToTarget();
}
private void notifySessionClosed(int sessionId, int userId) {
obtainMessage(MSG_SESSION_CLOSED, sessionId, userId).sendToTarget();
}
public void notifySessionFinished(int sessionId, int userId, boolean success) {
obtainMessage(MSG_SESSION_FINISHED, sessionId, userId, success).sendToTarget();
}
@@ -1022,18 +1014,14 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
writeSessionsAsync();
}
public void onSessionOpened(PackageInstallerSession session) {
mCallbacks.notifySessionOpened(session.sessionId, session.userId);
public void onSessionActiveChanged(PackageInstallerSession session, boolean active) {
mCallbacks.notifySessionActiveChanged(session.sessionId, session.userId, active);
}
public void onSessionProgressChanged(PackageInstallerSession session, float progress) {
mCallbacks.notifySessionProgressChanged(session.sessionId, session.userId, progress);
}
public void onSessionClosed(PackageInstallerSession session) {
mCallbacks.notifySessionClosed(session.sessionId, session.userId);
}
public void onSessionFinished(PackageInstallerSession session, boolean success) {
mCallbacks.notifySessionFinished(session.sessionId, session.userId, success);
synchronized (mSessions) {

View File

@@ -227,7 +227,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
mResolvedBaseFile.getAbsolutePath() : null;
info.progress = mProgress;
info.sealed = mSealed;
info.open = mOpenCount.get() > 0;
info.active = mOpenCount.get() > 0;
info.mode = params.mode;
info.sizeBytes = params.sizeBytes;
@@ -833,14 +833,14 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
public void open() {
if (mOpenCount.getAndIncrement() == 0) {
mCallback.onSessionOpened(this);
mCallback.onSessionActiveChanged(this, true);
}
}
@Override
public void close() {
if (mOpenCount.decrementAndGet() == 0) {
mCallback.onSessionClosed(this);
mCallback.onSessionActiveChanged(this, false);
}
}