From c74ae34ddb3b1b6af01f407b8633d43c3ac482bc Mon Sep 17 00:00:00 2001 From: Brad Ebinger Date: Fri, 29 Sep 2017 15:12:08 -0700 Subject: [PATCH] Adds a filtering bitmask to DownloadStateCallback Adds the ability for an EMBMS app to specify a filtering bitmask to DownloadStateCallback, which is used to filter out callbacks that the EMBMS app doesn't need to listen to. Test: Testapps Change-Id: Id7f26ba3c3606c644b0ca3376df1107f5834facb --- api/current.txt | 5 ++ api/system-current.txt | 5 ++ api/test-current.txt | 5 ++ .../telephony/MbmsDownloadSession.java | 6 +- .../telephony/mbms/DownloadStateCallback.java | 69 ++++++++++++++++++ .../mbms/vendor/IMbmsDownloadService.aidl | 3 +- .../mbms/vendor/MbmsDownloadServiceBase.java | 70 ++++++++++++------- 7 files changed, 135 insertions(+), 28 deletions(-) diff --git a/api/current.txt b/api/current.txt index 63c65f7afdf37..3b8f7f64650b6 100644 --- a/api/current.txt +++ b/api/current.txt @@ -40448,8 +40448,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 955fd6472ef81..6e118be0b4faf 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -43965,8 +43965,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 03c9bdb6b2eea..032d309797743 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -40670,8 +40670,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()); } };