diff --git a/lib/ui/setup_page.dart b/lib/ui/setup_page.dart index 6cd34cd59..893b843fd 100644 --- a/lib/ui/setup_page.dart +++ b/lib/ui/setup_page.dart @@ -12,15 +12,15 @@ class SetupPage extends StatefulWidget { } class _SetupPageState extends State { - bool _errorFindingEndpoint = false; + bool _shouldSearchForEndpoint = true; String _enteredEndpoint = ""; @override Widget build(BuildContext context) { if (Configuration.instance.getEndpoint() == null && - !_errorFindingEndpoint) { + _shouldSearchForEndpoint) { EndpointFinder.instance.findEndpoint().then((endpoint) { - if (mounted) { + if (mounted && endpoint != null) { setState(() { Configuration.instance.setEndpoint(endpoint); }); @@ -28,7 +28,7 @@ class _SetupPageState extends State { }).catchError((e) { if (mounted) { setState(() { - _errorFindingEndpoint = true; + _shouldSearchForEndpoint = false; }); } }); @@ -44,10 +44,10 @@ class _SetupPageState extends State { Widget _getBody() { if (Configuration.instance.getEndpoint() == null && - !_errorFindingEndpoint) { + _shouldSearchForEndpoint) { return _getSearchScreen(); } else if (Configuration.instance.getEndpoint() == null && - _errorFindingEndpoint) { + !_shouldSearchForEndpoint) { return _getManualEndpointEntryScreen(); } else { return SignInWidget(() { @@ -83,7 +83,7 @@ class _SetupPageState extends State { await EndpointFinder.instance.ping(_enteredEndpoint); if (success) { setState(() { - _errorFindingEndpoint = false; + _shouldSearchForEndpoint = false; Configuration.instance.setEndpoint(_enteredEndpoint); }); } else { @@ -102,11 +102,23 @@ class _SetupPageState extends State { Center _getSearchScreen() { return Center( child: Column( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.center, children: [ AnimatedSearchIconWidget(), Text("Searching for ente server..."), + Align( + alignment: Alignment.bottomCenter, + child: CupertinoButton( + child: Text("Enter manually instead"), + onPressed: () async { + EndpointFinder.instance.cancelSearch(); + setState(() { + _shouldSearchForEndpoint = false; + }); + }, + ), + ), ], ), ); diff --git a/lib/utils/endpoint_finder.dart b/lib/utils/endpoint_finder.dart index 1575ae172..b9e505453 100644 --- a/lib/utils/endpoint_finder.dart +++ b/lib/utils/endpoint_finder.dart @@ -14,7 +14,10 @@ class EndpointFinder { static final EndpointFinder instance = EndpointFinder._privateConstructor(); + bool _shouldContinueSearch; + Future findEndpoint() { + _shouldContinueSearch = true; return (Connectivity().getWifiIP()).then((ip) async { logger.info(ip); final ipSplit = ip.split("."); @@ -26,7 +29,7 @@ class EndpointFinder { } logger.info(prefix); - for (int i = 1; i <= 255; i++) { + for (int i = 1; i <= 255 && _shouldContinueSearch; i++) { var endpoint = prefix + i.toString(); try { final success = await ping(endpoint); @@ -37,10 +40,19 @@ class EndpointFinder { // Do nothing } } - throw TimeoutException("Could not find a valid endpoint"); + if (_shouldContinueSearch) { + throw TimeoutException("Could not find a valid endpoint"); + } else { + // Exit gracefully + return Future.value(null); + } }); } + void cancelSearch() { + _shouldContinueSearch = false; + } + Future ping(String endpoint) async { return _dio.get("http://" + endpoint + ":8080/ping").then((response) { if (response.data["message"] == "pong") {