thunderbird / thunderbird/thunderbird-android

Message List - Swiping a message to delete cause entire list to flash

Open
#10,892 4 comments 2 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Kotlin
Stars
14k
Forks
2.8k
Avg merge
3d 3h
Merged PRs (30d)
57

Description

Checklist
  • I have used the search function to see if someone else has already submitted the same bug report.
  • I will describe the problem with as much detail as possible.
App

Thunderbird for Android

App version

18.0

Where did you get the app from?

Google Play

Android version

Android 16

Device model

Pixel 10 Pro

Steps to reproduce
  1. Configure unified inbox
  2. Load messages
  3. Configure the action to be able to delete a message via swipe
  4. Swipe some messages to delete them
  5. Notice that the entire message list flashes white, sometimes for several seconds, while repainting
Expected behavior

The messages are deleted without long repaint issues.

Actual behavior

The message list takes a noticeable amount of time to repaint after a swipe to delete.

Logs
2026-04-18 11:16:29.815  8570-8620  Sink$-CC                net.thunderbird.android              I   Command 'clearNotifications' completed
2026-04-18 11:16:29.832  1612-2440  ImeTracker              system_server                        I  net.thunderbird.android:158c1b87: onRequestHide at ORIGIN_SERVER reason HIDE_SAME_WINDOW_FOCUSED_WITHOUT_EDITOR fromUser false userId 0 displayId 0
2026-04-18 11:16:29.833  8570-8570  InsetsController        net.thunderbird.android              D  hide(ime())
2026-04-18 11:16:29.833  8570-8570  ImeTracker              net.thunderbird.android              I  net.thunderbird.android:158c1b87: onCancelled at PHASE_CLIENT_ALREADY_HIDDEN
2026-04-18 11:16:29.834 27050-27050 GoogleInpu...hodService com...gle.android.inputmethod.latin  I  GoogleInputMethodService.onStartInput():1446 onStartInput(EditorInfo{EditorInfo{packageName=net.thunderbird.android, inputType=0, inputTypeString=NULL, enableLearning=false, autoCorrection=false, autoComplete=false, imeOptions=0, privateImeOptions=null, actionName=UNSPECIFIED, actionLabel=null, initialSelStart=-1, initialSelEnd=-1, initialCapsMode=0, label=null, fieldId=0, fieldName=null, extras=null, hintText=null, hintLocales=[]}}, false)
2026-04-18 11:16:29.835  1612-2925  PackageConfigPersister  system_server                        W  App-specific configuration not found for packageName: net.thunderbird.android and userId: 0
2026-04-18 11:16:47.494  8570-8620  Sink$-CC                net.thunderbird.android              I  Running command 'deleteThreads', seq = 1852 (background priority)
2026-04-18 11:16:47.494  8570-21344 DefaultOut...derManager net.thunderbird.android              V  getOutboxFolderId() called with: uuid = e093d0d0-c825-4e7b-8016-ffddb2a18e83
2026-04-18 11:16:47.496  8570-8620  Sink$-CC                net.thunderbird.android              D  Query = SELECT subject, sender_list, date, uid, flags, messages.id, to_list, cc_list, bcc_list, reply_to_list, attachment_count, internal_date, messages.message_id, folder_id, preview, threads.id, threads.root, deleted, read, flagged, answered, forwarded, message_part_id, messages.mime_type, preview_type, header FROM messages LEFT JOIN threads ON (threads.message_id = messages.id) LEFT JOIN message_parts ON (message_parts.id = messages.message_part_id) LEFT JOIN folders ON (folders.id = messages.folder_id) WHERE (empty = 0 AND deleted = 0) AND (threads.root = ?) ORDER BY date DESC
2026-04-18 11:16:47.496  8570-21344 DefaultOut...derManager net.thunderbird.android              D  getOutboxFolderId: Found Outbox folder with id = 1 in cache. Cache expires on 2026-04-18T18:31:47.061Z
2026-04-18 11:16:47.696  8570-8620  Sink$-CC                net.thunderbird.android              V  Removing notification for message MessageReference(accountUuid=e093d0d0-c825-4e7b-8016-ffddb2a18e83, folderId=2, uid=67545)
2026-04-18 11:16:47.697  8570-8620  Sink$-CC                net.thunderbird.android              D  Deleting messages in normal folder, moving
2026-04-18 11:16:47.697  8570-8620  Sink$-CC                net.thunderbird.android              D  Moving message [ID: 10422] to folder [ID: 12]
2026-04-18 11:16:47.754  8570-8620  Sink$-CC                net.thunderbird.android              V  LockableDatabase: Transaction ended, took 7 ms / com.fsck.k9.storage.messages.K9MessageStore.moveMessage(r8-map-id-58ffc31692aca602e32e3e0ca244b5e3933fd63bb5128a208a2793d5aa8da2da:52)
2026-04-18 11:16:47.756  8570-8620  Sink$-CC                net.thunderbird.android              V  LockableDatabase: Transaction ended, took 1 ms / app.k9mail.legacy.mailstore.ListenableMessageStore.setFlag(r8-map-id-58ffc31692aca602e32e3e0ca244b5e3933fd63bb5128a208a2793d5aa8da2da:103)
2026-04-18 11:16:47.757  8570-21344 DefaultOut...derManager net.thunderbird.android              V  getOutboxFolderId() called with: uuid = e093d0d0-c825-4e7b-8016-ffddb2a18e83
2026-04-18 11:16:47.757  8570-21344 DefaultOut...derManager net.thunderbird.android              D  getOutboxFolderId: Found Outbox folder with id = 1 in cache. Cache expires on 2026-04-18T18:31:47.061Z
2026-04-18 11:16:47.861  8570-8620  Sink$-CC                net.thunderbird.android              D  Delete policy for account e093d0d0-c825-4e7b-8016-ffddb2a18e83 is ON_DELETE
2026-04-18 11:16:47.861  8570-8620  DefaultOut...derManager net.thunderbird.android              V  getOutboxFolderId() called with: uuid = e093d0d0-c825-4e7b-8016-ffddb2a18e83
2026-04-18 11:16:47.862  8570-8620  DefaultOut...derManager net.thunderbird.android              D  getOutboxFolderId: Found Outbox folder with id = 1 in cache. Cache expires on 2026-04-18T18:31:47.061Z
2026-04-18 11:16:47.864  8570-8620  Sink$-CC                net.thunderbird.android              I   Command 'deleteThreads' completed
2026-04-18 11:16:47.864  8570-8620  Sink$-CC                net.thunderbird.android              I  Running command 'processPendingCommands', seq = 1853 (background priority)
2026-04-18 11:16:47.864  8570-8620  Sink$-CC                net.thunderbird.android              D  Processing pending command 'move_and_mark_as_read'
2026-04-18 11:16:47.870  8570-8620  Sink$-CC                net.thunderbird.android              D  Connecting to imap.fastmail.com as imap.fastmail.com/103.168.172.58
2026-04-18 11:16:47.997  8570-28690 CursorWindow            net.thunderbird.android              E  Failed to read row 855, column 0 from a window with 855 rows, 18 columns
2026-04-18 11:16:47.998  8570-28690 Sink$-CC                net.thunderbird.android              E  Error while fetching message list (Fix with AI)
                                                                                                    java.lang.IllegalStateException: Couldn't read row 855, col 0 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
                                                                                                    	at android.database.CursorWindow.nativeGetLong(Native Method)
                                                                                                    	at android.database.CursorWindow.getLong(CursorWindow.java:579)
                                                                                                    	at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:78)
                                                                                                    	at com.android.billingclient.api.zzcn.getId(r8-map-id-58ffc31692aca602e32e3e0ca244b5e3933fd63bb5128a208a2793d5aa8da2da:6)
                                                                                                    	at com.fsck.k9.mailstore.LocalStore$1.map(r8-map-id-58ffc31692aca602e32e3e0ca244b5e3933fd63bb5128a208a2793d5aa8da2da:1)
                                                                                                    	at com.fsck.k9.storage.messages.RetrieveMessageListOperations$$ExternalSyntheticLambda0.doDbWork(r8-map-id-58ffc31692aca602e32e3e0ca244b5e3933fd63bb5128a208a2793d5aa8da2da:49)
                                                                                                    	at com.fsck.k9.mailstore.LockableDatabase.execute(r8-map-id-58ffc31692aca602e32e3e0ca244b5e3933fd63bb5128a208a2793d5aa8da2da:67)
                                                                                                    	at com.fsck.k9.mailstore.DefaultMessageListRepository.getThreadedMessages(r8-map-id-58ffc31692aca602e32e3e0ca244b5e3933fd63bb5128a208a2793d5aa8da2da:132)
                                                                                                    	at com.fsck.k9.ui.messagelist.MessageListLoader.getMessageListInfo(r8-map-id-58ffc31692aca602e32e3e0ca244b5e3933fd63bb5128a208a2793d5aa8da2da:334)
                                                                                                    	at com.fsck.k9.ui.messagelist.MessageListLiveData$loadMessageListAsync$1$messageList$1.invokeSuspend(r8-map-id-58ffc31692aca602e32e3e0ca244b5e3933fd63bb5128a208a2793d5aa8da2da:113)
                                                                                                    	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(r8-map-id-58ffc31692aca602e32e3e0ca244b5e3933fd63bb5128a208a2793d5aa8da2da:8)
                                                                                                    	at kotlinx.coroutines.DispatchedTask.run(r8-map-id-58ffc31692aca602e32e3e0ca244b5e3933fd63bb5128a208a2793d5aa8da2da:114)
                                                                                                    	at com.google.android.gms.tasks.zzi.run(r8-map-id-58ffc31692aca602e32e3e0ca244b5e3933fd63bb5128a208a2793d5aa8da2da:16)
                                                                                                    	at kotlinx.coroutines.scheduling.TaskImpl.run(r8-map-id-58ffc31692aca602e32e3e0ca244b5e3933fd63bb5128a208a2793d5aa8da2da:3)
                                                                                                    	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(r8-map-id-58ffc31692aca602e32e3e0ca244b5e3933fd63bb5128a208a2793d5aa8da2da:88)
