Add SelectableItem<>

This commit is contained in:
andrew 2023-05-22 15:46:12 +09:30
parent 8ef6ec2125
commit 4f2ef7f2af
4 changed files with 36 additions and 33 deletions

View File

@ -27,13 +27,8 @@ class BlockedContactsActivity: PassphraseRequiredActionBarActivity() {
AlertDialog.Builder(this) AlertDialog.Builder(this)
.setTitle(title) .setTitle(title)
.setMessage(message) .setMessage(message)
.setPositiveButton(R.string.continue_2) { d, _ -> .setPositiveButton(R.string.continue_2) { _, _ -> viewModel.unblock() }
viewModel.unblock() .setNegativeButton(R.string.cancel) { _, _ -> }
d.dismiss()
}
.setNegativeButton(R.string.cancel) { d, _ ->
d.dismiss()
}
.show() .show()
} }
@ -46,7 +41,7 @@ class BlockedContactsActivity: PassphraseRequiredActionBarActivity() {
viewModel.subscribe(this) viewModel.subscribe(this)
.observe(this) { state -> .observe(this) { state ->
adapter.submitList(state.blockedContacts) adapter.submitList(state.items)
binding.emptyStateMessageTextView.isVisible = state.emptyStateMessageTextViewVisible binding.emptyStateMessageTextView.isVisible = state.emptyStateMessageTextViewVisible
binding.nonEmptyStateGroup.isVisible = state.nonEmptyStateGroupVisible binding.nonEmptyStateGroup.isVisible = state.nonEmptyStateGroupVisible
binding.unblockButton.isEnabled = state.unblockButtonEnabled binding.unblockButton.isEnabled = state.unblockButtonEnabled

View File

@ -10,30 +10,26 @@ import network.loki.messenger.R
import network.loki.messenger.databinding.BlockedContactLayoutBinding import network.loki.messenger.databinding.BlockedContactLayoutBinding
import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.recipients.Recipient
import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.mms.GlideApp
import org.thoughtcrime.securesms.util.adapter.SelectableItem
class BlockedContactsAdapter(val viewModel: BlockedContactsViewModel) : ListAdapter<Recipient,BlockedContactsAdapter.ViewHolder>(RecipientDiffer()) { typealias SelectableRecipient = SelectableItem<Recipient>
class RecipientDiffer: DiffUtil.ItemCallback<Recipient>() { class BlockedContactsAdapter(val viewModel: BlockedContactsViewModel) : ListAdapter<SelectableRecipient,BlockedContactsAdapter.ViewHolder>(RecipientDiffer()) {
override fun areItemsTheSame(oldItem: Recipient, newItem: Recipient) = oldItem === newItem
override fun areContentsTheSame(oldItem: Recipient, newItem: Recipient) = oldItem == newItem class RecipientDiffer: DiffUtil.ItemCallback<SelectableRecipient>() {
override fun areItemsTheSame(old: SelectableRecipient, new: SelectableRecipient) = old.item.address == new.item.address
override fun areContentsTheSame(old: SelectableRecipient, new: SelectableRecipient) = old.isSelected == new.isSelected
override fun getChangePayload(old: SelectableRecipient, new: SelectableRecipient) = new.isSelected
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder =
val itemView = LayoutInflater.from(parent.context).inflate(R.layout.blocked_contact_layout, parent, false) LayoutInflater.from(parent.context)
return ViewHolder(itemView) .inflate(R.layout.blocked_contact_layout, parent, false)
} .let(::ViewHolder)
private fun toggleSelection(recipient: Recipient, isSelected: Boolean, position: Int) {
viewModel.select(recipient, isSelected)
notifyItemChanged(position)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val recipient = getItem(position) val selectable = getItem(position)
val isSelected = recipient in viewModel.state.selectedItems holder.bind(selectable, viewModel::toggle)
holder.bind(recipient, isSelected) {
toggleSelection(recipient, !isSelected, position)
}
} }
override fun onViewRecycled(holder: ViewHolder) { override fun onViewRecycled(holder: ViewHolder) {
@ -46,15 +42,14 @@ class BlockedContactsAdapter(val viewModel: BlockedContactsViewModel) : ListAdap
val glide = GlideApp.with(itemView) val glide = GlideApp.with(itemView)
val binding = BlockedContactLayoutBinding.bind(itemView) val binding = BlockedContactLayoutBinding.bind(itemView)
fun bind(recipient: Recipient, isSelected: Boolean, toggleSelection: () -> Unit) { fun bind(selectable: SelectableRecipient, toggle: (SelectableRecipient) -> Unit) {
binding.recipientName.text = recipient.name binding.recipientName.text = selectable.item.name
with (binding.profilePictureView.root) { with (binding.profilePictureView.root) {
glide = this@ViewHolder.glide glide = this@ViewHolder.glide
update(recipient) update(selectable.item)
} }
binding.root.setOnClickListener { toggleSelection() } binding.root.setOnClickListener { toggle(selectable) }
binding.selectButton.isSelected = isSelected binding.selectButton.isSelected = selectable.isSelected
} }
} }
}
}

View File

@ -21,6 +21,7 @@ import network.loki.messenger.R
import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.recipients.Recipient
import org.thoughtcrime.securesms.database.DatabaseContentProviders import org.thoughtcrime.securesms.database.DatabaseContentProviders
import org.thoughtcrime.securesms.database.Storage import org.thoughtcrime.securesms.database.Storage
import org.thoughtcrime.securesms.util.adapter.SelectableItem
import javax.inject.Inject import javax.inject.Inject
@HiltViewModel @HiltViewModel
@ -101,10 +102,19 @@ class BlockedContactsViewModel @Inject constructor(private val storage: Storage)
return context.getString(R.string.Unblock_dialog__message, stringBuilder.toString()) return context.getString(R.string.Unblock_dialog__message, stringBuilder.toString())
} }
fun toggle(selectable: SelectableItem<Recipient>) {
_state.value = state.run {
if (selectable.isSelected) copy(selectedItems = selectedItems - selectable.item)
else copy(selectedItems = selectedItems + selectable.item)
}
}
data class BlockedContactsViewState( data class BlockedContactsViewState(
val blockedContacts: List<Recipient>, val blockedContacts: List<Recipient>,
val selectedItems: Set<Recipient> val selectedItems: Set<Recipient>
) { ) {
val items = blockedContacts.map { SelectableItem(it, it in selectedItems) }
val isEmpty get() = blockedContacts.isEmpty() val isEmpty get() = blockedContacts.isEmpty()
val unblockButtonEnabled get() = selectedItems.isNotEmpty() val unblockButtonEnabled get() = selectedItems.isNotEmpty()
val emptyStateMessageTextViewVisible get() = blockedContacts.isEmpty() val emptyStateMessageTextViewVisible get() = blockedContacts.isEmpty()

View File

@ -0,0 +1,3 @@
package org.thoughtcrime.securesms.util.adapter
data class SelectableItem<T>(val item: T, val isSelected: Boolean)