fix: Android app startup — INTERNET permission, MobSF scan, E2E robustness

- Add INTERNET permission to main AndroidManifest.xml (was missing from
  release builds, causing all network calls to fail on device)
- Add scripts/mobsf_scan.sh: uploads release APK to MobSF after each
  build and asserts required permissions are declared; docker pull -q
  suppresses progress-bar noise
- Wire MobSF scan into build-android task; add mobsf-stop convenience task
- Fix _AccountTile subtitle overflow on Android: replace Column([Text,Text])
  with single Text('email\ntype') so ListTile can measure height correctly
- E2E test robustness on Android: use pumpUntil(find.text('Alice')) instead
  of pumpUntil(FAB)+expect to handle Drift background-isolate stream delay;
  add skipOffstage:false to tap; remove stale email-address assertion
- Uninstall app before each Android integration test run to clear leftover
  DB state and prevent "Unable to start the app" on repeated runs
- Update widget tests to use find.textContaining for merged subtitle text

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Thomas Güttler
2026-04-26 19:02:19 +02:00
co-authored by Claude Sonnet 4.6
parent 40cbf0b3b0
commit 077ddbd9c3
7 changed files with 108 additions and 23 deletions
+5 -8
View File
@@ -192,21 +192,18 @@ void main() {
final saveButton = find.widgetWithText(FilledButton, 'Save');
await tester.ensureVisible(saveButton);
await tester.tap(saveButton);
// Save makes an async connection before navigating — wait for the FAB,
// which is only present on the account list screen.
// Wait for the account to appear in the list. This covers both the async
// connection+save and the Drift background-isolate stream propagation,
// which pumpAndSettle() alone does not flush on Android.
await pumpUntil(
tester,
find.widgetWithIcon(FloatingActionButton, Icons.add),
find.text('Alice'),
timeout: const Duration(seconds: 30),
);
// Back at account list.
expect(find.text('Alice'), findsOneWidget);
expect(find.text(userEmail), findsOneWidget);
// ── Navigate to mailboxes ──────────────────────────────────────────────
_log('navigate to mailboxes');
await tester.tap(find.text('Alice'));
await tester.tap(find.text('Alice', skipOffstage: false));
await pumpUntil(tester, find.text('INBOX'));
_log('mailboxes settled');