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
@@ -117,4 +117,23 @@ void main() {
expect(await repository.loadConnectionWifiSsidPrefix(), 'mLRS-1234');
});
test('gemerkte SSID: Standard ist null (noch nie verbunden)', () async {
final settings = await repository.load();
expect(settings.connectionWifiLastSsid, isNull);
});
test('setConnectionWifiLastSsid merkt sich die verbundene SSID', () async {
await repository.setConnectionWifiLastSsid('mLRS-ABCD');
expect(await repository.loadConnectionWifiLastSsid(), 'mLRS-ABCD');
});
test('setConnectionWifiLastSsid(null) loescht die Erinnerung wieder',
() async {
await repository.setConnectionWifiLastSsid('mLRS-ABCD');
await repository.setConnectionWifiLastSsid(null);
expect(await repository.loadConnectionWifiLastSsid(), isNull);
});
}
+49 -1
View File
@@ -19,7 +19,9 @@ class FakeMlrsNetworkController implements MlrsNetworkController {
final _packetsController = StreamController<MlrsSocketPacket>.broadcast();
final List<String> requestedSsidPrefixes = [];
final List<String?> requestedPreferredSsids = [];
final List<({Uint8List data, String host, int port})> sentPackets = [];
final List<String> rememberedSsids = [];
int releaseCount = 0;
int openSocketCount = 0;
int closeSocketCount = 0;
@@ -38,8 +40,9 @@ class FakeMlrsNetworkController implements MlrsNetworkController {
void emitPacket(MlrsSocketPacket packet) => _packetsController.add(packet);
@override
Future<void> requestNetwork(String ssidPrefix) async {
Future<void> requestNetwork(String ssidPrefix, {String? preferredSsid}) async {
requestedSsidPrefixes.add(ssidPrefix);
requestedPreferredSsids.add(preferredSsid);
}
@override
@@ -88,12 +91,15 @@ void main() {
String? host,
int port = 0,
String ssidPrefix = 'mLRS-',
String? rememberedSsid,
MlrsNetworkEvent event = const MlrsNetworkAvailable(),
}) async {
final transport = UdpTransport(
getHost: () async => host,
getPort: () async => port,
getSsidPrefix: () async => ssidPrefix,
getRememberedSsid: () async => rememberedSsid,
rememberSsid: (ssid) async => fake.rememberedSsids.add(ssid),
networkController: fake,
);
final connectFuture = transport.connect();
@@ -133,6 +139,8 @@ void main() {
getHost: () async => null,
getPort: () async => 0,
getSsidPrefix: () async => 'mLRS-',
getRememberedSsid: () async => null,
rememberSsid: (_) async {},
networkController: fake,
);
@@ -286,4 +294,44 @@ void main() {
transport.dispose();
});
test('passes the remembered SSID to requestNetwork for a silent reconnect',
() async {
final fake = FakeMlrsNetworkController();
final transport = await connectWithFake(
fake,
rememberedSsid: 'mLRS-1234',
);
expect(fake.requestedPreferredSsids, ['mLRS-1234']);
transport.dispose();
});
test('remembers the connected SSID reported by the platform', () async {
final fake = FakeMlrsNetworkController();
final transport = await connectWithFake(
fake,
event: const MlrsNetworkAvailable(ssid: 'mLRS-5678'),
);
expect(transport.connectedSsid, 'mLRS-5678');
expect(fake.rememberedSsids, ['mLRS-5678']);
transport.dispose();
});
test('connectedSsid is cleared on disconnect and network loss', () async {
final fake = FakeMlrsNetworkController();
final transport = await connectWithFake(
fake,
event: const MlrsNetworkAvailable(ssid: 'mLRS-5678'),
);
expect(transport.connectedSsid, 'mLRS-5678');
await transport.disconnect();
expect(transport.connectedSsid, isNull);
transport.dispose();
});
}
+14
View File
@@ -2,6 +2,7 @@ import 'dart:convert';
import 'package:drift/native.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
@@ -103,6 +104,19 @@ Future<ProviderContainer> _pumpWithContainer(WidgetTester tester) async {
}
void main() {
// TopModeBar instanziiert beim Wechsel in den Fly-Modus wifiTransportProvider
// (Fortschritts-Pille/Auto-Connect-Pruefung, siehe top_mode_bar.dart) - das
// erzeugt standardmaessig einen echten MethodChannelMlrsNetworkController.
// Ohne diesen Mock-Handler wirft schon der reine dispose()-Aufruf am
// Testende MissingPluginException, weil kein natives Android-Plugin
// existiert.
TestWidgetsFlutterBinding.ensureInitialized();
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
.setMockMethodCallHandler(
const MethodChannel('com.dmc.dmc_app/mlrs_network'),
(call) async => null,
);
testWidgets('AppShell zeigt die Karte und den Plan/Fly-Umschalter im Startzustand',
(tester) async {
await tester.pumpWidget(_wrap(const AppShell()));