From ae285cc9337eed2d1a480dc9b66651a4f97f3e40 Mon Sep 17 00:00:00 2001 From: Will Date: Fri, 7 Aug 2026 14:30:53 -0500 Subject: [PATCH] fix(mobile): eager cast discovery --- mobile/lib/models/cast/cast_manager_state.dart | 15 ++++++++++++++- mobile/lib/repositories/cast.repository.dart | 18 +++++++----------- mobile/lib/services/cast.service.dart | 13 ++----------- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/mobile/lib/models/cast/cast_manager_state.dart b/mobile/lib/models/cast/cast_manager_state.dart index 3732d9fe05..50b95734a2 100644 --- a/mobile/lib/models/cast/cast_manager_state.dart +++ b/mobile/lib/models/cast/cast_manager_state.dart @@ -1,10 +1,23 @@ +import 'package:fcast_sender_sdk/fcast_sender_sdk.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; part 'cast_manager_state.freezed.dart'; enum CastDestinationType { googleCast, fCast } -enum CastState { idle, playing, paused, buffering } +enum CastState { + idle, + playing, + paused, + buffering; + + static CastState fromPlaybackState(PlaybackState state) => switch (state) { + PlaybackState.playing => CastState.playing, + PlaybackState.paused => CastState.paused, + PlaybackState.buffering => CastState.buffering, + PlaybackState.idle || PlaybackState.ended => CastState.idle, + }; +} typedef CastDestination = (String name, CastDestinationType type, dynamic device); diff --git a/mobile/lib/repositories/cast.repository.dart b/mobile/lib/repositories/cast.repository.dart index f2e2207e06..f36ec4d6ad 100644 --- a/mobile/lib/repositories/cast.repository.dart +++ b/mobile/lib/repositories/cast.repository.dart @@ -13,11 +13,13 @@ class CastRepository { final Map<(String, ProtocolType), (DeviceInfo, int?)> _discoveredDevices = {}; int _currentDeviceGeneration = 0; - Future? _initialized; + late final Future _initialized; + + void init() { + _initialized = _initialize(); + } Future connect(DeviceInfo deviceInfo) async { - await _ensureInitialized(); - _activeDevice?.disconnect(); final device = _castContext!.createDeviceFromInfo(info: deviceInfo); _activeDevice = device; @@ -68,18 +70,11 @@ class CastRepository { void seekTo(Duration position) => _activeDevice?.seek(timeSeconds: position.inSeconds.toDouble()); Future> listDestinations() async { - final isFirstScan = _initialized == null; - await _ensureInitialized(); - - if (isFirstScan) { - await Future.delayed(const Duration(seconds: 3)); - } + await _initialized; return _discoveredDevices.values.toList(growable: false); } - Future _ensureInitialized() => _initialized ??= _initialize(); - Future _initialize() async { await FCastSenderSdkLib.init(); _castContext = CastContext(); @@ -96,5 +91,6 @@ class CastRepository { }); await discoverer.init(); + await Future.delayed(const Duration(seconds: 3)); } } diff --git a/mobile/lib/services/cast.service.dart b/mobile/lib/services/cast.service.dart index b2b4120283..4dfc25291c 100644 --- a/mobile/lib/services/cast.service.dart +++ b/mobile/lib/services/cast.service.dart @@ -41,6 +41,7 @@ class CastService { CastService(this._castRepository, this._sessionsApiService, this._assetApiRepository) { _castRepository.onConnectionState = _onConnectionState; _castRepository.onDeviceEvent = _onDeviceEvent; + _castRepository.init(); } void _onConnectionState(DeviceConnectionState state) { @@ -71,17 +72,7 @@ class CastService { } void _handlePlaybackState(PlaybackState state) { - switch (state) { - case PlaybackState.playing: - onCastState?.call(CastState.playing); - case PlaybackState.paused: - onCastState?.call(CastState.paused); - case PlaybackState.buffering: - onCastState?.call(CastState.buffering); - case PlaybackState.idle: - case PlaybackState.ended: - onCastState?.call(CastState.idle); - } + onCastState?.call(CastState.fromPlaybackState(state)); } Future connect(dynamic device) async {