Skip to content

Commit

Permalink
MessagesListFragment. Restored seelction functionality.| #1806
Browse files Browse the repository at this point in the history
  • Loading branch information
DenBond7 committed May 19, 2022
1 parent 1e04bdf commit a7e3f12
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -124,20 +124,27 @@ class MessagesListFragment : BaseFragment<FragmentMessagesListBinding>(),

private var footerProgressView: View? = null
private var tracker: SelectionTracker<Long>? = null
private var keyProvider: CustomStableIdKeyProvider? = null
private var actionMode: ActionMode? = null
private var activeMsgEntity: MessageEntity? = null
private val currentFolder: LocalFolder?
get() = labelsViewModel.activeFolderLiveData.value

private val adapter by lazy {
MsgsPagedListAdapter(null, object : MsgsPagedListAdapter.OnMessageClickListener {
MsgsPagedListAdapter(object : MsgsPagedListAdapter.OnMessagesActionListener {
override fun onMsgClick(msgEntity: MessageEntity) {
onMsgClicked(msgEntity)
}
})

override fun onExistingMsgsChanged(snapshotOfExistingIds: Set<Long>) {
val selectedIds = tracker?.selection?.mapNotNull { it }?.toSet() ?: emptySet()
val irrelevantSelectedIds = selectedIds - snapshotOfExistingIds
tracker?.setItemsSelected(irrelevantSelectedIds, false)
}
}) { key -> tracker?.isSelected(key) ?: false }
}

private val keyProvider by lazy { CustomStableIdKeyProvider(adapter) }

private var keepSelectionInMemory = false
private var isForceSendingEnabled: Boolean = true

Expand Down Expand Up @@ -471,9 +478,6 @@ class MessagesListFragment : BaseFragment<FragmentMessagesListBinding>(),
}
}

/**
* Try to load a next messages from an IMAP server.
*/
private fun loadNextMsgs() {
if (isOutboxFolder) {
return
Expand All @@ -485,8 +489,7 @@ class MessagesListFragment : BaseFragment<FragmentMessagesListBinding>(),
if (currentFolder == null) {
labelsViewModel.loadLabels()
} else {
//adapter.changeProgress(true)
//msgsViewModel.loadMsgsFromRemoteServer()
adapter.refresh()
}
} else {
footerProgressView?.visibility = View.GONE
Expand Down Expand Up @@ -529,33 +532,28 @@ class MessagesListFragment : BaseFragment<FragmentMessagesListBinding>(),
)
binding?.recyclerViewMsgs?.adapter = adapter.withLoadStateFooter(MsgsLoadStateAdapter())
setupItemTouchHelper()
//setupSelectionTracker()
setupSelectionTracker()
setupBottomOverScroll()
}

private fun setupSelectionTracker() {
//adapter.tracker = null
binding?.recyclerViewMsgs?.let { recyclerView ->
keyProvider = CustomStableIdKeyProvider(recyclerView)
keyProvider?.let {
tracker = SelectionTracker.Builder(
MessagesListFragment::class.java.simpleName,
recyclerView,
it,
MsgItemDetailsLookup(recyclerView),
StorageStrategy.createLongStorage()
).withSelectionPredicate(object : SelectionTracker.SelectionPredicate<Long>() {
override fun canSetStateForKey(key: Long, nextState: Boolean): Boolean =
currentFolder?.searchQuery == null

override fun canSetStateAtPosition(position: Int, nextState: Boolean): Boolean =
currentFolder?.searchQuery == null

override fun canSelectMultiple(): Boolean = true
}).build()
tracker?.addObserver(selectionObserver)
//adapter.tracker = tracker
}
tracker = SelectionTracker.Builder(
MessagesListFragment::class.java.simpleName,
recyclerView,
keyProvider,
MsgItemDetailsLookup(recyclerView),
StorageStrategy.createLongStorage()
).withSelectionPredicate(object : SelectionTracker.SelectionPredicate<Long>() {
override fun canSetStateForKey(key: Long, nextState: Boolean): Boolean =
currentFolder?.searchQuery == null

override fun canSetStateAtPosition(position: Int, nextState: Boolean): Boolean =
currentFolder?.searchQuery == null

override fun canSelectMultiple(): Boolean = true
}).build()
tracker?.addObserver(selectionObserver)
}
}

Expand Down Expand Up @@ -729,7 +727,7 @@ class MessagesListFragment : BaseFragment<FragmentMessagesListBinding>(),
&& System.currentTimeMillis() - lastCallTime >= TIMEOUT_BETWEEN_ACTIONS
) {
if (msgsViewModel.loadMsgsFromRemoteServerLiveData.value?.status != Result.Status.LOADING) {
//msgsViewModel.loadMsgsFromRemoteServer()
adapter.refresh()
}
}
}
Expand Down Expand Up @@ -807,10 +805,10 @@ class MessagesListFragment : BaseFragment<FragmentMessagesListBinding>(),

if (isChangeSeenStateActionEnabled()) {
val id = tracker?.selection?.first() ?: return true
/*val msgEntity = adapter.getMsgEntity(keyProvider?.getPosition(id))
val msgEntity = adapter.getMessageEntity(keyProvider.getPosition(id))

menuActionMarkUnread?.isVisible = msgEntity?.isSeen == true
menuActionMarkRead?.isVisible = msgEntity?.isSeen != true*/
menuActionMarkRead?.isVisible = msgEntity?.isSeen != true
}

