diff options
Diffstat (limited to 'android/telephony/mbms')
-rw-r--r-- | android/telephony/mbms/DownloadStateCallback.java | 69 | ||||
-rw-r--r-- | android/telephony/mbms/MbmsDownloadReceiver.java | 6 | ||||
-rw-r--r-- | android/telephony/mbms/ServiceInfo.java | 20 | ||||
-rw-r--r-- | android/telephony/mbms/vendor/MbmsDownloadServiceBase.java | 70 | ||||
-rw-r--r-- | android/telephony/mbms/vendor/VendorUtils.java | 3 |
5 files changed, 136 insertions, 32 deletions
diff --git a/android/telephony/mbms/DownloadStateCallback.java b/android/telephony/mbms/DownloadStateCallback.java index 86920bd3..892fbf07 100644 --- a/android/telephony/mbms/DownloadStateCallback.java +++ b/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 @@ -29,6 +33,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}. * * @param request a {@link DownloadRequest}, indicating which download is being referenced. diff --git a/android/telephony/mbms/MbmsDownloadReceiver.java b/android/telephony/mbms/MbmsDownloadReceiver.java index 61415b50..fe275372 100644 --- a/android/telephony/mbms/MbmsDownloadReceiver.java +++ b/android/telephony/mbms/MbmsDownloadReceiver.java @@ -165,6 +165,12 @@ public class MbmsDownloadReceiver extends BroadcastReceiver { Log.w(LOG_TAG, "Download result did not include a result code. Ignoring."); return false; } + // We do not need to verify below extras if the result is not success. + if (MbmsDownloadSession.RESULT_SUCCESSFUL != + intent.getIntExtra(MbmsDownloadSession.EXTRA_MBMS_DOWNLOAD_RESULT, + MbmsDownloadSession.RESULT_CANCELLED)) { + return true; + } if (!intent.hasExtra(MbmsDownloadSession.EXTRA_MBMS_DOWNLOAD_REQUEST)) { Log.w(LOG_TAG, "Download result did not include the associated request. Ignoring."); return false; diff --git a/android/telephony/mbms/ServiceInfo.java b/android/telephony/mbms/ServiceInfo.java index 9a01ed00..8529f525 100644 --- a/android/telephony/mbms/ServiceInfo.java +++ b/android/telephony/mbms/ServiceInfo.java @@ -23,6 +23,7 @@ import android.os.Parcelable; import android.text.TextUtils; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -62,12 +63,6 @@ public class ServiceInfo { throw new RuntimeException("bad locales length " + newLocales.size()); } - for (Locale l : newLocales) { - if (!newNames.containsKey(l)) { - throw new IllegalArgumentException("A name must be provided for each locale"); - } - } - names = new HashMap(newNames.size()); names.putAll(newNames); className = newClassName; @@ -127,7 +122,7 @@ public class ServiceInfo { * Get the user-displayable name for this cell-broadcast service corresponding to the * provided {@link Locale}. * @param locale The {@link Locale} in which you want the name of the service. This must be a - * value from the list returned by {@link #getLocales()} -- an + * value from the set returned by {@link #getNamedContentLocales()} -- an * {@link java.util.NoSuchElementException} may be thrown otherwise. * @return The {@link CharSequence} providing the name of the service in the given * {@link Locale} @@ -140,6 +135,17 @@ public class ServiceInfo { } /** + * Return an unmodifiable set of the current {@link Locale}s that have a user-displayable name + * associated with them. The user-displayable name associated with any {@link Locale} in this + * set can be retrieved with {@link #getNameForLocale(Locale)}. + * @return An unmodifiable set of {@link Locale} objects corresponding to a user-displayable + * content name in that locale. + */ + public @NonNull Set<Locale> getNamedContentLocales() { + return Collections.unmodifiableSet(names.keySet()); + } + + /** * The class name for this service - used to categorize and filter */ public String getServiceClassName() { diff --git a/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java b/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java index d845a57b..2f85a1df 100644 --- a/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java +++ b/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java @@ -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()); } }; diff --git a/android/telephony/mbms/vendor/VendorUtils.java b/android/telephony/mbms/vendor/VendorUtils.java index 8fb27b29..a43f1224 100644 --- a/android/telephony/mbms/vendor/VendorUtils.java +++ b/android/telephony/mbms/vendor/VendorUtils.java @@ -38,8 +38,9 @@ public class VendorUtils { /** * The MBMS middleware should send this when a download of single file has completed or - * failed. Mandatory extras are + * failed. The only mandatory extra is * {@link MbmsDownloadSession#EXTRA_MBMS_DOWNLOAD_RESULT} + * and the following are required when the download has completed: * {@link MbmsDownloadSession#EXTRA_MBMS_FILE_INFO} * {@link MbmsDownloadSession#EXTRA_MBMS_DOWNLOAD_REQUEST} * {@link #EXTRA_TEMP_LIST} |