1919import static org .digitalmediaserver .cast .util .Util .requireNotNull ;
2020import java .util .Arrays ;
2121import java .util .Collection ;
22+ import java .util .Collections ;
2223import java .util .EnumSet ;
2324import java .util .EventListener ;
2425import java .util .HashMap ;
@@ -277,6 +278,9 @@ public interface CastEventListenerList {
277278 */
278279 public abstract static class AbstractCastEventListenerList implements CastEventListenerList {
279280
281+ /** A {@link EnumSet} of all {@link CastEventType}s */
282+ protected static final EnumSet <CastEventType > ALL_TYPES ;
283+
280284 /** The identifier for the cast device used in logging */
281285 @ Nonnull
282286 protected final String remoteName ;
@@ -308,17 +312,33 @@ protected AbstractCastEventListenerList(@Nonnull String remoteName) {
308312 this .remoteName = remoteName ;
309313 }
310314
315+ static {
316+ ALL_TYPES = EnumSet .allOf (CastEventType .class );
317+ ALL_TYPES .remove (CastEventType .ALL );
318+ }
319+
311320 @ Override
312321 public boolean add (@ Nullable CastEventListener listener , CastEventType ... eventTypes ) {
313322 if (listener == null ) {
314323 return false ;
315324 }
316325 synchronized (filtersLock ) {
326+ List <CastEventType > eventTypeList ;
327+ if (eventTypes == null || eventTypes .length == 0 ) {
328+ eventTypeList = Collections .emptyList ();
329+ } else {
330+ eventTypeList = Arrays .asList (eventTypes );
331+ }
317332 if (listeners .contains (listener )) {
318- if (eventTypes == null || eventTypes . length == 0 ) {
333+ if (eventTypeList . isEmpty () ) {
319334 return filters .remove (listener ) != null ;
320335 }
321- EnumSet <CastEventType > newTypes = EnumSet .copyOf (Arrays .asList (eventTypes ));
336+ EnumSet <CastEventType > newTypes ;
337+ if (eventTypeList .contains (CastEventType .ALL )) {
338+ newTypes = ALL_TYPES ;
339+ } else {
340+ newTypes = EnumSet .copyOf (eventTypeList );
341+ }
322342 Set <CastEventType > types = filters .get (listener );
323343 if (types == null ) {
324344 filters .put (listener , newTypes );
@@ -328,8 +348,12 @@ public boolean add(@Nullable CastEventListener listener, CastEventType... eventT
328348 }
329349
330350 listeners .add (listener );
331- if (eventTypes != null && eventTypes .length > 0 ) {
332- filters .put (listener , EnumSet .copyOf (Arrays .asList (eventTypes )));
351+ if (!eventTypeList .isEmpty ()) {
352+ if (eventTypeList .contains (CastEventType .ALL )) {
353+ filters .put (listener , EnumSet .copyOf (ALL_TYPES ));
354+ } else {
355+ filters .put (listener , EnumSet .copyOf (eventTypeList ));
356+ }
333357 }
334358 return true ;
335359 }
@@ -634,6 +658,11 @@ public void run() {
634658 */
635659 public enum CastEventType {
636660
661+ /**
662+ * Event is never fired, but can be used to subscribe to all event types.
663+ */
664+ ALL (Object .class ),
665+
637666 /**
638667 * Event is fired when an unclaimed {@link AppAvailabilityResponse} is
639668 * received, which shouldn't normally happen
0 commit comments