Loading app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageListAdapter.kt +12 −0 Original line number Original line Diff line number Diff line Loading @@ -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) Loading app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageListFragment.kt +25 −86 Original line number Original line Diff line number Diff line Loading @@ -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) } } } } Loading Loading @@ -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) } } } } } } Loading @@ -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 } } Loading Loading @@ -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 } } } Loading Loading @@ -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) Loading Loading @@ -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) } } Loading @@ -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> Loading @@ -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() { Loading Loading @@ -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) { Loading @@ -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 } } } } Loading app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageListHandler.java +0 −14 Original line number Original line Diff line number Diff line Loading @@ -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. * * Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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; } } } } } } } Loading
app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageListAdapter.kt +12 −0 Original line number Original line Diff line number Diff line Loading @@ -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) Loading
app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageListFragment.kt +25 −86 Original line number Original line Diff line number Diff line Loading @@ -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) } } } } Loading Loading @@ -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) } } } } } } Loading @@ -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 } } Loading Loading @@ -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 } } } Loading Loading @@ -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) Loading Loading @@ -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) } } Loading @@ -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> Loading @@ -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() { Loading Loading @@ -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) { Loading @@ -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 } } } } Loading
app/ui/legacy/src/main/java/com/fsck/k9/fragment/MessageListHandler.java +0 −14 Original line number Original line Diff line number Diff line Loading @@ -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. * * Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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; } } } } } } }