autoconnect on fly mode (does not work yet)

This commit is contained in:
Constantin Leue
2026-08-02 08:25:23 +02:00
parent 5e9ef43f2f
commit 607dbb6584
13 changed files with 430 additions and 29 deletions
+33 -3
View File
@@ -32,16 +32,22 @@ class UdpTransport implements LinkTransport {
required Future<String?> Function() getHost,
required Future<int> Function() getPort,
required Future<String> Function() getSsidPrefix,
required Future<String?> Function() getRememberedSsid,
required Future<void> Function(String ssid) rememberSsid,
MlrsNetworkController? networkController,
}) : _getHost = getHost,
_getPort = getPort,
_getSsidPrefix = getSsidPrefix,
_getRememberedSsid = getRememberedSsid,
_rememberSsid = rememberSsid,
_networkController =
networkController ?? MethodChannelMlrsNetworkController();
final Future<String?> Function() _getHost;
final Future<int> Function() _getPort;
final Future<String> Function() _getSsidPrefix;
final Future<String?> Function() _getRememberedSsid;
final Future<void> Function(String ssid) _rememberSsid;
final MlrsNetworkController _networkController;
final _incomingController = StreamController<Uint8List>.broadcast();
@@ -54,6 +60,7 @@ class UdpTransport implements LinkTransport {
int? _boundPort;
bool _socketOpen = false;
bool? _staConcurrencySupported;
String? _connectedSsid;
LinkState _state = LinkState.disconnected;
LinkErrorReason? _lastErrorReason;
@@ -85,6 +92,13 @@ class UdpTransport implements LinkTransport {
/// nicht ermittelbar (API < 30, Doku Abschnitt 4/8).
bool? get staConcurrencySupported => _staConcurrencySupported;
/// Tatsaechliche SSID des verbundenen Netzes, sobald von Android
/// ermittelbar (Doku Abschnitt 8: "verbundenes WLAN anzeigen"). Wird bei
/// jedem erfolgreichen [connect] auch dauerhaft gemerkt (siehe
/// [_rememberSsid]), damit kuenftige Verbindungen exakt statt per Praefix
/// angefragt werden koennen.
String? get connectedSsid => _connectedSsid;
@override
Future<void> connect() async {
_lastErrorReason = null;
@@ -92,13 +106,17 @@ class UdpTransport implements LinkTransport {
_setState(LinkState.connecting);
final ssidPrefix = await _getSsidPrefix();
final rememberedSsid = await _getRememberedSsid();
final firstEvent = Completer<MlrsNetworkEvent>();
final requestSub = _networkController.events.listen((event) {
if (!firstEvent.isCompleted) firstEvent.complete(event);
});
try {
await _networkController.requestNetwork(ssidPrefix);
await _networkController.requestNetwork(
ssidPrefix,
preferredSsid: rememberedSsid,
);
final event = await firstEvent.future;
await requestSub.cancel();
@@ -115,6 +133,11 @@ class UdpTransport implements LinkTransport {
// unten, nicht erst danach (Doku Abschnitt 8).
_networkLossSub = _networkController.events.listen(_onNetworkEvent);
_connectedSsid = available.ssid;
if (available.ssid != null) {
await _rememberSsid(available.ssid!);
}
final configuredHost = await _getHost();
final configuredPort = await _getPort();
final prefillHost = (configuredHost != null && configuredHost.isNotEmpty)
@@ -170,6 +193,7 @@ class UdpTransport implements LinkTransport {
_packetSub?.cancel();
_packetSub = null;
_boundPort = null;
_connectedSsid = null;
if (_socketOpen) {
_socketOpen = false;
unawaited(_networkController.closeSocket());
@@ -193,6 +217,7 @@ class UdpTransport implements LinkTransport {
await _packetSub?.cancel();
_packetSub = null;
_boundPort = null;
_connectedSsid = null;
if (_socketOpen) {
_socketOpen = false;
await _networkController.closeSocket();
@@ -220,9 +245,14 @@ class UdpTransport implements LinkTransport {
_packetSub?.cancel();
if (_socketOpen) {
_socketOpen = false;
unawaited(_networkController.closeSocket());
// dispose() darf nie eine unbehandelte Future-Exception hinterlassen -
// z.B. wirft der Platform-Channel MissingPluginException, wenn
// ueberhaupt kein natives Gegenstueck existiert (Tests, Web/Desktop-
// UI-Vorschau). Der Aufrufer kann an dieser Stelle ohnehin nicht mehr
// reagieren.
unawaited(_networkController.closeSocket().catchError((_) {}));
}
unawaited(_networkController.releaseNetwork());
unawaited(_networkController.releaseNetwork().catchError((_) {}));
_networkController.dispose();
_incomingController.close();
_stateController.close();