From 4f2ef7f2af5458e829325acc9141de021b3ff60a Mon Sep 17 00:00:00 2001 From: andrew Date: Mon, 22 May 2023 15:46:12 +0930 Subject: [PATCH] Add SelectableItem<> --- .../preferences/BlockedContactsActivity.kt | 11 ++--- .../preferences/BlockedContactsAdapter.kt | 45 +++++++++---------- .../preferences/BlockedContactsViewModel.kt | 10 +++++ .../securesms/util/adapter/SelectableItem.kt | 3 ++ 4 files changed, 36 insertions(+), 33 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/util/adapter/SelectableItem.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/BlockedContactsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/BlockedContactsActivity.kt index 9b8d800dd5..d2db4fca43 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/BlockedContactsActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/BlockedContactsActivity.kt @@ -27,13 +27,8 @@ class BlockedContactsActivity: PassphraseRequiredActionBarActivity() { AlertDialog.Builder(this) .setTitle(title) .setMessage(message) - .setPositiveButton(R.string.continue_2) { d, _ -> - viewModel.unblock() - d.dismiss() - } - .setNegativeButton(R.string.cancel) { d, _ -> - d.dismiss() - } + .setPositiveButton(R.string.continue_2) { _, _ -> viewModel.unblock() } + .setNegativeButton(R.string.cancel) { _, _ -> } .show() } @@ -46,7 +41,7 @@ class BlockedContactsActivity: PassphraseRequiredActionBarActivity() { viewModel.subscribe(this) .observe(this) { state -> - adapter.submitList(state.blockedContacts) + adapter.submitList(state.items) binding.emptyStateMessageTextView.isVisible = state.emptyStateMessageTextViewVisible binding.nonEmptyStateGroup.isVisible = state.nonEmptyStateGroupVisible binding.unblockButton.isEnabled = state.unblockButtonEnabled diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/BlockedContactsAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/BlockedContactsAdapter.kt index 26632e5aa6..6c13133a4e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/BlockedContactsAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/BlockedContactsAdapter.kt @@ -10,30 +10,26 @@ import network.loki.messenger.R import network.loki.messenger.databinding.BlockedContactLayoutBinding import org.session.libsession.utilities.recipients.Recipient import org.thoughtcrime.securesms.mms.GlideApp +import org.thoughtcrime.securesms.util.adapter.SelectableItem -class BlockedContactsAdapter(val viewModel: BlockedContactsViewModel) : ListAdapter(RecipientDiffer()) { +typealias SelectableRecipient = SelectableItem - class RecipientDiffer: DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: Recipient, newItem: Recipient) = oldItem === newItem - override fun areContentsTheSame(oldItem: Recipient, newItem: Recipient) = oldItem == newItem +class BlockedContactsAdapter(val viewModel: BlockedContactsViewModel) : ListAdapter(RecipientDiffer()) { + + class RecipientDiffer: DiffUtil.ItemCallback() { + 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 { - val itemView = LayoutInflater.from(parent.context).inflate(R.layout.blocked_contact_layout, parent, false) - return ViewHolder(itemView) - } - - private fun toggleSelection(recipient: Recipient, isSelected: Boolean, position: Int) { - viewModel.select(recipient, isSelected) - notifyItemChanged(position) - } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder = + LayoutInflater.from(parent.context) + .inflate(R.layout.blocked_contact_layout, parent, false) + .let(::ViewHolder) override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val recipient = getItem(position) - val isSelected = recipient in viewModel.state.selectedItems - holder.bind(recipient, isSelected) { - toggleSelection(recipient, !isSelected, position) - } + val selectable = getItem(position) + holder.bind(selectable, viewModel::toggle) } override fun onViewRecycled(holder: ViewHolder) { @@ -46,15 +42,14 @@ class BlockedContactsAdapter(val viewModel: BlockedContactsViewModel) : ListAdap val glide = GlideApp.with(itemView) val binding = BlockedContactLayoutBinding.bind(itemView) - fun bind(recipient: Recipient, isSelected: Boolean, toggleSelection: () -> Unit) { - binding.recipientName.text = recipient.name + fun bind(selectable: SelectableRecipient, toggle: (SelectableRecipient) -> Unit) { + binding.recipientName.text = selectable.item.name with (binding.profilePictureView.root) { glide = this@ViewHolder.glide - update(recipient) + update(selectable.item) } - binding.root.setOnClickListener { toggleSelection() } - binding.selectButton.isSelected = isSelected + binding.root.setOnClickListener { toggle(selectable) } + binding.selectButton.isSelected = selectable.isSelected } } - -} \ No newline at end of file +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/BlockedContactsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/BlockedContactsViewModel.kt index baafa16455..0b13201220 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/BlockedContactsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/BlockedContactsViewModel.kt @@ -21,6 +21,7 @@ import network.loki.messenger.R import org.session.libsession.utilities.recipients.Recipient import org.thoughtcrime.securesms.database.DatabaseContentProviders import org.thoughtcrime.securesms.database.Storage +import org.thoughtcrime.securesms.util.adapter.SelectableItem import javax.inject.Inject @HiltViewModel @@ -101,10 +102,19 @@ class BlockedContactsViewModel @Inject constructor(private val storage: Storage) return context.getString(R.string.Unblock_dialog__message, stringBuilder.toString()) } + fun toggle(selectable: SelectableItem) { + _state.value = state.run { + if (selectable.isSelected) copy(selectedItems = selectedItems - selectable.item) + else copy(selectedItems = selectedItems + selectable.item) + } + } + data class BlockedContactsViewState( val blockedContacts: List, val selectedItems: Set ) { + val items = blockedContacts.map { SelectableItem(it, it in selectedItems) } + val isEmpty get() = blockedContacts.isEmpty() val unblockButtonEnabled get() = selectedItems.isNotEmpty() val emptyStateMessageTextViewVisible get() = blockedContacts.isEmpty() diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/adapter/SelectableItem.kt b/app/src/main/java/org/thoughtcrime/securesms/util/adapter/SelectableItem.kt new file mode 100644 index 0000000000..88b41d11cd --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/util/adapter/SelectableItem.kt @@ -0,0 +1,3 @@ +package org.thoughtcrime.securesms.util.adapter + +data class SelectableItem(val item: T, val isSelected: Boolean)