Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 20e70f8f authored by cketti's avatar cketti
Browse files

Try to avoid using the list position whenever possible

parent 8a73c931
Loading
Loading
Loading
Loading
+12 −0
Original line number Original line Diff line number Diff line
@@ -123,6 +123,18 @@ class MessageListAdapter internal constructor(
        return messagesMap[uniqueId]!!
        return messagesMap[uniqueId]!!
    }
    }


    fun getItem(messageReference: MessageReference): MessageListItem? {
        return messages.firstOrNull {
            it.account.uuid == messageReference.accountUuid &&
                it.folderId == messageReference.folderId &&
                it.messageUid == messageReference.uid
        }
    }

    fun getPosition(messageListItem: MessageListItem): Int? {
        return messages.indexOf(messageListItem).takeIf { it != -1 }
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        val message = getItem(position)
        val message = getItem(position)
        val view: View = convertView ?: newView(parent)
        val view: View = convertView ?: newView(parent)
+25 −86
Original line number Original line Diff line number Diff line
@@ -376,7 +376,8 @@ class MessageListFragment :
        if (view === footerView) {
        if (view === footerView) {
            handleFooterClick()
            handleFooterClick()
        } else {
        } else {
            handleListItemClick(position)
            val messageListItem = adapter.getItem(position)
            handleListItemClick(messageListItem)
        }
        }
    }
    }


@@ -411,17 +412,14 @@ class MessageListFragment :
        }
        }
    }
    }


    private fun handleListItemClick(position: Int) {
    private fun handleListItemClick(messageListItem: MessageListItem) {
        if (adapter.selectedCount > 0) {
        if (adapter.selectedCount > 0) {
            toggleMessageSelect(position)
            toggleMessageSelect(messageListItem)
        } else {
        } else {
            val adapterPosition = listViewToAdapterPosition(position)
            val messageListItem = adapter.getItem(adapterPosition)

            if (showingThreadedList && messageListItem.threadCount > 1) {
            if (showingThreadedList && messageListItem.threadCount > 1) {
                fragmentListener.showThread(messageListItem.account, messageListItem.threadRoot)
                fragmentListener.showThread(messageListItem.account, messageListItem.threadRoot)
            } else {
            } else {
                openMessageAtPosition(adapterPosition)
                openMessage(messageListItem.messageReference)
            }
            }
        }
        }
    }
    }
@@ -429,7 +427,9 @@ class MessageListFragment :
    override fun onItemLongClick(parent: AdapterView<*>?, view: View, position: Int, id: Long): Boolean {
    override fun onItemLongClick(parent: AdapterView<*>?, view: View, position: Int, id: Long): Boolean {
        if (view === footerView) return false
        if (view === footerView) return false


        toggleMessageSelect(position)
        val messageListItem = adapter.getItem(position)
        toggleMessageSelect(messageListItem)

        return true
        return true
    }
    }


@@ -789,14 +789,6 @@ class MessageListFragment :
        messagingController.sendPendingMessages(account, null)
        messagingController.sendPendingMessages(account, null)
    }
    }


    private fun listViewToAdapterPosition(position: Int): Int {
        return if (position in 0 until adapter.count) position else AdapterView.INVALID_POSITION
    }

    private fun adapterToListViewPosition(position: Int): Int {
        return if (position in 0 until adapter.count) position else AdapterView.INVALID_POSITION
    }

    private fun getFooterView(parent: ViewGroup?): View? {
    private fun getFooterView(parent: ViewGroup?): View? {
        return footerView ?: createFooterView(parent).also { footerView = it }
        return footerView ?: createFooterView(parent).also { footerView = it }
    }
    }
