@@ -241,6 +241,8 @@ private void updateStateWithHandler() {
241241 if ((track = trackHandler .track ()) != null ) state .enrichWithMetadata (track );
242242 else if ((episode = trackHandler .episode ()) != null ) state .enrichWithMetadata (episode );
243243 else LOGGER .warn ("Couldn't update metadata!" );
244+
245+ events .metadataAvailable ();
244246 }
245247
246248 @ Override
@@ -367,6 +369,8 @@ public void playbackHalted(@NotNull TrackHandler handler, int chunk) {
367369
368370 state .setState (true , false , true );
369371 state .updated ();
372+
373+ events .playbackHaltStateChanged (true );
370374 }
371375 }
372376
@@ -378,6 +382,8 @@ public void playbackResumedFromHalt(@NotNull TrackHandler handler, int chunk, lo
378382 state .setPosition (state .getPosition () - diff );
379383 state .setState (true , false , false );
380384 state .updated ();
385+
386+ events .playbackHaltStateChanged (false );
381387 }
382388 }
383389
@@ -703,20 +709,24 @@ public interface EventsListener {
703709 void onPlaybackResumed (long trackTime );
704710
705711 void onTrackSeeked (long trackTime );
712+
713+ void onMetadataAvailable (@ Nullable Metadata .Track track , @ Nullable Metadata .Episode episode );
714+
715+ void onPlaybackHaltStateChanged (boolean halted , long trackTime );
706716 }
707717
708718 private class EventsDispatcher {
709719 private final ExecutorService executorService = Executors .newSingleThreadExecutor (new NameThreadFactory ((r ) -> "player-events-" + r .hashCode ()));
710720 private final List <EventsListener > listeners = new ArrayList <>();
711721
712722 void dispatchPlaybackPaused () {
713- long trackTime = time ();
723+ long trackTime = state . getPosition ();
714724 for (EventsListener l : new ArrayList <>(listeners ))
715725 executorService .execute (() -> l .onPlaybackPaused (trackTime ));
716726 }
717727
718728 void dispatchPlaybackResumed () {
719- long trackTime = time ();
729+ long trackTime = state . getPosition ();
720730 for (EventsListener l : new ArrayList <>(listeners ))
721731 executorService .execute (() -> l .onPlaybackResumed (trackTime ));
722732 }
@@ -751,5 +761,22 @@ public void dispatchSeek(int pos) {
751761 for (EventsListener l : new ArrayList <>(listeners ))
752762 executorService .execute (() -> l .onTrackSeeked (pos ));
753763 }
764+
765+ public void metadataAvailable () {
766+ if (trackHandler == null ) return ;
767+
768+ Metadata .Track track = trackHandler .track ();
769+ Metadata .Episode episode = trackHandler .episode ();
770+ if (track == null && episode == null ) return ;
771+
772+ for (EventsListener l : new ArrayList <>(listeners ))
773+ executorService .execute (() -> l .onMetadataAvailable (track , episode ));
774+ }
775+
776+ public void playbackHaltStateChanged (boolean halted ) {
777+ long trackTime = state .getPosition ();
778+ for (EventsListener l : new ArrayList <>(listeners ))
779+ executorService .execute (() -> l .onPlaybackHaltStateChanged (halted , trackTime ));
780+ }
754781 }
755782}
0 commit comments