return true
Expand Down Expand Up @@ -1220,7 +1218,7 @@ class MessagesListFragment : BaseFragment<FragmentMessagesListBinding>(),
tracker?.clearSelection()

val newFolder = currentFolder
adapter.currentFolder = newFolder
adapter.switchFolder(newFolder)

val isFolderNameEmpty = newFolder?.fullName?.isEmpty()
val isItSyncOrOutboxFolder = isItSyncOrOutboxFolder(newFolder)
Expand All @@ -1246,7 +1244,6 @@ class MessagesListFragment : BaseFragment<FragmentMessagesListBinding>(),
getString(R.string.progress_message, progress, message)
} else {
binding?.textViewActionProgress?.text = null
//adapter.changeProgress(false)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,24 @@ import javax.mail.internet.InternetAddress
* E-mail: DenBond7@gmail.com
*/
class MsgsPagedListAdapter(
var currentFolder: LocalFolder? = null,
private val onMessageClickListener: OnMessageClickListener? = null
private val onMessagesActionListener: OnMessagesActionListener? = null,
private val selectionChecker: (key: Long) -> Boolean
) : PagingDataAdapter<MessageEntity, MsgsPagedListAdapter.MessageViewHolder>(ITEM_CALLBACK) {
private val senderNamePattern: Pattern = prepareSenderNamePattern()
private val keyPositionsMap = mutableMapOf<Long, Int>()
var currentFolder: LocalFolder? = null
private set

init {
addOnPagesUpdatedListener {
val ids = snapshot().items.mapNotNull { it.id }.toSet()
onMessagesActionListener?.onExistingMsgsChanged(ids)
}
}

override fun onBindViewHolder(holder: MessageViewHolder, position: Int) {
val msgEntity = getItem(position) ?: return
msgEntity.id?.let { keyPositionsMap[msgEntity.id] = holder.absoluteAdapterPosition }
holder.bind(msgEntity)
}

Expand All @@ -65,6 +76,15 @@ class MsgsPagedListAdapter(
return getItem(position)
}

fun getPositionByIds(ids: Long): Int? {
return keyPositionsMap[ids]
}

fun switchFolder(newFolder: LocalFolder?) {
keyPositionsMap.clear()
currentFolder = newFolder
}

/**
* Prepare a [Pattern] which will be used for finding some information in the sender name.
* This pattern is case insensitive.
Expand Down Expand Up @@ -229,18 +249,21 @@ class MsgsPagedListAdapter(

inner class MessageViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val binding: MessagesListItemBinding = MessagesListItemBinding.bind(itemView)
private var messageEntity: MessageEntity? = null

fun getItemDetails(): ItemDetailsLookup.ItemDetails<Long> =
object : ItemDetailsLookup.ItemDetails<Long>() {
override fun getPosition(): Int = bindingAdapterPosition
override fun getSelectionKey(): Long = itemId
override fun getPosition(): Int = absoluteAdapterPosition
override fun getSelectionKey(): Long? = messageEntity?.id
}

fun bind(value: MessageEntity) {
messageEntity = value
val context = itemView.context

itemView.isActivated = value.id?.let { selectionChecker.invoke(it) } ?: false
itemView.setOnClickListener {
onMessageClickListener?.onMsgClick(value)
onMessagesActionListener?.onMsgClick(value)
}

val subject = if (TextUtils.isEmpty(value.subject)) {
Expand Down Expand Up @@ -325,8 +348,9 @@ class MsgsPagedListAdapter(
}
}

interface OnMessageClickListener {
interface OnMessagesActionListener {
fun onMsgClick(msgEntity: MessageEntity)
fun onExistingMsgsChanged(snapshotOfExistingIds: Set<Long>)
}

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,22 @@ package com.flowcrypt.email.ui.adapter.selection

import androidx.recyclerview.selection.ItemKeyProvider
import androidx.recyclerview.widget.RecyclerView
import com.flowcrypt.email.ui.adapter.MsgsPagedListAdapter

/**
* @author Denis Bondarenko
* Date: 1/8/20
* Time: 4:44 PM
* E-mail: DenBond7@gmail.com
*/
class CustomStableIdKeyProvider(private val recyclerView: RecyclerView) :
class CustomStableIdKeyProvider(private val adapter: MsgsPagedListAdapter) :
ItemKeyProvider<Long>(SCOPE_CACHED) {
init {
requireNotNull(recyclerView.adapter)
require(recyclerView.adapter?.hasStableIds() == true) {
"Adapter should have stable ids"
}
}

override fun getKey(position: Int): Long? {
return recyclerView.adapter?.getItemId(position)
return adapter.getMessageEntity(position)?.id
}

override fun getPosition(key: Long): Int {
return recyclerView.findViewHolderForItemId(key)?.adapterPosition ?: RecyclerView.NO_POSITION
return adapter.getPositionByIds(key) ?: RecyclerView.NO_POSITION
}
}

0 comments on commit a7e3f12

Please sign in to comment.