fix: override accountConnectionStatusProvider in E2E test to prevent spinner deadlock
CircularProgressIndicator in _AccountTile (from accountConnectionStatusProvider) runs continuously and prevents pumpAndSettle() from ever settling on Android, causing frame-pump storms that drop the StreamBuilder data state and make tap(aliceTile) find 0 widgets. Overriding the provider to return immediately means no spinner ever enters the tree, so pumpUntil() can use pumpAndSettle() cleanly again. Also adds task run-android (boots sharedinbox_test AVD and runs flutter run). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
c4928ef362
commit
e50ff3cd1d
@@ -6,9 +6,9 @@ Do one thing, ask if unsure first!
|
||||
|
||||
Then implement.
|
||||
|
||||
Then run `task check`.
|
||||
Then run `task deploy-android`. Fix, if there are errors.
|
||||
|
||||
Then move task to done.md
|
||||
Then move task which you implementeed to done.md. Keep tasks you did not work in the file.
|
||||
|
||||
Check if all files are staged.
|
||||
|
||||
@@ -17,3 +17,92 @@ Git repo should not contain unknown files.
|
||||
Then commit.
|
||||
|
||||
## Tasks
|
||||
|
||||
Override `accountConnectionStatusProvider` in the Android E2E test so `CircularProgressIndicator` never appears.
|
||||
|
||||
`_AccountTile` in `lib/ui/screens/account_list_screen.dart` watches `accountConnectionStatusProvider(account.id)` (defined at `lib/di.dart:118`). It is a `FutureProvider.autoDispose.family` that connects to the real IMAP server. While loading, it shows a `CircularProgressIndicator` in the tile's trailing widget. That continuously-running animation prevents `pumpAndSettle()` from ever settling in Flutter integration tests on Android, causing frame-pump storms that can drop the `StreamBuilder`'s data state and make `tap(aliceTile)` find 0 widgets.
|
||||
|
||||
The current workaround in `integration_test/app_e2e_test.dart` is to replace `pumpAndSettle()` with `pump(300ms)` inside `pumpUntil`. The real fix is to override the provider so it completes immediately — no spinner ever enters the tree.
|
||||
|
||||
1. In `integration_test/app_e2e_test.dart`, add `accountConnectionStatusProvider` to the `overrides` list passed to `app.main(...)`:
|
||||
|
||||
```dart
|
||||
app.main(
|
||||
overrides: [
|
||||
secureStorageProvider.overrideWithValue(_InMemorySecureStorage()),
|
||||
imapConnectProvider.overrideWithValue(_connectImapPlaintext),
|
||||
smtpConnectProvider.overrideWithValue(_connectSmtpPlaintext),
|
||||
// Override so _AccountTile never shows a CircularProgressIndicator:
|
||||
// pumpAndSettle() cannot settle while a continuously-running animation is in the tree.
|
||||
accountConnectionStatusProvider.overrideWith((ref, _) async {}),
|
||||
],
|
||||
);
|
||||
```
|
||||
|
||||
1. After adding the override, revert `pumpUntil` back to using `pumpAndSettle()` instead of `pump(const Duration(milliseconds: 300))` — the original comment about `CircularProgressIndicator` and the bounded-pump workaround can both be removed.
|
||||
|
||||
1. Verify the Linux UI E2E test still passes (`task integration-ui`) and the Android E2E test passes (`task integration-android`).
|
||||
|
||||
Constraints: only `integration_test/app_e2e_test.dart` should be modified. No production code changes.
|
||||
|
||||
---
|
||||
|
||||
When I download and install the apk, then the app starts, but closes again immediatly.
|
||||
|
||||
I want an automated test, which ensures the apk is functional.
|
||||
|
||||
If that test fails, then the upload should not be done.
|
||||
|
||||
---
|
||||
|
||||
I opened an account. How to get back to the list of accounts?
|
||||
|
||||
I saw no way to do that.
|
||||
|
||||
---
|
||||
|
||||
I opened a mailbox. I search for "foo bar". I want to see all mails containing foo and bar. Not
|
||||
mails containing "foo bar" exactly.
|
||||
|
||||
---
|
||||
|
||||
I search for "foo". Now I see all mails containing "foo". I want to easily do the common actions on
|
||||
the selected mails: Delete, Archive, Move to Folder, Move to Junk, ...
|
||||
|
||||
---
|
||||
|
||||
How can I edit the Sieve Filter?
|
||||
|
||||
---
|
||||
|
||||
When adding a new account, and no well-known file was found, not exact hint in DNS, then
|
||||
SMTP/IMAP/JMAP should use the mx record as fallback.
|
||||
|
||||
---
|
||||
|
||||
How can I edit Sieve Scripts? Afaik this feature was added.
|
||||
|
||||
---
|
||||
|
||||
Replace the custom TextField-in-AppBar search implementation in
|
||||
lib/ui/screens/email_list_screen.dart with Flutter's built-in SearchBar / SearchAnchor widget
|
||||
(Flutter 3.x).
|
||||
|
||||
Goals:
|
||||
|
||||
Remove the _isSearching bool, the _searchController, the slide animation, and the manual Timer
|
||||
debounce
|
||||
|
||||
Use SearchAnchor + SearchBar to drive the _searchQuery state that filters the email list
|
||||
|
||||
Keep the existing filter logic untouched — just replace the input mechanism
|
||||
|
||||
The search bar should live in the AppBar area; if SearchAnchor doesn't fit cleanly there, use
|
||||
SearchBar standalone with onChanged (no debounce needed — let the user control submit, or accept
|
||||
instant filter)
|
||||
|
||||
Preserve all existing AppBar actions (compose, sync, settings) when search is not active
|
||||
|
||||
Update or remove any tests in integration_test/ that relied on the old search widget tree
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user