diff --git a/example/lib/expanded_controls_route.dart b/example/lib/expanded_controls_route.dart index 6186da4..df0b8c4 100644 --- a/example/lib/expanded_controls_route.dart +++ b/example/lib/expanded_controls_route.dart @@ -14,7 +14,7 @@ class ExpandedControlsRoute extends StatelessWidget { return Scaffold( body: ExpandedControls( castFramework: castFramework, - onBackTapped: () => Navigator.pop(context), + onCloseRequested: () => Navigator.pop(context), ), ); } diff --git a/lib/src/cast/widgets/expanded_controls/ExpandedControls.dart b/lib/src/cast/widgets/expanded_controls/ExpandedControls.dart index 25fe5fe..831ede9 100644 --- a/lib/src/cast/widgets/expanded_controls/ExpandedControls.dart +++ b/lib/src/cast/widgets/expanded_controls/ExpandedControls.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:flutter_cast_framework/src/cast/widgets/expanded_controls/ExpandedControlsToolbar.dart'; import '../../../../cast.dart'; import 'ExpandedControlsConnectedDeviceLabel.dart'; import 'ExpandedControlsPlayer.dart'; import 'ExpandedControlsProgress.dart'; +import 'ExpandedControlsToolbar.dart'; const _topDownBlackGradient = BoxDecoration( gradient: LinearGradient( @@ -31,13 +31,15 @@ const _bottomUpBlackGradient = BoxDecoration( class ExpandedControls extends StatefulWidget { final FlutterCastFramework castFramework; final String? castingToText; - final VoidCallback? onBackTapped; + + /// This is called when the back button is tapped or when the session is closed + final VoidCallback? onCloseRequested; final controller = ExpandedControlsProgressController(); ExpandedControls({ required this.castFramework, this.castingToText, - this.onBackTapped, + this.onCloseRequested, }); @override @@ -48,6 +50,9 @@ class _ExpandedControlsState extends State { @override void initState() { final sessionManager = widget.castFramework.castContext.sessionManager; + sessionManager.state.addListener(_onSessionStateChanged); + sessionManager.remoteMediaClient.playerState + .addListener(_onPlayerStateChanged); sessionManager.remoteMediaClient.onProgressUpdated = _onProgressUpdated; super.initState(); @@ -56,6 +61,9 @@ class _ExpandedControlsState extends State { @override void dispose() { final sessionManager = widget.castFramework.castContext.sessionManager; + sessionManager.state.removeListener(_onSessionStateChanged); + sessionManager.remoteMediaClient.playerState + .removeListener(_onPlayerStateChanged); sessionManager.remoteMediaClient.onProgressUpdated = null; widget.controller.dispose(); @@ -63,6 +71,33 @@ class _ExpandedControlsState extends State { super.dispose(); } + void _onPlayerStateChanged() { + final sessionManager = widget.castFramework.castContext.sessionManager; + final state = sessionManager.remoteMediaClient.playerState.value; + switch (state) { + case PlayerState.idle: + widget.onCloseRequested?.call(); + break; + default: + // unhandled + break; + } + } + + void _onSessionStateChanged() { + final sessionManager = widget.castFramework.castContext.sessionManager; + final state = sessionManager.state.value; + switch (state) { + case SessionState.idle: + case SessionState.ended: + widget.onCloseRequested?.call(); + break; + default: + // unhandled + break; + } + } + void _onProgressUpdated(int progress, int duration) { widget.controller.updateProgress(progress, duration); } @@ -80,7 +115,7 @@ class _ExpandedControlsState extends State { castFramework: widget.castFramework, title: title, subtitle: subtitle, - onBackTapped: widget.onBackTapped, + onBackTapped: widget.onCloseRequested, ), ); }