From 778ac50116cb76ce71a445e621b0daf37471456f Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Mon, 23 Feb 2026 14:08:52 +0100 Subject: [PATCH] perf: fast offline startup close #511 --- lib/main.dart | 22 ++++++++++++++++++++-- lib/services/plex_auth_service.dart | 5 ++++- lib/utils/connection_constants.dart | 6 ++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 3a92545c..80849bf0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -36,6 +36,7 @@ import 'services/server_registry.dart'; import 'services/download_manager_service.dart'; import 'services/pip_service.dart'; import 'services/download_storage_service.dart'; +import 'package:connectivity_plus/connectivity_plus.dart'; import 'services/plex_api_cache.dart'; import 'database/app_database.dart'; import 'utils/app_logger.dart'; @@ -376,8 +377,14 @@ class _SetupScreenState extends State { final storage = await StorageService.getInstance(); final registry = ServerRegistry(storage); - // Refresh servers from API to get updated connection info (IPs may change) - await registry.refreshServersFromApi(); + // Check network connectivity early to fast-path airplane mode + final connectivityResult = await Connectivity().checkConnectivity(); + final hasNetwork = !connectivityResult.contains(ConnectivityResult.none); + + if (hasNetwork) { + // Refresh servers from API to get updated connection info (IPs may change) + await registry.refreshServersFromApi(); + } // Load all configured servers final servers = await registry.getServers(); @@ -391,6 +398,17 @@ class _SetupScreenState extends State { if (!mounted) return; + // No network — skip connection attempts and go straight to offline mode + if (!hasNetwork) { + await context.read().ensureInitialized(); + if (!mounted) return; + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => const MainScreen(isOfflineMode: true)), + ); + return; + } + try { final result = await ServerConnectionOrchestrator.connectAndInitialize( servers: servers, diff --git a/lib/services/plex_auth_service.dart b/lib/services/plex_auth_service.dart index 1187385a..ef715099 100644 --- a/lib/services/plex_auth_service.dart +++ b/lib/services/plex_auth_service.dart @@ -51,7 +51,10 @@ class PlexAuthService { static Future create() async { final storage = await StorageService.getInstance(); - final dio = Dio(); + final dio = Dio(BaseOptions( + connectTimeout: ConnectionTimeouts.plexTvConnect, + receiveTimeout: ConnectionTimeouts.plexTvReceive, + )); // Get or create client identifier String? clientIdentifier = storage.getClientIdentifier(); diff --git a/lib/utils/connection_constants.dart b/lib/utils/connection_constants.dart index a6fe6bec..b8127e31 100644 --- a/lib/utils/connection_constants.dart +++ b/lib/utils/connection_constants.dart @@ -17,4 +17,10 @@ class ConnectionTimeouts { /// Dio receive timeout for streaming/large responses from a Plex server. static const receive = Duration(seconds: 120); + + /// Dio connect timeout for plex.tv / clients.plex.tv API requests. + static const plexTvConnect = Duration(seconds: 5); + + /// Dio receive timeout for plex.tv / clients.plex.tv API responses. + static const plexTvReceive = Duration(seconds: 10); }