From 137652ddd39d6e6498a904c2a905f37c63f3127c Mon Sep 17 00:00:00 2001 From: gianlucaparadise Date: Wed, 5 Jan 2022 09:03:21 +0100 Subject: [PATCH] Add mediaStatusStream --- lib/src/cast/CastContext.dart | 18 ++++++++--------- lib/src/cast/RemoteMediaClient.dart | 20 ++++++++++++++++++- lib/src/cast/SessionManager.dart | 18 ++++++++--------- .../expanded_controls/ExpandedControls.dart | 12 +++++------ lib/src/flutter_cast_framework.dart | 4 +++- 5 files changed, 44 insertions(+), 28 deletions(-) diff --git a/lib/src/cast/CastContext.dart b/lib/src/cast/CastContext.dart index 1d70916..c3fec4f 100644 --- a/lib/src/cast/CastContext.dart +++ b/lib/src/cast/CastContext.dart @@ -6,7 +6,13 @@ import 'SessionManager.dart'; /// Class wrapping the global context fot the Cast SDK class CastContext { - CastContext(this._hostApi); + CastContext(this._hostApi) { + this.sessionManager = SessionManager(_hostApi); + } + + void dispose() { + this.sessionManager.dispose(); + } final CastHostApi _hostApi; @@ -25,16 +31,8 @@ class CastContext { _stateNotifier.value = CastState.values[castState]; } - SessionManager? _sessionManager; - /// Returns the SessionManager. - SessionManager get sessionManager { - var result = _sessionManager; - if (result == null) { - _sessionManager = result = SessionManager(_hostApi); - } - return result; - } + late SessionManager sessionManager; } /// The possible casting states. diff --git a/lib/src/cast/RemoteMediaClient.dart b/lib/src/cast/RemoteMediaClient.dart index aef2113..15d85f7 100644 --- a/lib/src/cast/RemoteMediaClient.dart +++ b/lib/src/cast/RemoteMediaClient.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/foundation.dart'; import 'package:meta/meta.dart'; @@ -16,7 +18,13 @@ typedef MediaStatusListener = void Function(MediaStatus mediaStatus); /// Class for controlling a media player application running on a receiver. class RemoteMediaClient { - RemoteMediaClient(this._hostApi); + RemoteMediaClient(this._hostApi) { + this.mediaStatusStream = this._mediaStatusStreamController.stream; + } + + void dispose() { + this._mediaStatusStreamController.close(); + } final CastHostApi _hostApi; @@ -40,6 +48,10 @@ class RemoteMediaClient { /// Called when there is an outgoing request to the receiver. VoidCallback? onSendingRemoteMediaRequest; + final _mediaStatusStreamController = + StreamController.broadcast(); + late Stream mediaStatusStream; + /// Called when updated ad break status information is received. MediaStatusListener? onAdBreakStatusUpdated; @@ -90,4 +102,10 @@ class RemoteMediaClient { void dispatchPlayerStateUpdate(PlayerState playerState) { this._playerStateNotifier.value = playerState; } + + /// Internal method that shouldn't be visible + @internal + void dispatchMediaStatusUpdate(MediaStatus mediaStatus) { + this._mediaStatusStreamController.add(mediaStatus); + } } diff --git a/lib/src/cast/SessionManager.dart b/lib/src/cast/SessionManager.dart index d942a28..3389669 100644 --- a/lib/src/cast/SessionManager.dart +++ b/lib/src/cast/SessionManager.dart @@ -6,7 +6,13 @@ import 'RemoteMediaClient.dart'; /// A class that manages Session instances. The application can attach a /// listeners to be notified of session events. class SessionManager { - SessionManager(this._hostApi); + SessionManager(this._hostApi) { + this.remoteMediaClient = RemoteMediaClient(_hostApi); + } + + void dispose() { + this.remoteMediaClient.dispose(); + } final CastHostApi _hostApi; @@ -68,16 +74,8 @@ class SessionManager { return await _hostApi.getCastDevice(); } - RemoteMediaClient? _remoteMediaClient; - /// Returns the RemoteMediaClient for remote media control. - RemoteMediaClient get remoteMediaClient { - var result = _remoteMediaClient; - if (result == null) { - _remoteMediaClient = result = RemoteMediaClient(_hostApi); - } - return result; - } + late RemoteMediaClient remoteMediaClient; } typedef MessageReceivedCallback = void Function( diff --git a/lib/src/cast/widgets/expanded_controls/ExpandedControls.dart b/lib/src/cast/widgets/expanded_controls/ExpandedControls.dart index 2cec65a..e2d92bd 100644 --- a/lib/src/cast/widgets/expanded_controls/ExpandedControls.dart +++ b/lib/src/cast/widgets/expanded_controls/ExpandedControls.dart @@ -230,12 +230,12 @@ class _ExpandedControlsState extends State { this.widget.castFramework.castContext.sessionManager.remoteMediaClient; return SafeArea( - child: FutureBuilder( - future: remoteMediaClient.getMediaInfo(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasData) { - var mediaInfo = snapshot.data; - return _getFullControls(context, mediaInfo); + child: StreamBuilder( + stream: remoteMediaClient.mediaStatusStream, + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasData && snapshot.data?.mediaInfo != null) { + var mediaStatus = snapshot.data; + return _getFullControls(context, mediaStatus?.mediaInfo); } else if (snapshot.hasError) { return _getFullControls(context, null); } else { diff --git a/lib/src/flutter_cast_framework.dart b/lib/src/flutter_cast_framework.dart index 99ed4ef..4666b32 100644 --- a/lib/src/flutter_cast_framework.dart +++ b/lib/src/flutter_cast_framework.dart @@ -111,7 +111,8 @@ class _CastFlutterApiImplementor extends CastFlutterApi { //region RemoteMediaClient @override void onAdBreakStatusUpdated(MediaStatus mediaStatus) { - remoteMediaClient.onAdBreakStatusUpdated?.call(); + remoteMediaClient.onAdBreakStatusUpdated?.call(mediaStatus); + remoteMediaClient.dispatchMediaStatusUpdate(mediaStatus); } @override @@ -143,6 +144,7 @@ class _CastFlutterApiImplementor extends CastFlutterApi { void onStatusUpdated(MediaStatus mediaStatus) { final playerState = mediaStatus.playerState ?? PlayerState.unknown; remoteMediaClient.dispatchPlayerStateUpdate(playerState); + remoteMediaClient.dispatchMediaStatusUpdate(mediaStatus); } @override