Add mediaStatusStream

This commit is contained in:
gianlucaparadise 2022-01-05 09:03:21 +01:00
parent 066324bd1a
commit 137652ddd3
5 changed files with 44 additions and 28 deletions

View file

@ -6,7 +6,13 @@ import 'SessionManager.dart';
/// Class wrapping the global context fot the Cast SDK /// Class wrapping the global context fot the Cast SDK
class CastContext { class CastContext {
CastContext(this._hostApi); CastContext(this._hostApi) {
this.sessionManager = SessionManager(_hostApi);
}
void dispose() {
this.sessionManager.dispose();
}
final CastHostApi _hostApi; final CastHostApi _hostApi;
@ -25,16 +31,8 @@ class CastContext {
_stateNotifier.value = CastState.values[castState]; _stateNotifier.value = CastState.values[castState];
} }
SessionManager? _sessionManager;
/// Returns the SessionManager. /// Returns the SessionManager.
SessionManager get sessionManager { late SessionManager sessionManager;
var result = _sessionManager;
if (result == null) {
_sessionManager = result = SessionManager(_hostApi);
}
return result;
}
} }
/// The possible casting states. /// The possible casting states.

View file

@ -1,3 +1,5 @@
import 'dart:async';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:meta/meta.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 for controlling a media player application running on a receiver.
class RemoteMediaClient { class RemoteMediaClient {
RemoteMediaClient(this._hostApi); RemoteMediaClient(this._hostApi) {
this.mediaStatusStream = this._mediaStatusStreamController.stream;
}
void dispose() {
this._mediaStatusStreamController.close();
}
final CastHostApi _hostApi; final CastHostApi _hostApi;
@ -40,6 +48,10 @@ class RemoteMediaClient {
/// Called when there is an outgoing request to the receiver. /// Called when there is an outgoing request to the receiver.
VoidCallback? onSendingRemoteMediaRequest; VoidCallback? onSendingRemoteMediaRequest;
final _mediaStatusStreamController =
StreamController<MediaStatus>.broadcast();
late Stream<MediaStatus> mediaStatusStream;
/// Called when updated ad break status information is received. /// Called when updated ad break status information is received.
MediaStatusListener? onAdBreakStatusUpdated; MediaStatusListener? onAdBreakStatusUpdated;
@ -90,4 +102,10 @@ class RemoteMediaClient {
void dispatchPlayerStateUpdate(PlayerState playerState) { void dispatchPlayerStateUpdate(PlayerState playerState) {
this._playerStateNotifier.value = playerState; this._playerStateNotifier.value = playerState;
} }
/// Internal method that shouldn't be visible
@internal
void dispatchMediaStatusUpdate(MediaStatus mediaStatus) {
this._mediaStatusStreamController.add(mediaStatus);
}
} }

View file

@ -6,7 +6,13 @@ import 'RemoteMediaClient.dart';
/// A class that manages Session instances. The application can attach a /// A class that manages Session instances. The application can attach a
/// listeners to be notified of session events. /// listeners to be notified of session events.
class SessionManager { class SessionManager {
SessionManager(this._hostApi); SessionManager(this._hostApi) {
this.remoteMediaClient = RemoteMediaClient(_hostApi);
}
void dispose() {
this.remoteMediaClient.dispose();
}
final CastHostApi _hostApi; final CastHostApi _hostApi;
@ -68,16 +74,8 @@ class SessionManager {
return await _hostApi.getCastDevice(); return await _hostApi.getCastDevice();
} }
RemoteMediaClient? _remoteMediaClient;
/// Returns the RemoteMediaClient for remote media control. /// Returns the RemoteMediaClient for remote media control.
RemoteMediaClient get remoteMediaClient { late RemoteMediaClient remoteMediaClient;
var result = _remoteMediaClient;
if (result == null) {
_remoteMediaClient = result = RemoteMediaClient(_hostApi);
}
return result;
}
} }
typedef MessageReceivedCallback = void Function( typedef MessageReceivedCallback = void Function(

View file

@ -230,12 +230,12 @@ class _ExpandedControlsState extends State<ExpandedControls> {
this.widget.castFramework.castContext.sessionManager.remoteMediaClient; this.widget.castFramework.castContext.sessionManager.remoteMediaClient;
return SafeArea( return SafeArea(
child: FutureBuilder( child: StreamBuilder<MediaStatus>(
future: remoteMediaClient.getMediaInfo(), stream: remoteMediaClient.mediaStatusStream,
builder: (BuildContext context, AsyncSnapshot<MediaInfo> snapshot) { builder: (BuildContext context, AsyncSnapshot<MediaStatus> snapshot) {
if (snapshot.hasData) { if (snapshot.hasData && snapshot.data?.mediaInfo != null) {
var mediaInfo = snapshot.data; var mediaStatus = snapshot.data;
return _getFullControls(context, mediaInfo); return _getFullControls(context, mediaStatus?.mediaInfo);
} else if (snapshot.hasError) { } else if (snapshot.hasError) {
return _getFullControls(context, null); return _getFullControls(context, null);
} else { } else {

View file

@ -111,7 +111,8 @@ class _CastFlutterApiImplementor extends CastFlutterApi {
//region RemoteMediaClient //region RemoteMediaClient
@override @override
void onAdBreakStatusUpdated(MediaStatus mediaStatus) { void onAdBreakStatusUpdated(MediaStatus mediaStatus) {
remoteMediaClient.onAdBreakStatusUpdated?.call(); remoteMediaClient.onAdBreakStatusUpdated?.call(mediaStatus);
remoteMediaClient.dispatchMediaStatusUpdate(mediaStatus);
} }
@override @override
@ -143,6 +144,7 @@ class _CastFlutterApiImplementor extends CastFlutterApi {
void onStatusUpdated(MediaStatus mediaStatus) { void onStatusUpdated(MediaStatus mediaStatus) {
final playerState = mediaStatus.playerState ?? PlayerState.unknown; final playerState = mediaStatus.playerState ?? PlayerState.unknown;
remoteMediaClient.dispatchPlayerStateUpdate(playerState); remoteMediaClient.dispatchPlayerStateUpdate(playerState);
remoteMediaClient.dispatchMediaStatusUpdate(mediaStatus);
} }
@override @override