autoconnect on fly mode (does not work yet)
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user