diff --git a/api/current.txt b/api/current.txt index 49e99b62bc179..f1ff672086b95 100644 --- a/api/current.txt +++ b/api/current.txt @@ -40672,8 +40672,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 { diff --git a/api/system-current.txt b/api/system-current.txt index 26c74b72a2618..54368abdf473e 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -44235,8 +44235,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 { diff --git a/api/test-current.txt b/api/test-current.txt index 9afb61fcbdcd6..3298416a26bd0 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -40943,8 +40943,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 { diff --git a/telephony/java/android/telephony/MbmsDownloadSession.java b/telephony/java/android/telephony/MbmsDownloadSession.java index ebac0419785c8..764b7b22f3d22 100644 --- a/telephony/java/android/telephony/MbmsDownloadSession.java +++ b/telephony/java/android/telephony/MbmsDownloadSession.java @@ -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."); diff --git a/telephony/java/android/telephony/mbms/DownloadStateCallback.java b/telephony/java/android/telephony/mbms/DownloadStateCallback.java index 86920bd3b2059..892fbf078ea11 100644 --- a/telephony/java/android/telephony/mbms/DownloadStateCallback.java +++ b/telephony/java/android/telephony/mbms/DownloadStateCallback.java @@ -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}. * diff --git a/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl b/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl index ed5e8268fc773..cb93542ff1682 100755 --- a/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl +++ b/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl @@ -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); diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java index d845a57b946a3..2f85a1df8a226 100644 --- a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java +++ b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java @@ -46,6 +46,47 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub { private final Map mDownloadCallbackBinderMap = new HashMap<>(); private final Map 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()); } };