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 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.
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue