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 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.

View file

@ -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<MediaStatus>.broadcast();
late Stream<MediaStatus> 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);
}
}

View file

@ -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(

View file

@ -230,12 +230,12 @@ class _ExpandedControlsState extends State<ExpandedControls> {
this.widget.castFramework.castContext.sessionManager.remoteMediaClient;
return SafeArea(
child: FutureBuilder(
future: remoteMediaClient.getMediaInfo(),
builder: (BuildContext context, AsyncSnapshot<MediaInfo> snapshot) {
if (snapshot.hasData) {
var mediaInfo = snapshot.data;
return _getFullControls(context, mediaInfo);
child: StreamBuilder<MediaStatus>(
stream: remoteMediaClient.mediaStatusStream,
builder: (BuildContext context, AsyncSnapshot<MediaStatus> 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 {

View file

@ -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