2026-04-18 11:16:48.510  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483 <<< #null# [OK, IMAP4 ready]
2026-04-18 11:16:48.511  8570-8620  Sink$-CC                net.thunderbird.android              I  Did not get capabilities in banner, requesting CAPABILITY for conn67342483
2026-04-18 11:16:48.511  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483>>> 1 CAPABILITY
2026-04-18 11:16:48.703  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#null# [CAPABILITY, IMAP4, IMAP4rev1, IMAP4rev2, LITERAL+, ENABLE, UIDPLUS, SASL-IR, NAMESPACE, CONDSTORE, SORT, LIST-EXTENDED, QRESYNC, MOVE, SPECIAL-USE, CREATE-SPECIAL-USE, IDLE, AUTH=PLAIN, AUTH=LOGIN, AUTH=XOAUTH2, AUTH=OAUTHBEARER]
2026-04-18 11:16:48.704  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#1# [OK, completed]
2026-04-18 11:16:48.707  8570-8620  Sink$-CC                net.thunderbird.android              D  Saving [NAMESPACE, SPECIAL-USE, QRESYNC, AUTH=XOAUTH2, IMAP4, IMAP4REV2, SASL-IR, ENABLE, UIDPLUS, CONDSTORE, AUTH=PLAIN, LITERAL+, MOVE, IMAP4REV1, IDLE, SORT, AUTH=LOGIN, LIST-EXTENDED, AUTH=OAUTHBEARER, CREATE-SPECIAL-USE] capabilities for conn67342483
2026-04-18 11:16:48.708  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483>>> 2 AUTHENTICATE PLAIN
2026-04-18 11:16:48.818  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#+# []
2026-04-18 11:16:49.015  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#2# [OK, [CAPABILITY, IMAP4rev1, IMAP4rev2, ACL, ANNOTATE-EXPERIMENT-1, APPENDLIMIT=209715200, BINARY, CATENATE, CHILDREN, COMPRESS=DEFLATE, CONDSTORE, CREATE-SPECIAL-USE, ENABLE, ESEARCH, ESORT, ID, IDLE, INPROGRESS, LIST-EXTENDED, LIST-METADATA, LIST-MYRIGHTS, LIST-STATUS, LITERAL+, LOGINDISABLED, MAILBOX-REFERRALS, METADATA, MOVE, MULTIAPPEND, MULTISEARCH, NAMESPACE, NOTIFY, OBJECTID, PARTIAL, PREVIEW, QRESYNC, QUOTA, QUOTA=RES-STORAGE, QUOTA=RES-MESSAGE, QUOTA=RES-ANNOTATION-STORAGE, QUOTA=RES-MAILBOX, QUOTASET, REPLACE, RIGHTS=kxten, SAVEDATE, SEARCH=FUZZY, SEARCHRES, SORT, SORT=DISPLAY, SPECIAL-USE, STATUS=SIZE, THREAD=ORDEREDSUBJECT, THREAD=REFERENCES, UIDBATCHES, UIDONLY, UIDPLUS, UNSELECT, URL-PARTIAL, UTF8=ACCEPT, WITHIN, DIGEST=SHA1, NO_ATOMIC_RENAME, SORT=MODSEQ, SORT=UID, THREAD=REFS, X-CREATEDMODSEQ, X-REPLICATION, X-REPLICATION-ARCHIVE, X-SIEVE-MAILBOX, XAPPLEPUSHSERVICE, XLIST, XUSERGROUPS], User logged in SESSIONID=<slotpi12m20-1776536210-574134-1-3804637947258480061>]
2026-04-18 11:16:49.016  8570-8620  Sink$-CC                net.thunderbird.android              D  Saving [NAMESPACE, URL-PARTIAL, X-SIEVE-MAILBOX, THREAD=REFERENCES, SAVEDATE, MULTIAPPEND, XLIST, ESORT, OBJECTID, CONDSTORE, STATUS=SIZE, MULTISEARCH, INPROGRESS, CATENATE, QUOTA=RES-STORAGE, XAPPLEPUSHSERVICE, ID, REPLACE, X-CREATEDMODSEQ, UIDBATCHES, QUOTA=RES-MAILBOX, UNSELECT, ENABLE, UIDPLUS, COMPRESS=DEFLATE, LITERAL+, ESEARCH, SORT, UIDONLY, NO_ATOMIC_RENAME, LIST-STATUS, UTF8=ACCEPT, QUOTA, DIGEST=SHA1, SORT=UID, XUSERGROUPS, BINARY, WITHIN, SEARCHRES, RIGHTS=KXTEN, NOTIFY, QUOTASET, LIST-METADATA, CREATE-SPECIAL-USE, SORT=DISPLAY, QUOTA=RES-MESSAGE, APPENDLIMIT=209715200, SEARCH=FUZZY, SPECIAL-USE, SORT=MODSEQ, QRESYNC, ANNOTATE-EXPERIMENT-1, IMAP4REV2, PARTIAL, ACL, THREAD=ORDEREDSUBJECT, CHILDREN, QUOTA=RES-ANNOTATION-STORAGE, X-REPLICATION-ARCHIVE, X-REPLICATION, MOVE, IMAP4REV1, IDLE, LOGINDISABLED, LIST-EXTENDED, METADATA, PREVIEW, THREAD=REFS, MAILBOX-REFERRALS, LIST-MYRIGHTS] capabilities for conn67342483
2026-04-18 11:16:49.017  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483>>> 3 COMPRESS DEFLATE
2026-04-18 11:16:49.212  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#3# [OK, DEFLATE active]
2026-04-18 11:16:49.213  8570-8620  Sink$-CC                net.thunderbird.android              I  Compression enabled for conn67342483
2026-04-18 11:16:49.215  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483>>> 4 ID ("name" "Thunderbird for Android" "version" "18.0")
2026-04-18 11:16:49.315  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#null# [ID, [name, Cyrus IMAPD, version, 3.13.1-467-ga42f9ccba-fm-20260413.001-ga42f9ccb, vendor, Project Cyrus, support-url, https://www.cyrusimap.org]]
2026-04-18 11:16:49.316  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#4# [OK, Completed]
2026-04-18 11:16:49.317  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483>>> 5 ENABLE UTF8=ACCEPT
2026-04-18 11:16:49.415  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#null# [ENABLED, UTF8=ACCEPT]
2026-04-18 11:16:49.415  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#5# [OK, Completed]
2026-04-18 11:16:49.417  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483>>> 6 SELECT "INBOX"
2026-04-18 11:16:49.621  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#null# [4606, EXISTS]
2026-04-18 11:16:49.621  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#null# [0, RECENT]
2026-04-18 11:16:49.621  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#null# [FLAGS, [\Answered, \Flagged, \Draft, \Deleted, \Seen, $X-ME-Annot-2, $HasAttachment, $IsMailingList, $IsNotification, $MailFlagBit0, $Forwarded, Forwarded, $notjunk, NotJunk, $CanUnsubscribe, $Phishing, $IsTrusted, $Junk, $Filtered, Junk, $MailFlagBit1, $MailFlagBit2, $HighImportance, NonJunk]]
2026-04-18 11:16:49.621  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#null# [OK, [PERMANENTFLAGS, [\Answered, \Flagged, \Draft, \Deleted, \Seen, $X-ME-Annot-2, $HasAttachment, $IsMailingList, $IsNotification, $MailFlagBit0, $Forwarded, Forwarded, $notjunk, NotJunk, $CanUnsubscribe, $Phishing, $IsTrusted, $Junk, $Filtered, Junk, $MailFlagBit1, $MailFlagBit2, $HighImportance, NonJunk, \*]], Ok]
2026-04-18 11:16:49.622  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#null# [OK, [UNSEEN, 4604], Ok]
2026-04-18 11:16:49.622  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#null# [OK, [UIDVALIDITY, 1592263766], Ok]
2026-04-18 11:16:49.622  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#null# [OK, [UIDNEXT, 67557], Ok]
2026-04-18 11:16:49.622  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#null# [OK, [HIGHESTMODSEQ, 585541], Ok]
2026-04-18 11:16:49.622  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#null# [OK, [MAILBOXID, [P-F]], Ok]
2026-04-18 11:16:49.622  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#null# [OK, [URLMECH, INTERNAL], Ok]
2026-04-18 11:16:49.622  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#null# [OK, [ANNOTATIONS, 65536], Ok]
2026-04-18 11:16:49.622  8570-8620  Sink$-CC                net.thunderbird.android              V  conn67342483<<<#6# [OK, [READ-WRITE], Completed]
2026-04-18 11:16:49.623  8570-8620  Sink$-CC                net.thunderbird.android              D  Got untagged EXISTS with value 4606 for e093d0d0-c825-4e7b-8016-ffddb2a18e83:INBOX/MessagingController/conn67342483
2026-04-18 11:16:49.623  8570-8620  Sink$-CC                net.thunderbird.android              D  Got UidNext = 67557 for e093d0d0-c825-4e7b-8016-ffddb2a18e83:INBOX/MessagingController/conn67342483
2026-04-18 11:16:49.623  8570-8620  Sink$-CC                net.thunderbird.android              D  moveOrCopyMessages: source folder = INBOX, 1 messages, destination folder = Trash, isCopy = false
2026-04-18 11:16:49.624  8570-8620  Sink$-CC                net.thunderbird.android              D  Connecting to imap.fastmail.com as imap.fastmail.com/103.168.172.58
2026-04-18 11:16:50.374  8570-8620  Sink$-CC                net.thunderbird.android              V  conn141197067 <<< #null# [OK, IMAP4 ready]
2026-04-18 11:16:50.374  8570-8620  Sink$-CC                net.thunderbird.android              I  Did not get capabilities in banner, requesting CAPABILITY for conn141197067
2026-04-18 11:16:50.375  8570-8620  Sink$-CC                net.thunderbird.android              V  conn141197067>>> 1 CAPABILITY
2026-04-18 11:16:50.565  8570-8620  Sink$-CC                net.thunderbird.android              V  conn141197067<<<#null# [CAPABILITY, IMAP4, IMAP4rev1, IMAP4rev2, LITERAL+, ENABLE, UIDPLUS, SASL-IR, NAMESPACE, CONDSTORE, SORT, LIST-EXTENDED, QRESYNC, MOVE, SPECIAL-USE, CREATE-SPECIAL-USE, IDLE, AUTH=PLAIN, AUTH=LOGIN, AUTH=XOAUTH2, AUTH=OAUTHBEARER]
2026-04-18 11:16:50.566  8570-8620  Sink$-CC                net.thunderbird.android              V  conn141197067<<<#1# [OK, completed]

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with MessageListLiveData, MessageListLoader, DefaultMessageListRepository, and RetrieveMessageListOperations, which appear in the reported stack trace. Reproduce deletion by swipe in a unified inbox and investigate the CursorWindow fetch failure alongside the list repaint. Done means deleting messages no longer causes a prolonged white flash or message-list fetch error.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, kotlin
Domain
database, mobile, performance
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.