Merge "Adds a filtering bitmask to DownloadStateCallback" am: 177bd65211

am: 387b90aa97

Change-Id: I4332a7f839aec731acaafbb9fa6213f2ada39857
This commit is contained in:
Brad Ebinger
2017-10-03 21:13:34 +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 {
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 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 {

View File

@@ -43996,8 +43996,13 @@ package android.telephony.mbms {
public class 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 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 {

View File

@@ -40700,8 +40700,13 @@ package android.telephony.mbms {
public class 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 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 {

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.
*/
public void registerStateCallback(@NonNull DownloadRequest request,
@NonNull DownloadStateCallback callback,
@NonNull Handler handler) {
@NonNull DownloadStateCallback callback, @NonNull Handler handler) {
IMbmsDownloadService downloadService = mService.get();
if (downloadService == null) {
throw new IllegalStateException("Middleware not yet bound");
@@ -533,7 +532,8 @@ public class MbmsDownloadSession implements AutoCloseable {
new InternalDownloadStateCallback(callback, handler);
try {
int result = downloadService.registerStateCallback(request, internalCallback);
int result = downloadService.registerStateCallback(request, internalCallback,
callback.getCallbackFilterFlags());
if (result != MbmsErrors.SUCCESS) {
if (result == MbmsErrors.DownloadErrors.ERROR_UNKNOWN_DOWNLOAD_REQUEST) {
throw new IllegalArgumentException("Unknown download request.");

View File

@@ -16,8 +16,12 @@
package android.telephony.mbms;
import android.annotation.IntDef;
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
* class and pass an instance into
@@ -28,6 +32,71 @@ import android.telephony.MbmsDownloadSession;
*/
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}.
*

View File

@@ -36,7 +36,8 @@ interface IMbmsDownloadService
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,
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, 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.
*
@@ -196,9 +237,8 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub {
* @hide
*/
@Override
public final int registerStateCallback(
final DownloadRequest downloadRequest, final IDownloadStateCallback callback)
throws RemoteException {
public final int registerStateCallback(final DownloadRequest downloadRequest,
final IDownloadStateCallback callback, int flags) throws RemoteException {
final int uid = Binder.getCallingUid();
DeathRecipient deathRecipient = new DeathRecipient() {
@Override
@@ -211,28 +251,10 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub {
mDownloadCallbackDeathRecipients.put(callback.asBinder(), deathRecipient);
callback.asBinder().linkToDeath(deathRecipient, 0);
DownloadStateCallback exposedCallback = new DownloadStateCallback() {
DownloadStateCallback exposedCallback = new FilteredDownloadStateCallback(callback, flags) {
@Override
public void onProgressUpdated(DownloadRequest request, FileInfo fileInfo, int
currentDownloadSize, int fullDownloadSize, int currentDecodedSize, int
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());
}
protected void onRemoteException(RemoteException e) {
onAppCallbackDied(uid, downloadRequest.getSubscriptionId());
}
};