Files
sharedinbox/next.md
T
Thomas GüttlerandClaude Sonnet 4.6 e50ff3cd1d 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>
2026-04-26 21:22:38 +02:00

4.0 KiB

Next

Introduction

Do one thing, ask if unsure first!

Then implement.

Then run task deploy-android. Fix, if there are errors.

Then move task which you implementeed to done.md. Keep tasks you did not work in the file.

Check if all files are staged.

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(...):
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.

  2. 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