diff --git a/mobile/lib/ui/cast/auto.dart b/mobile/lib/ui/cast/auto.dart index 8afacf7db..4dc9d5bd0 100644 --- a/mobile/lib/ui/cast/auto.dart +++ b/mobile/lib/ui/cast/auto.dart @@ -100,7 +100,7 @@ class _AutoCastDialogState extends State { if (message.containsKey(CastMessageType.pairCode)) { final code = message[CastMessageType.pairCode]!['code']; widget.onConnect(code); - // Navigator.of(context).pop(); + Navigator.of(context).pop(); } }, ); diff --git a/mobile/lib/ui/viewer/gallery/gallery_app_bar_widget.dart b/mobile/lib/ui/viewer/gallery/gallery_app_bar_widget.dart index 4365b7813..489d5478e 100644 --- a/mobile/lib/ui/viewer/gallery/gallery_app_bar_widget.dart +++ b/mobile/lib/ui/viewer/gallery/gallery_app_bar_widget.dart @@ -583,9 +583,14 @@ class _GalleryAppBarWidgetState extends State { Tooltip( message: "Cast album", child: IconButton( - icon: const Icon(Icons.cast_outlined), + icon: castService.getActiveSessions().isNotEmpty + ? const Icon(Icons.cast_connected_rounded) + : const Icon(Icons.cast_outlined), onPressed: () async { await _castChoiceDialog(); + if (mounted) { + setState(() {}); + } }, ), ), @@ -855,6 +860,21 @@ class _GalleryAppBarWidgetState extends State { Future _castChoiceDialog() async { final gw = CastGateway(NetworkClient.instance.enteDio); + if (castService.getActiveSessions().isNotEmpty) { + await showChoiceDialog( + context, + title: "Stop casting", + firstButtonLabel: "Yes", + secondButtonLabel: "No", + body: "Do you want to stop casting?", + firstButtonOnTap: () async { + gw.revokeAllTokens().ignore(); + await castService.closeActiveCasts(); + }, + ); + return; + } + // stop any existing cast session gw.revokeAllTokens().ignore(); final result = await showDialog( diff --git a/mobile/plugins/ente_cast/lib/src/service.dart b/mobile/plugins/ente_cast/lib/src/service.dart index 82d8c5978..2ab0961db 100644 --- a/mobile/plugins/ente_cast/lib/src/service.dart +++ b/mobile/plugins/ente_cast/lib/src/service.dart @@ -12,7 +12,7 @@ abstract class CastService { void Function(Map>)? onMessage, }); // returns a map of sessionID to deviceNames - Future> getActiveSessions(); + Map getActiveSessions(); Future closeActiveCasts(); } diff --git a/mobile/plugins/ente_cast_none/lib/src/service.dart b/mobile/plugins/ente_cast_none/lib/src/service.dart index 007a4daaa..c78188973 100644 --- a/mobile/plugins/ente_cast_none/lib/src/service.dart +++ b/mobile/plugins/ente_cast_none/lib/src/service.dart @@ -28,7 +28,7 @@ class CastServiceImpl extends CastService { } @override - Future> getActiveSessions() { + Map getActiveSessions() { // TODO: implement getActiveSessions throw UnimplementedError(); } diff --git a/mobile/plugins/ente_cast_normal/lib/src/service.dart b/mobile/plugins/ente_cast_normal/lib/src/service.dart index 314194b94..a2c4206c8 100644 --- a/mobile/plugins/ente_cast_normal/lib/src/service.dart +++ b/mobile/plugins/ente_cast_normal/lib/src/service.dart @@ -70,24 +70,27 @@ class CastServiceImpl extends CastService { Future closeActiveCasts() { final sessions = CastSessionManager().sessions; for (final session in sessions) { - session.sendMessage( - _pairRequestNamespace, - { - "type": "CLOSE", - }, - ); + debugPrint("send close message for ${session.sessionId}"); + session.sendMessage(CastSession.kNamespaceConnection, { + 'type': 'CLOSE', + }); + debugPrint("close session ${session.sessionId}"); session.close(); } + CastSessionManager().sessions.clear(); + debugPrint("send close message"); return Future.value(); } @override - Future> getActiveSessions() { + Map getActiveSessions() { final sessions = CastSessionManager().sessions; final Map result = {}; for (final session in sessions) { - result[session.sessionId] = session.state.toString(); + if (session.state == CastSessionState.connected) { + result[session.sessionId] = session.state.toString(); + } } - return Future.value(result); + return result; } }