Add mediaStatusStream
This commit is contained in:
parent
066324bd1a
commit
137652ddd3
5 changed files with 44 additions and 28 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue