feat: long-press multi-select, aggressive prefetch, and download indicators
Add a long-press contextual action bar to the mailbox: Archive, Delete, Spam, Move, Select All, and (single-selection only) Reply, Reply All, and Forward. Reply All/Spam/Delete are confirmed first; deleting from Trash or Spam warns that it is permanent. - Delete moves to Trash and Spam moves to the Spam folder; only deletes already in Trash/Spam do a permanent IMAP expunge. Archive/Spam/Move resolve the destination per account so the unified inbox works. - Reply/Reply All/Forward force a fresh server fetch of the original (recipients + body via BODY.PEEK), build a quoted draft, and open compose; a spinner shows during the fetch and they error via snackbar if offline. Add a top-level "Message downloading" setting (Always fetch all / Fetch all on Wi-Fi / Always on-demand; default Always) that aggressively pre-caches full bodies and all attachment bytes during sync (outside the sync lock, without marking mail read), into a persistent per-part attachment cache so messages and attachments open instantly and offline. Show an "available offline" mark on cached list rows and a per-attachment "downloaded" check in the reader. Extract a Syncer interface (MailSyncer implements it) so the mailbox can be driven end-to-end in tests. Tests: 66 unit + 27 instrumented, all passing on the API 37 emulator. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.READ_CONTACTS" />
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
|
||||
Reference in New Issue
Block a user