@@ -862,14 +854,6 @@ class MessageListFragment :
        updateActionMode()
        updateActionMode()
    }
    }


    private fun toggleMessageSelect(listViewPosition: Int) {
        val adapterPosition = listViewToAdapterPosition(listViewPosition)
        if (adapterPosition == AdapterView.INVALID_POSITION) return

        val messageListItem = adapter.getItem(adapterPosition)
        toggleMessageSelect(messageListItem)
    }

    private fun toggleMessageSelect(messageListItem: MessageListItem) {
    private fun toggleMessageSelect(messageListItem: MessageListItem) {
        adapter.toggleSelection(messageListItem)
        adapter.toggleSelection(messageListItem)


@@ -1230,28 +1214,6 @@ class MessageListFragment :
        }
        }
    }
    }


    private fun getReferenceForPosition(position: Int): MessageReference {
        val item = adapter.getItem(position)
        return MessageReference(item.account.uuid, item.folderId, item.messageUid)
    }

    private fun openMessageAtPosition(position: Int) {
        // Scroll message into view if necessary
        val listViewPosition = adapterToListViewPosition(position)
        if (listViewPosition != AdapterView.INVALID_POSITION &&
            (listViewPosition < listView.firstVisiblePosition || listViewPosition > listView.lastVisiblePosition)
        ) {
            listView.setSelection(listViewPosition)
        }

        val messageReference = getReferenceForPosition(position)

        // For some reason the listView.setSelection() above won't do anything when we call
        // onOpenMessage() (and consequently adapter.notifyDataSetChanged()) right away. So we
        // defer the call using MessageListHandler.
        handler.openMessage(messageReference)
    }

    fun openMessage(messageReference: MessageReference) {
    fun openMessage(messageReference: MessageReference) {
        fragmentListener.openMessage(messageReference)
        fragmentListener.openMessage(messageReference)
    }
    }
@@ -1261,17 +1223,12 @@ class MessageListFragment :
    }
    }


    private val selectedMessage: MessageReference?
    private val selectedMessage: MessageReference?
        get() {
        get() = selectedMessageListItem?.messageReference
            val listViewPosition = listView.selectedItemPosition
            val adapterPosition = listViewToAdapterPosition(listViewPosition)
            if (adapterPosition == AdapterView.INVALID_POSITION) return null
            return getReferenceForPosition(adapterPosition)
        }


    private val adapterPositionForSelectedMessage: Int
    private val selectedMessageListItem: MessageListItem?
        get() {
        get() {
            val listViewPosition = listView.selectedItemPosition
            val position = listView.selectedItemPosition
            return listViewToAdapterPosition(listViewPosition)
            return if (position !in 0 until adapter.count) null else adapter.getItem(position)
        }
        }


    private val selectedMessages: List<MessageReference>
    private val selectedMessages: List<MessageReference>
