Merge "Adds a filtering bitmask to DownloadStateCallback"

am: 177bd65211

Change-Id: I64950a42e8079a41105d90ea6c584ca6f940a64e
This commit is contained in:
Brad Ebinger
2017-10-03 20:55:50 +00:00
committed by android-build-merger
7 changed files with 135 additions and 28 deletions

View File

@@ -40476,8 +40476,13 @@ package android.telephony.mbms {
public class DownloadStateCallback { public class DownloadStateCallback {
ctor public DownloadStateCallback(); ctor public DownloadStateCallback();
ctor public DownloadStateCallback(int);
method public final boolean isFilterFlagSet(int);
method public void onProgressUpdated(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo, int, int, int, int); method public void onProgressUpdated(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo, int, int, int, int);
method public void onStateUpdated(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo, int); method public void onStateUpdated(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo, int);
field public static final int ALL_UPDATES = 0; // 0x0
field public static final int PROGRESS_UPDATES = 1; // 0x1
field public static final int STATE_UPDATES = 2; // 0x2
} }
public final class FileInfo implements android.os.Parcelable { public final class FileInfo implements android.os.Parcelable {

View File

@@ -43995,8 +43995,13 @@ package android.telephony.mbms {
public class DownloadStateCallback { public class DownloadStateCallback {
ctor public DownloadStateCallback(); ctor public DownloadStateCallback();
ctor public DownloadStateCallback(int);
method public final boolean isFilterFlagSet(int);
method public void onProgressUpdated(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo, int, int, int, int); method public void onProgressUpdated(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo, int, int, int, int);
method public void onStateUpdated(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo, int); method public void onStateUpdated(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo, int);
field public static final int ALL_UPDATES = 0; // 0x0
field public static final int PROGRESS_UPDATES = 1; // 0x1
field public static final int STATE_UPDATES = 2; // 0x2
} }
public final class FileInfo implements android.os.Parcelable { public final class FileInfo implements android.os.Parcelable {

View File

@@ -40700,8 +40700,13 @@ package android.telephony.mbms {
public class DownloadStateCallback { public class DownloadStateCallback {
ctor public DownloadStateCallback(); ctor public DownloadStateCallback();
ctor public DownloadStateCallback(int);
method public final boolean isFilterFlagSet(int);
method public void onProgressUpdated(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo, int, int, int, int); method public void onProgressUpdated(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo, int, int, int, int);
method public void onStateUpdated(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo, int); method public void onStateUpdated(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo, int);
field public static final int ALL_UPDATES = 0; // 0x0
field public static final int PROGRESS_UPDATES = 1; // 0x1
field public static final int STATE_UPDATES = 2; // 0x2
} }
public final class FileInfo implements android.os.Parcelable { public final class FileInfo implements android.os.Parcelable {

View File

@@ -522,8 +522,7 @@ public class MbmsDownloadSession implements AutoCloseable {
* @param handler The {@link Handler} on which calls to {@code callback} should be enqueued on. * @param handler The {@link Handler} on which calls to {@code callback} should be enqueued on.
*/ */
public void registerStateCallback(@NonNull DownloadRequest request, public void registerStateCallback(@NonNull DownloadRequest request,
@NonNull DownloadStateCallback callback, @NonNull DownloadStateCallback callback, @NonNull Handler handler) {
@NonNull Handler handler) {
IMbmsDownloadService downloadService = mService.get(); IMbmsDownloadService downloadService = mService.get();
if (downloadService == null) { if (downloadService == null) {
throw new IllegalStateException("Middleware not yet bound"); throw new IllegalStateException("Middleware not yet bound");
@@ -533,7 +532,8 @@ public class MbmsDownloadSession implements AutoCloseable {
new InternalDownloadStateCallback(callback, handler); new InternalDownloadStateCallback(callback, handler);
try { try {
int result = downloadService.registerStateCallback(request, internalCallback); int result = downloadService.registerStateCallback(request, internalCallback,
callback.getCallbackFilterFlags());
if (result != MbmsErrors.SUCCESS) { if (result != MbmsErrors.SUCCESS) {
if (result == MbmsErrors.DownloadErrors.ERROR_UNKNOWN_DOWNLOAD_REQUEST) { if (result == MbmsErrors.DownloadErrors.ERROR_UNKNOWN_DOWNLOAD_REQUEST) {
throw new IllegalArgumentException("Unknown download request."); throw new IllegalArgumentException("Unknown download request.");

View File

@@ -16,8 +16,12 @@
package android.telephony.mbms; package android.telephony.mbms;
import android.annotation.IntDef;
import android.telephony.MbmsDownloadSession; import android.telephony.MbmsDownloadSession;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/** /**
* A optional listener class used by download clients to track progress. Apps should extend this * A optional listener class used by download clients to track progress. Apps should extend this
* class and pass an instance into * class and pass an instance into
@@ -28,6 +32,71 @@ import android.telephony.MbmsDownloadSession;
*/ */
public class DownloadStateCallback { public class DownloadStateCallback {
/**
* Bitmask flags used for filtering out callback methods. Used when constructing the
* DownloadStateCallback as an optional parameter.
* @hide
*/
@Retention(RetentionPolicy.SOURCE)
@IntDef({ALL_UPDATES, PROGRESS_UPDATES, STATE_UPDATES})
public @interface FilterFlag {}
/**
* Receive all callbacks.
* Default value.
*/
public static final int ALL_UPDATES = 0x00;
/**
* Receive callbacks for {@link #onProgressUpdated}.
*/
public static final int PROGRESS_UPDATES = 0x01;
/**
* Receive callbacks for {@link #onStateUpdated}.
*/
public static final int STATE_UPDATES = 0x02;
private final int mCallbackFilterFlags;
/**
* Creates a DownloadStateCallback that will receive all callbacks.
*/
public DownloadStateCallback() {
mCallbackFilterFlags = ALL_UPDATES;
}
/**
* Creates a DownloadStateCallback that will only receive callbacks for the methods specified
* via the filterFlags parameter.
* @param filterFlags A bitmask of filter flags that will specify which callback this instance
* is interested in.
*/
public DownloadStateCallback(int filterFlags) {
mCallbackFilterFlags = filterFlags;
}
/**
* Return the currently set filter flags.
* @return An integer containing the bitmask of flags that this instance is interested in.
* @hide
*/
public int getCallbackFilterFlags() {
return mCallbackFilterFlags;
}
/**
* Returns true if a filter flag is set for a particular callback method. If the flag is set,
* the callback will be delivered to the listening process.
* @param flag A filter flag specifying whether or not a callback method is registered to
* receive callbacks.
* @return true if registered to receive callbacks in the listening process, false if not.
*/
public final boolean isFilterFlagSet(@FilterFlag int flag) {
if (mCallbackFilterFlags == ALL_UPDATES) {
return true;
}
return (mCallbackFilterFlags & flag) > 0;
}
/** /**
* Called when the middleware wants to report progress for a file in a {@link DownloadRequest}. * Called when the middleware wants to report progress for a file in a {@link DownloadRequest}.
* *

View File

@@ -36,7 +36,8 @@ interface IMbmsDownloadService
int download(in DownloadRequest downloadRequest); int download(in DownloadRequest downloadRequest);
int registerStateCallback(in DownloadRequest downloadRequest, IDownloadStateCallback listener); int registerStateCallback(in DownloadRequest downloadRequest, IDownloadStateCallback listener,
int flags);
int unregisterStateCallback(in DownloadRequest downloadRequest, int unregisterStateCallback(in DownloadRequest downloadRequest,
IDownloadStateCallback listener); IDownloadStateCallback listener);

View File

@@ -46,6 +46,47 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub {
private final Map<IBinder, DownloadStateCallback> mDownloadCallbackBinderMap = new HashMap<>(); private final Map<IBinder, DownloadStateCallback> mDownloadCallbackBinderMap = new HashMap<>();
private final Map<IBinder, DeathRecipient> mDownloadCallbackDeathRecipients = new HashMap<>(); private final Map<IBinder, DeathRecipient> mDownloadCallbackDeathRecipients = new HashMap<>();
// Filters the DownloadStateCallbacks by its configuration from the app.
private abstract static class FilteredDownloadStateCallback extends DownloadStateCallback {
private final IDownloadStateCallback mCallback;
public FilteredDownloadStateCallback(IDownloadStateCallback callback, int callbackFlags) {
super(callbackFlags);
mCallback = callback;
}
@Override
public void onProgressUpdated(DownloadRequest request, FileInfo fileInfo,
int currentDownloadSize, int fullDownloadSize, int currentDecodedSize,
int fullDecodedSize) {
if (!isFilterFlagSet(PROGRESS_UPDATES)) {
return;
}
try {
mCallback.onProgressUpdated(request, fileInfo, currentDownloadSize,
fullDownloadSize, currentDecodedSize, fullDecodedSize);
} catch (RemoteException e) {
onRemoteException(e);
}
}
@Override
public void onStateUpdated(DownloadRequest request, FileInfo fileInfo,
@MbmsDownloadSession.DownloadStatus int state) {
if (!isFilterFlagSet(STATE_UPDATES)) {
return;
}
try {
mCallback.onStateUpdated(request, fileInfo, state);
} catch (RemoteException e) {
onRemoteException(e);
}
}
protected abstract void onRemoteException(RemoteException e);
}
/** /**
* Initialize the download service for this app and subId, registering the listener. * Initialize the download service for this app and subId, registering the listener.
* *
@@ -196,9 +237,8 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub {
* @hide * @hide
*/ */
@Override @Override
public final int registerStateCallback( public final int registerStateCallback(final DownloadRequest downloadRequest,
final DownloadRequest downloadRequest, final IDownloadStateCallback callback) final IDownloadStateCallback callback, int flags) throws RemoteException {
throws RemoteException {
final int uid = Binder.getCallingUid(); final int uid = Binder.getCallingUid();
DeathRecipient deathRecipient = new DeathRecipient() { DeathRecipient deathRecipient = new DeathRecipient() {
@Override @Override
@@ -211,28 +251,10 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub {
mDownloadCallbackDeathRecipients.put(callback.asBinder(), deathRecipient); mDownloadCallbackDeathRecipients.put(callback.asBinder(), deathRecipient);
callback.asBinder().linkToDeath(deathRecipient, 0); callback.asBinder().linkToDeath(deathRecipient, 0);
DownloadStateCallback exposedCallback = new DownloadStateCallback() { DownloadStateCallback exposedCallback = new FilteredDownloadStateCallback(callback, flags) {
@Override @Override
public void onProgressUpdated(DownloadRequest request, FileInfo fileInfo, int protected void onRemoteException(RemoteException e) {
currentDownloadSize, int fullDownloadSize, int currentDecodedSize, int onAppCallbackDied(uid, downloadRequest.getSubscriptionId());
fullDecodedSize) {
try {
callback.onProgressUpdated(request, fileInfo, currentDownloadSize,
fullDownloadSize,
currentDecodedSize, fullDecodedSize);
} catch (RemoteException e) {
onAppCallbackDied(uid, downloadRequest.getSubscriptionId());
}
}
@Override
public void onStateUpdated(DownloadRequest request, FileInfo fileInfo,
@MbmsDownloadSession.DownloadStatus int state) {
try {
callback.onStateUpdated(request, fileInfo, state);
} catch (RemoteException e) {
onAppCallbackDied(uid, downloadRequest.getSubscriptionId());
}
} }
}; };