diff --git a/mobile/lib/interfaces/cast_destination_service.interface.dart b/mobile/lib/interfaces/cast_destination_service.interface.dart index c649dacf963..add8ad7c51c 100644 --- a/mobile/lib/interfaces/cast_destination_service.interface.dart +++ b/mobile/lib/interfaces/cast_destination_service.interface.dart @@ -20,6 +20,7 @@ abstract interface class ICastDestinationService { void play(); void pause(); void seekTo(Duration position); + void stop(); Future disconnect(); Future> getDevices(); diff --git a/mobile/lib/pages/common/gallery_viewer.page.dart b/mobile/lib/pages/common/gallery_viewer.page.dart index fd41a590306..09dac353fb1 100644 --- a/mobile/lib/pages/common/gallery_viewer.page.dart +++ b/mobile/lib/pages/common/gallery_viewer.page.dart @@ -130,6 +130,7 @@ class GalleryViewerPage extends HookConsumerWidget { if (isCasting) { WidgetsBinding.instance.addPostFrameCallback((_) { if (context.mounted) { + ref.read(castProvider.notifier).stop(); context.scaffoldMessenger.showSnackBar( SnackBar( duration: const Duration(seconds: 1), @@ -398,6 +399,7 @@ class GalleryViewerPage extends HookConsumerWidget { context.scaffoldMessenger.clearSnackBars(); if (isCasting) { + ref.read(castProvider.notifier).stop(); context.scaffoldMessenger.showSnackBar( SnackBar( duration: const Duration(seconds: 2), diff --git a/mobile/lib/providers/cast.provider.dart b/mobile/lib/providers/cast.provider.dart index 5fa3482a7f4..c80789d2e02 100644 --- a/mobile/lib/providers/cast.provider.dart +++ b/mobile/lib/providers/cast.provider.dart @@ -83,6 +83,10 @@ class CastNotifier extends StateNotifier { _gCastService.seekTo(position); } + void stop() { + _gCastService.stop(); + } + Future disconnect() async { await _gCastService.disconnect(); } diff --git a/mobile/lib/services/gcast.service.dart b/mobile/lib/services/gcast.service.dart index eb2b3ee756d..9361cf533f6 100644 --- a/mobile/lib/services/gcast.service.dart +++ b/mobile/lib/services/gcast.service.dart @@ -263,6 +263,17 @@ class GCastService implements ICastDestinationService { }); } + @override + void stop() { + _gCastRepository.sendMessage(CastSession.kNamespaceMedia, { + "type": "STOP", + "mediaSessionId": _sessionId, + }); + _mediaStatusPollingTimer?.cancel(); + + currentAssetId = null; + } + @override Future> getDevices() async { final dests = await _gCastRepository.listDestinations();