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).
## 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)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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:
accountId:folder:uid, with a dedicatedfoldercolumn (Room v7→v8,MIGRATION_7_8).ImapClient.listFoldersreturns rich folder metadata; the fetch/body/flag/delete/search paths take a folder argument.minSdk 33 → 29
Supports a rolling ~7-year window of Android versions. The only compat fix needed was guarding the API-33
POST_NOTIFICATIONSrequest.Tests & CI
FolderRoleTest,ImapClientTestfolder cases (GreenMail),MailboxViewModelTest,MailRepositoryImplTestfolder routing, aFolderDrawerCompose UI test, andLibreMailDatabaseTestfolder DAO/reconcile tests.CI passedgate job fans in all jobs (required by branch protection).google_apis_ps16kimage) with system-image caching.debug-build+unit-testsrun onubuntu-24.04-arm; emulators stay x86_64/KVM.Verified locally
assembleRelease(R8 + lintVital/NewApi) passes on minSdk 29.🤖 Generated with Claude Code