Add IMAP folder navigation drawer + per-API E2E CI matrix #3

Merged
JMR-dev merged 2 commits from feat-folder-view into main 2026-06-30 17:36:30 +00:00
JMR-dev commented 2026-06-30 17:24:15 +00:00 (Migrated from github.com)

Folder view via IMAP

A left navigation drawer (hamburger, top-left) lists each account's IMAP folders; tapping one browses and caches that folder's mail.

Because IMAP UIDs are unique only within a folder, the whole stack became folder-aware:

  • Message id is now accountId:folder:uid, with a dedicated folder column (Room v7→v8, MIGRATION_7_8).
  • ImapClient.listFolders returns rich folder metadata; the fetch/body/flag/delete/search paths take a folder argument.
  • Standard folders (Inbox/Sent/Drafts/Spam/Trash/Archive) surface with friendly names + icons via RFC 6154 SPECIAL-USE attributes, with a case-insensitive name fallback.
  • Multi-account: an account switcher + unified "All Inboxes". Default unified-inbox behavior is unchanged.
  • INBOX stays the only auto-synced, IDLE-watched, notifying folder; other folders sync on demand.

minSdk 33 → 29

Supports a rolling ~7-year window of Android versions. The only compat fix needed was guarding the API-33 POST_NOTIFICATIONS request.

Tests & CI

  • espresso-core 3.6.1 → 3.7.0 so Compose UI tests run on API 37 again.
  • New coverage: FolderRoleTest, ImapClientTest folder cases (GreenMail), MailboxViewModelTest, MailRepositoryImplTest folder routing, a FolderDrawer Compose UI test, and LibreMailDatabaseTest folder DAO/reconcile tests.
  • Per-API E2E matrix over every API 29–36 + Gradle Managed Devices; a single CI passed gate job fans in all jobs (required by branch protection).
  • API 37 (preview): a non-blocking, custom-provisioned E2E job (emulator-runner can't provision the google_apis_ps16k image) with system-image caching.
  • arm64: debug-build + unit-tests run on ubuntu-24.04-arm; emulators stay x86_64/KVM.

Verified locally

  • 25 unit tests + instrumented Compose UI/Room tests green (incl. on a real Android 10 / API 29 emulator and API 37).
  • assembleRelease (R8 + lintVital/NewApi) passes on minSdk 29.

Heads-up: debug-build/unit-tests now run on Linux arm64 — the first CI run confirms build-tools 37.0.0 ships linux-aarch64 binaries (rollback = revert those two runs-on to ubuntu-latest).

🤖 Generated with Claude Code

## Folder view via IMAP A left navigation drawer (hamburger, top-left) lists each account's IMAP folders; tapping one browses and caches that folder's mail. Because IMAP UIDs are unique only *within* a folder, the whole stack became folder-aware: - Message id is now `accountId:folder:uid`, with a dedicated `folder` column (Room **v7→v8**, `MIGRATION_7_8`). - `ImapClient.listFolders` returns rich folder metadata; the fetch/body/flag/delete/search paths take a folder argument. - Standard folders (Inbox/Sent/Drafts/Spam/Trash/Archive) surface with friendly names + icons via RFC 6154 SPECIAL-USE attributes, with a case-insensitive name fallback. - Multi-account: an account switcher + unified "All Inboxes". Default unified-inbox behavior is unchanged. - INBOX stays the only auto-synced, IDLE-watched, notifying folder; other folders sync on demand. ## minSdk 33 → 29 Supports a rolling ~7-year window of Android versions. The only compat fix needed was guarding the API-33 `POST_NOTIFICATIONS` request. ## Tests & CI - **espresso-core 3.6.1 → 3.7.0** so Compose UI tests run on API 37 again. - New coverage: `FolderRoleTest`, `ImapClientTest` folder cases (GreenMail), `MailboxViewModelTest`, `MailRepositoryImplTest` folder routing, a `FolderDrawer` Compose UI test, and `LibreMailDatabaseTest` folder DAO/reconcile tests. - **Per-API E2E matrix** over every API 29–36 + Gradle Managed Devices; a single **`CI passed`** gate job fans in all jobs (required by branch protection). - **API 37 (preview)**: a non-blocking, custom-provisioned E2E job (emulator-runner can't provision the `google_apis_ps16k` image) with system-image caching. - **arm64**: `debug-build` + `unit-tests` run on `ubuntu-24.04-arm`; emulators stay x86_64/KVM. ### Verified locally - 25 unit tests + instrumented Compose UI/Room tests green (incl. on a real **Android 10 / API 29** emulator and **API 37**). - `assembleRelease` (R8 + lintVital/NewApi) passes on minSdk 29. > Heads-up: `debug-build`/`unit-tests` now run on Linux arm64 — the first CI run confirms `build-tools 37.0.0` ships linux-aarch64 binaries (rollback = revert those two `runs-on` to `ubuntu-latest`). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.