Skip to content

Commit

Permalink
refactored THEOlive interfaces and new PublicationState property
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel Dallos committed Oct 18, 2024
1 parent d39aa55 commit 14932f8
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 17 deletions.
Original file line number Diff line number Diff line change
@@ -1,14 +1,35 @@
import 'package:theoplayer_platform_interface/theolive/theolive_api.dart';
import 'package:theoplayer_platform_interface/theolive/theolive_events.dart';
import 'package:theoplayer_platform_interface/theolive/theolive_internal_api.dart';
import 'package:theoplayer_platform_interface/theoplayer_event_dispatcher_interface.dart';
import 'package:theoplayer_platform_interface/theoplayer_event_manager.dart';
import 'package:theoplayer_platform_interface/theoplayer_events.dart';

class THEOliveAPIHolder extends THEOliveInternalInterface {
class THEOliveAPIHolder extends THEOlive {
final EventManager _eventManager = EventManager();

PublicationState _publicationState = PublicationState.idle;

THEOliveStateChangeListener? _stateChangeListener;
THEOliveInternalInterface? _internalTHEOliveAPI;

void forwardingEventListener(event) {
@override
PublicationState get publicationState => _publicationState;

void _forwardingEventListener(event) {
var oldPublicationState = publicationState;
switch (event) {
case PublicationLoadStartEvent e: _publicationState = PublicationState.loading;
case PublicationLoadedEvent e: _publicationState = PublicationState.loaded;
case PublicationOfflineEvent e: _publicationState = PublicationState.offline;
case IntentToFallbackEvent e: _publicationState = PublicationState.intentToFallback;
default:
break;
}

if (oldPublicationState != _publicationState) {
_stateChangeListener?.call();
}
_eventManager.dispatchEvent(event);
}

Expand All @@ -18,12 +39,12 @@ class THEOliveAPIHolder extends THEOliveInternalInterface {
void setup(THEOliveInternalInterface? internalTHEOliveAPI) {
_internalTHEOliveAPI = internalTHEOliveAPI;

_internalTHEOliveAPI?.addEventListener(THEOliveApiEventTypes.PUBLICATIONLOADSTART, forwardingEventListener);
_internalTHEOliveAPI?.addEventListener(THEOliveApiEventTypes.PUBLICATIONLOADED, forwardingEventListener);
_internalTHEOliveAPI?.addEventListener(THEOliveApiEventTypes.PUBLICATIONOFFLINE, forwardingEventListener);
_internalTHEOliveAPI?.addEventListener(THEOliveApiEventTypes.INTENTTOFALLBACK, forwardingEventListener);
_internalTHEOliveAPI?.addEventListener(THEOliveApiEventTypes.ENTERBADNETWORKMODE, forwardingEventListener);
_internalTHEOliveAPI?.addEventListener(THEOliveApiEventTypes.EXITBADNETWORKMODE, forwardingEventListener);
_internalTHEOliveAPI?.addEventListener(THEOliveApiEventTypes.PUBLICATIONLOADSTART, _forwardingEventListener);
_internalTHEOliveAPI?.addEventListener(THEOliveApiEventTypes.PUBLICATIONLOADED, _forwardingEventListener);
_internalTHEOliveAPI?.addEventListener(THEOliveApiEventTypes.PUBLICATIONOFFLINE, _forwardingEventListener);
_internalTHEOliveAPI?.addEventListener(THEOliveApiEventTypes.INTENTTOFALLBACK, _forwardingEventListener);
_internalTHEOliveAPI?.addEventListener(THEOliveApiEventTypes.ENTERBADNETWORKMODE, _forwardingEventListener);
_internalTHEOliveAPI?.addEventListener(THEOliveApiEventTypes.EXITBADNETWORKMODE, _forwardingEventListener);

}

Expand All @@ -39,12 +60,14 @@ class THEOliveAPIHolder extends THEOliveInternalInterface {

/// Method to clean the listeners.
void dispose() {
_internalTHEOliveAPI?.removeEventListener(THEOliveApiEventTypes.PUBLICATIONLOADSTART, forwardingEventListener);
_internalTHEOliveAPI?.removeEventListener(THEOliveApiEventTypes.PUBLICATIONLOADED, forwardingEventListener);
_internalTHEOliveAPI?.removeEventListener(THEOliveApiEventTypes.PUBLICATIONOFFLINE, forwardingEventListener);
_internalTHEOliveAPI?.removeEventListener(THEOliveApiEventTypes.INTENTTOFALLBACK, forwardingEventListener);
_internalTHEOliveAPI?.removeEventListener(THEOliveApiEventTypes.ENTERBADNETWORKMODE, forwardingEventListener);
_internalTHEOliveAPI?.removeEventListener(THEOliveApiEventTypes.EXITBADNETWORKMODE, forwardingEventListener);
_internalTHEOliveAPI?.removeEventListener(THEOliveApiEventTypes.PUBLICATIONLOADSTART, _forwardingEventListener);
_internalTHEOliveAPI?.removeEventListener(THEOliveApiEventTypes.PUBLICATIONLOADED, _forwardingEventListener);
_internalTHEOliveAPI?.removeEventListener(THEOliveApiEventTypes.PUBLICATIONOFFLINE, _forwardingEventListener);
_internalTHEOliveAPI?.removeEventListener(THEOliveApiEventTypes.INTENTTOFALLBACK, _forwardingEventListener);
_internalTHEOliveAPI?.removeEventListener(THEOliveApiEventTypes.ENTERBADNETWORKMODE, _forwardingEventListener);
_internalTHEOliveAPI?.removeEventListener(THEOliveApiEventTypes.EXITBADNETWORKMODE, _forwardingEventListener);
_stateChangeListener = null;
_publicationState = PublicationState.idle;
_eventManager.clear();
}

Expand All @@ -63,4 +86,9 @@ class THEOliveAPIHolder extends THEOliveInternalInterface {
_internalTHEOliveAPI?.preloadChannels(channelIDs);
}

@override
void setStateListener(THEOliveStateChangeListener listener) {
_stateChangeListener = listener;
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
import 'package:theoplayer_platform_interface/theoplayer_event_dispatcher_interface.dart';


/// Callback that's triggered every time the internal player state is changing. See [THEOplayer.setStateListener].
typedef THEOliveStateChangeListener = void Function();

abstract class THEOlive implements EventDispatcher{
void preloadChannels(List<String> channelIDs);
void set badNetworkMode(bool badNetworkMode);
bool get badNetworkMode;
void setStateListener(THEOliveStateChangeListener listener);
PublicationState get publicationState;
}

enum PublicationState { idle, loading, loaded, intentToFallback, offline }
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import 'package:theoplayer_platform_interface/theolive/theolive_api.dart';
import 'package:theoplayer_platform_interface/theoplayer_event_dispatcher_interface.dart';

abstract class THEOliveInternalInterface extends THEOlive {
abstract class THEOliveInternalInterface implements EventDispatcher {
void preloadChannels(List<String> channelIDs);
void set badNetworkMode(bool badNetworkMode);
bool get badNetworkMode;
void dispose();
}
}

0 comments on commit 14932f8

Please sign in to comment.