@@ -1284,29 +1241,21 @@ class MessageListFragment :
    }
    }


    fun toggleMessageSelect() {
    fun toggleMessageSelect() {
        toggleMessageSelect(listView.selectedItemPosition)
        selectedMessageListItem?.let { messageListItem ->
            toggleMessageSelect(messageListItem)
        }
    }
    }


    fun onToggleFlagged() {
    fun onToggleFlagged() {
        toggleFlag(Flag.FLAGGED)
        selectedMessageListItem?.let { messageListItem ->
            setFlag(messageListItem, Flag.FLAGGED, !messageListItem.isStarred)
        }
        }

    fun onToggleRead() {
        toggleFlag(Flag.SEEN)
    }
    }


    private fun toggleFlag(flag: Flag) {
    fun onToggleRead() {
        val adapterPosition = adapterPositionForSelectedMessage
        selectedMessageListItem?.let { messageListItem ->
        if (adapterPosition == ListView.INVALID_POSITION) return
            setFlag(messageListItem, Flag.SEEN, !messageListItem.isRead)

        val messageListItem = adapter.getItem(adapterPosition)
        val flagState = when (flag) {
            Flag.SEEN -> messageListItem.isRead
            Flag.FLAGGED -> messageListItem.isStarred
            else -> false
        }
        }

        setFlag(messageListItem, flag, !flagState)
    }
    }


    fun onMove() {
    fun onMove() {
@@ -1490,8 +1439,7 @@ class MessageListFragment :


        if (sortType != SortType.SORT_UNREAD && sortType != SortType.SORT_FLAGGED) return
        if (sortType != SortType.SORT_UNREAD && sortType != SortType.SORT_FLAGGED) return


        val position = getPosition(messageReference)
        val messageListItem = adapter.getItem(messageReference) ?: return
        val messageListItem = adapter.getItem(position)


        val existingEntry = messageSortOverrides.firstOrNull { it.first == messageReference }
        val existingEntry = messageSortOverrides.firstOrNull { it.first == messageReference }
        if (existingEntry != null) {
        if (existingEntry != null) {
@@ -1508,20 +1456,11 @@ class MessageListFragment :
    }
    }


    private fun scrollToMessage(messageReference: MessageReference) {
    private fun scrollToMessage(messageReference: MessageReference) {
        val position = getPosition(messageReference)
        val messageListItem = adapter.getItem(messageReference) ?: return
        val viewPosition = adapterToListViewPosition(position)
        val position = adapter.getPosition(messageListItem) ?: return
        if (viewPosition != AdapterView.INVALID_POSITION &&
            (viewPosition <= listView.firstVisiblePosition || viewPosition >= listView.lastVisiblePosition)
        ) {
            listView.smoothScrollToPosition(viewPosition)
        }
    }


    private fun getPosition(messageReference: MessageReference): Int {
        if (position <= listView.firstVisiblePosition || position >= listView.lastVisiblePosition) {
        return adapter.messages.indexOfFirst { messageListItem ->
            listView.smoothScrollToPosition(position)
            messageListItem.account.uuid == messageReference.accountUuid &&
                messageListItem.folderId == messageReference.folderId &&
                messageListItem.messageUid == messageReference.uid
        }
        }
    }
    }


+0 −14
Original line number Original line Diff line number Diff line
@@ -7,8 +7,6 @@ import android.app.Activity;
import android.os.Handler;
import android.os.Handler;
import android.os.Parcelable;
import android.os.Parcelable;


import com.fsck.k9.controller.MessageReference;

/**
/**
 * This class is used to run operations that modify UI elements in the UI thread.
 * This class is used to run operations that modify UI elements in the UI thread.
 *
 *
@@ -25,7 +23,6 @@ public class MessageListHandler extends Handler {
    private static final int ACTION_REMOTE_SEARCH_FINISHED = 4;
    private static final int ACTION_REMOTE_SEARCH_FINISHED = 4;
    private static final int ACTION_GO_BACK = 5;
    private static final int ACTION_GO_BACK = 5;
    private static final int ACTION_RESTORE_LIST_POSITION = 6;
    private static final int ACTION_RESTORE_LIST_POSITION = 6;
    private static final int ACTION_OPEN_MESSAGE = 7;


    private WeakReference<MessageListFragment> mFragment;
    private WeakReference<MessageListFragment> mFragment;


@@ -79,12 +76,6 @@ public class MessageListHandler extends Handler {
        }
        }
    }
    }


    public void openMessage(MessageReference messageReference) {
        android.os.Message msg = android.os.Message.obtain(this, ACTION_OPEN_MESSAGE,
                messageReference);
        sendMessage(msg);
    }

    @Override
    @Override
    public void handleMessage(android.os.Message msg) {
    public void handleMessage(android.os.Message msg) {
        MessageListFragment fragment = mFragment.get();
        MessageListFragment fragment = mFragment.get();
@@ -131,11 +122,6 @@ public class MessageListHandler extends Handler {
                fragment.restoreListState(savedListState);
                fragment.restoreListState(savedListState);
                break;
                break;
            }
            }
            case ACTION_OPEN_MESSAGE: {
                MessageReference messageReference = (MessageReference) msg.obj;
                fragment.openMessage(messageReference);
                break;
            }
        }
        }
    }
    }
}
}