From 2d6e52651fb6d0f522f498ada2a69cf8d7d8d5d1 Mon Sep 17 00:00:00 2001 From: gianlucaparadise Date: Wed, 1 Dec 2021 08:06:00 +0100 Subject: [PATCH] ExpandedControls: integrate player state --- .../expanded_controls/ExpandedControls.dart | 4 +- .../ExpandedControlsPlayer.dart | 79 ++++++++++++++----- 2 files changed, 63 insertions(+), 20 deletions(-) diff --git a/lib/src/cast/widgets/expanded_controls/ExpandedControls.dart b/lib/src/cast/widgets/expanded_controls/ExpandedControls.dart index 6b26f78..a647b99 100644 --- a/lib/src/cast/widgets/expanded_controls/ExpandedControls.dart +++ b/lib/src/cast/widgets/expanded_controls/ExpandedControls.dart @@ -108,7 +108,9 @@ class _ExpandedControlsState extends State { ), Padding( padding: const EdgeInsets.all(8.0), - child: ExpandedControlsPlayer(), + child: ExpandedControlsPlayer( + castFramework: widget.castFramework, + ), ), ], ), diff --git a/lib/src/cast/widgets/expanded_controls/ExpandedControlsPlayer.dart b/lib/src/cast/widgets/expanded_controls/ExpandedControlsPlayer.dart index b243d64..a4990e6 100644 --- a/lib/src/cast/widgets/expanded_controls/ExpandedControlsPlayer.dart +++ b/lib/src/cast/widgets/expanded_controls/ExpandedControlsPlayer.dart @@ -1,20 +1,23 @@ import 'package:flutter/material.dart'; +import 'package:flutter_cast_framework/cast.dart'; class ExpandedControlsPlayer extends StatelessWidget { - final VoidCallback? onClosedCaptionPressed; - final VoidCallback? onPrevPressed; - final VoidCallback? onPlayPausePressed; - final VoidCallback? onNextPressed; - final VoidCallback? onVolumePressed; + final FlutterCastFramework castFramework; ExpandedControlsPlayer({ - this.onClosedCaptionPressed, - this.onPrevPressed, - this.onPlayPausePressed, - this.onNextPressed, - this.onVolumePressed, + required this.castFramework, }); + void _onPlayClicked() { + final sessionManager = castFramework.castContext.sessionManager; + sessionManager.remoteMediaClient.play(); + } + + void _onPauseClicked() { + final sessionManager = castFramework.castContext.sessionManager; + sessionManager.remoteMediaClient.pause(); + } + Widget _getIconButton(IconData icon, VoidCallback? onPressed) { return IconButton( padding: EdgeInsets.zero, @@ -31,19 +34,57 @@ class ExpandedControlsPlayer extends StatelessWidget { ); } + Widget _getPlayPauseButton(PlayerState playerState) { + IconData icon; + VoidCallback? callback; + + switch (playerState) { + case PlayerState.unknown: + icon = Icons.play_circle; + break; + case PlayerState.idle: + icon = Icons.play_circle; + break; + case PlayerState.playing: + icon = Icons.pause_circle; + callback = _onPauseClicked; + break; + case PlayerState.paused: + icon = Icons.play_circle; + callback = _onPlayClicked; + break; + case PlayerState.buffering: + icon = Icons.pause_circle; + callback = _onPauseClicked; + break; + case PlayerState.loading: + icon = Icons.play_circle; + break; + } + + return _getBigIconButton(icon, callback); + } + @override Widget build(BuildContext context) { + final sessionManager = castFramework.castContext.sessionManager; return Padding( padding: const EdgeInsets.symmetric(horizontal: 36, vertical: 0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _getIconButton(Icons.closed_caption, onClosedCaptionPressed), - _getIconButton(Icons.skip_previous, onPrevPressed), - _getBigIconButton(Icons.pause_circle, onPlayPausePressed), - _getIconButton(Icons.skip_next, onNextPressed), - _getIconButton(Icons.volume_up, onVolumePressed), - ], + child: ValueListenableBuilder( + valueListenable: sessionManager.playerState, + builder: (context, value, child) { + final playerState = value as PlayerState; + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _getIconButton(Icons.closed_caption, null), + _getIconButton(Icons.skip_previous, null), + _getPlayPauseButton(playerState), + _getIconButton(Icons.skip_next, null), + _getIconButton(Icons.volume_up, null), + ], + ); + }, ), ); }