From dddca8ce592e5da23c4f6eaf415339cab75538c1 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 31 May 2021 15:32:38 +0200 Subject: [PATCH] Use ClickListener and onClick extension wherever it's possible on Epoxy items - step 2 --- .../app/core/epoxy/ErrorWithRetryItem.kt | 4 +-- .../BottomSheetMessagePreviewItem.kt | 8 +++-- .../BottomSheetQuickReactionsItem.kt | 3 +- .../java/im/vector/app/core/ui/list/Action.kt | 24 ++++++++++++++ .../ui/list/GenericEmptyWithActionItem.kt | 9 ++---- .../app/core/ui/list/GenericFooterItem.kt | 8 ++--- .../im/vector/app/core/ui/list/GenericItem.kt | 20 ++++-------- .../app/core/ui/list/GenericItemWithValue.kt | 8 +++-- .../app/core/ui/list/GenericPillItem.kt | 8 ++--- .../app/core/ui/views/KnownCallsViewHolder.kt | 12 +++---- .../emoji/AutocompleteEmojiController.kt | 9 +----- .../emoji/AutocompleteEmojiItem.kt | 10 +++--- .../BottomSheetVerificationActionItem.kt | 9 +++--- .../devtools/RoomStateListController.kt | 17 ++++------ .../features/form/FormAdvancedToggleItem.kt | 6 ++-- .../form/FormEditTextWithButtonItem.kt | 8 ++--- .../features/grouplist/GroupSummaryItem.kt | 6 ++-- .../grouplist/HomeSpaceSummaryItem.kt | 6 ++-- .../home/room/breadcrumbs/BreadcrumbsItem.kt | 5 --- .../readreceipts/DisplayReadReceiptItem.kt | 6 ++-- .../DisplayReadReceiptsController.kt | 12 +++---- .../detail/timeline/item/AbsMessageItem.kt | 23 ++++++++------ .../timeline/item/CallTileTimelineItem.kt | 5 +-- .../timeline/item/MergedRoomCreationItem.kt | 14 ++++----- .../timeline/item/MessageOptionsItem.kt | 3 +- .../detail/timeline/item/MessagePollItem.kt | 19 +++++++----- .../reactions/ReactionInfoSimpleItem.kt | 6 ++-- .../reactions/ViewReactionsEpoxyController.kt | 12 +++---- .../room/filtered/FilteredRoomFooterItem.kt | 7 +++-- .../home/room/list/SectionHeaderAdapter.kt | 15 +++++---- .../reactions/EmojiSearchResultController.kt | 8 ++--- .../reactions/EmojiSearchResultItem.kt | 8 ++--- .../devices/DeviceListEpoxyController.kt | 5 ++- .../devices/DeviceTrustInfoEpoxyController.kt | 12 +++---- .../uploads/media/UploadsImageItem.kt | 16 +++------- .../uploads/media/UploadsMediaController.kt | 16 ++++------ .../uploads/media/UploadsVideoItem.kt | 16 +++------- .../devtools/AccountDataEpoxyController.kt | 5 ++- .../GossipingTrailPagedEpoxyController.kt | 3 +- .../app/features/spaces/SpaceAddItem.kt | 11 +++---- .../features/spaces/SpaceSummaryController.kt | 8 ++--- .../app/features/spaces/SpaceSummaryItem.kt | 31 ++++++------------- .../features/spaces/SubSpaceSummaryItem.kt | 30 ++++++------------ .../create/ChoosePrivateSpaceTypeFragment.kt | 10 +++--- .../spaces/create/ChooseSpaceTypeFragment.kt | 12 +++---- .../explore/SpaceDirectoryController.kt | 18 +++++++---- .../people/SpacePeopleListController.kt | 9 ++---- 47 files changed, 244 insertions(+), 276 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/core/ui/list/Action.kt diff --git a/vector/src/main/java/im/vector/app/core/epoxy/ErrorWithRetryItem.kt b/vector/src/main/java/im/vector/app/core/epoxy/ErrorWithRetryItem.kt index f555a70d3f..8fe067858a 100644 --- a/vector/src/main/java/im/vector/app/core/epoxy/ErrorWithRetryItem.kt +++ b/vector/src/main/java/im/vector/app/core/epoxy/ErrorWithRetryItem.kt @@ -30,13 +30,13 @@ abstract class ErrorWithRetryItem : VectorEpoxyModel( var text: String? = null @EpoxyAttribute - var listener: (() -> Unit)? = null + var listener: ClickListener? = null override fun bind(holder: Holder) { super.bind(holder) holder.textView.text = text holder.buttonView.isVisible = listener != null - holder.buttonView.setOnClickListener { listener?.invoke() } + holder.buttonView.onClick(listener) } class Holder : VectorEpoxyHolder() { diff --git a/vector/src/main/java/im/vector/app/core/epoxy/bottomsheet/BottomSheetMessagePreviewItem.kt b/vector/src/main/java/im/vector/app/core/epoxy/bottomsheet/BottomSheetMessagePreviewItem.kt index f05e0843e8..9ede152802 100644 --- a/vector/src/main/java/im/vector/app/core/epoxy/bottomsheet/BottomSheetMessagePreviewItem.kt +++ b/vector/src/main/java/im/vector/app/core/epoxy/bottomsheet/BottomSheetMessagePreviewItem.kt @@ -23,8 +23,10 @@ import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R +import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel +import im.vector.app.core.epoxy.onClick import im.vector.app.core.extensions.setTextOrHide import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.room.detail.timeline.tools.findPillsAndProcess @@ -62,13 +64,13 @@ abstract class BottomSheetMessagePreviewItem : VectorEpoxyModel Unit)? = null + var userClicked: ClickListener? = null override fun bind(holder: Holder) { super.bind(holder) avatarRenderer.render(matrixItem, holder.avatar) - holder.avatar.setOnClickListener { userClicked?.invoke() } - holder.sender.setOnClickListener { userClicked?.invoke() } + holder.avatar.onClick(userClicked) + holder.sender.onClick(userClicked) holder.sender.setTextOrHide(matrixItem.displayName) data?.let { imageContentRenderer?.render(it, ImageContentRenderer.Mode.THUMBNAIL, holder.imagePreview) diff --git a/vector/src/main/java/im/vector/app/core/epoxy/bottomsheet/BottomSheetQuickReactionsItem.kt b/vector/src/main/java/im/vector/app/core/epoxy/bottomsheet/BottomSheetQuickReactionsItem.kt index ca8ef89c68..3f6b23a85f 100644 --- a/vector/src/main/java/im/vector/app/core/epoxy/bottomsheet/BottomSheetQuickReactionsItem.kt +++ b/vector/src/main/java/im/vector/app/core/epoxy/bottomsheet/BottomSheetQuickReactionsItem.kt @@ -24,6 +24,7 @@ import im.vector.app.EmojiCompatFontProvider import im.vector.app.R import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel +import im.vector.app.core.epoxy.onClick /** * A quick reaction list for bottom sheet. @@ -50,7 +51,7 @@ abstract class BottomSheetQuickReactionsItem : VectorEpoxyModel() { - class Action(var title: String) { - var perform: Runnable? = null - } - @EpoxyAttribute var title: CharSequence? = null @@ -77,9 +74,7 @@ abstract class GenericEmptyWithActionItem : VectorEpoxyModel() var style: ItemStyle = ItemStyle.NORMAL_TEXT @EpoxyAttribute - var itemClickAction: GenericItem.Action? = null + var itemClickAction: ClickListener? = null @EpoxyAttribute var centered: Boolean = true @@ -65,9 +67,7 @@ abstract class GenericFooterItem : VectorEpoxyModel() holder.text.setTextColor(ThemeUtils.getColor(holder.view.context, R.attr.riotx_text_secondary)) } - holder.view.setOnClickListener { - itemClickAction?.perform?.run() - } + holder.view.onClick(itemClickAction) } class Holder : VectorEpoxyHolder() { diff --git a/vector/src/main/java/im/vector/app/core/ui/list/GenericItem.kt b/vector/src/main/java/im/vector/app/core/ui/list/GenericItem.kt index 8a01183915..e5fd7cbd6e 100644 --- a/vector/src/main/java/im/vector/app/core/ui/list/GenericItem.kt +++ b/vector/src/main/java/im/vector/app/core/ui/list/GenericItem.kt @@ -25,8 +25,10 @@ import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R +import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel +import im.vector.app.core.epoxy.onClick import im.vector.app.core.extensions.setTextOrHide /** @@ -38,10 +40,6 @@ import im.vector.app.core.extensions.setTextOrHide @EpoxyModelClass(layout = R.layout.item_generic_list) abstract class GenericItem : VectorEpoxyModel() { - class Action(var title: String) { - var perform: Runnable? = null - } - @EpoxyAttribute var title: CharSequence? = null @@ -69,7 +67,7 @@ abstract class GenericItem : VectorEpoxyModel() { var destructiveButtonAction: Action? = null @EpoxyAttribute - var itemClickAction: Action? = null + var itemClickAction: ClickListener? = null override fun bind(holder: Holder) { super.bind(holder) @@ -100,18 +98,12 @@ abstract class GenericItem : VectorEpoxyModel() { } holder.actionButton.setTextOrHide(buttonAction?.title) - holder.actionButton.setOnClickListener { - buttonAction?.perform?.run() - } + holder.actionButton.onClick(buttonAction?.listener) holder.destructiveButton.setTextOrHide(destructiveButtonAction?.title) - holder.destructiveButton.setOnClickListener { - destructiveButtonAction?.perform?.run() - } + holder.destructiveButton.onClick(destructiveButtonAction?.listener) - holder.root.setOnClickListener { - itemClickAction?.perform?.run() - } + holder.root.onClick(itemClickAction) } class Holder : VectorEpoxyHolder() { diff --git a/vector/src/main/java/im/vector/app/core/ui/list/GenericItemWithValue.kt b/vector/src/main/java/im/vector/app/core/ui/list/GenericItemWithValue.kt index 0e719a1cd2..c83311e6fe 100644 --- a/vector/src/main/java/im/vector/app/core/ui/list/GenericItemWithValue.kt +++ b/vector/src/main/java/im/vector/app/core/ui/list/GenericItemWithValue.kt @@ -24,10 +24,11 @@ import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R +import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel +import im.vector.app.core.epoxy.onClick import im.vector.app.core.extensions.setTextOrHide -import im.vector.app.core.utils.DebouncedClickListener import im.vector.app.features.themes.ThemeUtils /** @@ -36,6 +37,7 @@ import im.vector.app.features.themes.ThemeUtils * Can display an accessory on the right, that can be an image or an indeterminate progress. * If provided with an action, will display a button at the bottom of the list item. */ +// TODO This class is not following the name convention. Should end with `Item @EpoxyModelClass(layout = R.layout.item_generic_with_value) abstract class GenericItemWithValue : VectorEpoxyModel() { @@ -54,7 +56,7 @@ abstract class GenericItemWithValue : VectorEpoxyModel() { var style: ItemStyle = ItemStyle.NORMAL_TEXT @EpoxyAttribute - var itemClickAction: GenericItem.Action? = null + var itemClickAction: ClickListener? = null @EpoxyAttribute var centered: Boolean = false @@ -76,9 +78,7 @@ abstract class GenericPillItem : VectorEpoxyModel() { ImageViewCompat.setImageTintList(holder.imageView, null) } - holder.view.setOnClickListener { - itemClickAction?.perform?.run() - } + holder.view.onClick(itemClickAction) } class Holder : VectorEpoxyHolder() { diff --git a/vector/src/main/java/im/vector/app/core/ui/views/KnownCallsViewHolder.kt b/vector/src/main/java/im/vector/app/core/ui/views/KnownCallsViewHolder.kt index 628356fcad..872545a069 100644 --- a/vector/src/main/java/im/vector/app/core/ui/views/KnownCallsViewHolder.kt +++ b/vector/src/main/java/im/vector/app/core/ui/views/KnownCallsViewHolder.kt @@ -18,10 +18,10 @@ package im.vector.app.core.ui.views import androidx.cardview.widget.CardView import androidx.core.view.isVisible -import im.vector.app.core.utils.DebouncedClickListener -import org.matrix.android.sdk.api.session.call.CallState +import im.vector.app.core.epoxy.onClick import im.vector.app.features.call.utils.EglUtils import im.vector.app.features.call.webrtc.WebRtcCall +import org.matrix.android.sdk.api.session.call.CallState import org.webrtc.RendererCommon import org.webrtc.SurfaceViewRenderer @@ -88,11 +88,9 @@ class KnownCallsViewHolder { this.currentCallsView = activeCallView this.pipWrapper = pipWrapper this.currentCallsView?.callback = interactionListener - pipWrapper.setOnClickListener( - DebouncedClickListener({ - interactionListener.onTapToReturnToCall() - }) - ) + pipWrapper.onClick { + interactionListener.onTapToReturnToCall() + } this.currentCall?.addListener(tickListener) } diff --git a/vector/src/main/java/im/vector/app/features/autocomplete/emoji/AutocompleteEmojiController.kt b/vector/src/main/java/im/vector/app/features/autocomplete/emoji/AutocompleteEmojiController.kt index ea5d997495..d4a98fe13c 100644 --- a/vector/src/main/java/im/vector/app/features/autocomplete/emoji/AutocompleteEmojiController.kt +++ b/vector/src/main/java/im/vector/app/features/autocomplete/emoji/AutocompleteEmojiController.kt @@ -21,7 +21,6 @@ import androidx.recyclerview.widget.RecyclerView import com.airbnb.epoxy.TypedEpoxyController import im.vector.app.EmojiCompatFontProvider import im.vector.app.features.autocomplete.AutocompleteClickListener -import im.vector.app.features.reactions.ReactionClickListener import im.vector.app.features.reactions.data.EmojiItem import javax.inject.Inject @@ -51,13 +50,7 @@ class AutocompleteEmojiController @Inject constructor( id(emojiItem.name) emojiItem(emojiItem) emojiTypeFace(host.emojiTypeface) - onClickListener( - object : ReactionClickListener { - override fun onReactionSelected(reaction: String) { - host.listener?.onItemClick(reaction) - } - } - ) + onClickListener { host.listener?.onItemClick(emojiItem.emoji) } } } diff --git a/vector/src/main/java/im/vector/app/features/autocomplete/emoji/AutocompleteEmojiItem.kt b/vector/src/main/java/im/vector/app/features/autocomplete/emoji/AutocompleteEmojiItem.kt index 5a6e73da6a..1b839f5600 100644 --- a/vector/src/main/java/im/vector/app/features/autocomplete/emoji/AutocompleteEmojiItem.kt +++ b/vector/src/main/java/im/vector/app/features/autocomplete/emoji/AutocompleteEmojiItem.kt @@ -21,10 +21,11 @@ import android.widget.TextView import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R +import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel +import im.vector.app.core.epoxy.onClick import im.vector.app.core.extensions.setTextOrHide -import im.vector.app.features.reactions.ReactionClickListener import im.vector.app.features.reactions.data.EmojiItem @EpoxyModelClass(layout = R.layout.item_autocomplete_emoji) @@ -37,7 +38,7 @@ abstract class AutocompleteEmojiItem : VectorEpoxyModel Unit + lateinit var listener: ClickListener override fun bind(holder: Holder) { super.bind(holder) - holder.view.setOnClickListener { - listener.invoke() - } - + holder.view.onClick(listener) holder.title.text = title holder.title.setTextColor(titleColor) diff --git a/vector/src/main/java/im/vector/app/features/devtools/RoomStateListController.kt b/vector/src/main/java/im/vector/app/features/devtools/RoomStateListController.kt index 25cd2f129f..324377bc57 100644 --- a/vector/src/main/java/im/vector/app/features/devtools/RoomStateListController.kt +++ b/vector/src/main/java/im/vector/app/features/devtools/RoomStateListController.kt @@ -21,7 +21,6 @@ import im.vector.app.R import im.vector.app.core.epoxy.noResultItem import im.vector.app.core.resources.ColorProvider import im.vector.app.core.resources.StringProvider -import im.vector.app.core.ui.list.GenericItem import im.vector.app.core.ui.list.genericItem import me.gujun.android.span.span import org.json.JSONObject @@ -51,11 +50,9 @@ class RoomStateListController @Inject constructor( id(entry.key) title(entry.key) description(host.stringProvider.getQuantityString(R.plurals.entries, entry.value.size, entry.value.size)) - itemClickAction(GenericItem.Action("view").apply { - perform = Runnable { - host.interactionListener?.processAction(RoomDevToolAction.ShowStateEventType(entry.key)) - } - }) + itemClickAction { + host.interactionListener?.processAction(RoomDevToolAction.ShowStateEventType(entry.key)) + } } } } @@ -93,11 +90,9 @@ class RoomStateListController @Inject constructor( } }) description(contentJson) - itemClickAction(GenericItem.Action("view").apply { - perform = Runnable { - host.interactionListener?.processAction(RoomDevToolAction.ShowStateEvent(stateEvent)) - } - }) + itemClickAction { + host.interactionListener?.processAction(RoomDevToolAction.ShowStateEvent(stateEvent)) + } } } } diff --git a/vector/src/main/java/im/vector/app/features/form/FormAdvancedToggleItem.kt b/vector/src/main/java/im/vector/app/features/form/FormAdvancedToggleItem.kt index 2d6535758e..c66c486b2f 100644 --- a/vector/src/main/java/im/vector/app/features/form/FormAdvancedToggleItem.kt +++ b/vector/src/main/java/im/vector/app/features/form/FormAdvancedToggleItem.kt @@ -22,8 +22,10 @@ import androidx.core.graphics.drawable.DrawableCompat import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R +import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel +import im.vector.app.core.epoxy.onClick import im.vector.app.features.themes.ThemeUtils @EpoxyModelClass(layout = R.layout.item_form_advanced_toggle) @@ -31,7 +33,7 @@ abstract class FormAdvancedToggleItem : VectorEpoxyModel Unit)? = null + @EpoxyAttribute var listener: ClickListener? = null override fun bind(holder: Holder) { super.bind(holder) @@ -42,7 +44,7 @@ abstract class FormAdvancedToggleItem : VectorEpoxyModel Unit)? = null @EpoxyAttribute - var onButtonClicked: ((View) -> Unit)? = null + var onButtonClicked: ClickListener? = null private val onTextChangeListener = object : SimpleTextWatcher() { override fun afterTextChanged(s: Editable) { @@ -68,8 +69,7 @@ abstract class FormEditTextWithButtonItem : VectorEpoxyModel() { @EpoxyAttribute lateinit var avatarRenderer: AvatarRenderer @EpoxyAttribute lateinit var matrixItem: MatrixItem @EpoxyAttribute var selected: Boolean = false - @EpoxyAttribute var listener: (() -> Unit)? = null + @EpoxyAttribute var listener: ClickListener? = null override fun bind(holder: Holder) { super.bind(holder) - holder.rootView.setOnClickListener { listener?.invoke() } + holder.rootView.onClick(listener) holder.groupNameView.text = matrixItem.displayName holder.rootView.isChecked = selected avatarRenderer.render(matrixItem, holder.avatarImageView) diff --git a/vector/src/main/java/im/vector/app/features/grouplist/HomeSpaceSummaryItem.kt b/vector/src/main/java/im/vector/app/features/grouplist/HomeSpaceSummaryItem.kt index ddda38aa9c..cb291a88ca 100644 --- a/vector/src/main/java/im/vector/app/features/grouplist/HomeSpaceSummaryItem.kt +++ b/vector/src/main/java/im/vector/app/features/grouplist/HomeSpaceSummaryItem.kt @@ -26,8 +26,10 @@ import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R +import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel +import im.vector.app.core.epoxy.onClick import im.vector.app.core.platform.CheckableConstraintLayout import im.vector.app.features.home.room.list.UnreadCounterBadgeView import im.vector.app.features.themes.ThemeUtils @@ -36,7 +38,7 @@ import im.vector.app.features.themes.ThemeUtils abstract class HomeSpaceSummaryItem : VectorEpoxyModel() { @EpoxyAttribute var selected: Boolean = false - @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var listener: (() -> Unit)? = null + @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var listener: ClickListener? = null @EpoxyAttribute var countState : UnreadCounterBadgeView.State = UnreadCounterBadgeView.State(0, false) @EpoxyAttribute var showSeparator: Boolean = false @@ -47,7 +49,7 @@ abstract class HomeSpaceSummaryItem : VectorEpoxyModel() { holder.typingIndicator.isVisible = hasTypingUsers } - override fun unbind(holder: Holder) { - holder.rootView.setOnClickListener(null) - super.unbind(holder) - } - class Holder : VectorEpoxyHolder() { val unreadCounterBadgeView by bind(R.id.breadcrumbsUnreadCounterBadgeView) val unreadIndentIndicator by bind(R.id.breadcrumbsUnreadIndicator) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/readreceipts/DisplayReadReceiptItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/readreceipts/DisplayReadReceiptItem.kt index b95239df44..314684cc2c 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/readreceipts/DisplayReadReceiptItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/readreceipts/DisplayReadReceiptItem.kt @@ -23,7 +23,9 @@ import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import com.airbnb.epoxy.EpoxyModelWithHolder import im.vector.app.R +import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.VectorEpoxyHolder +import im.vector.app.core.epoxy.onClick import im.vector.app.features.home.AvatarRenderer import org.matrix.android.sdk.api.util.MatrixItem @@ -33,7 +35,7 @@ abstract class DisplayReadReceiptItem : EpoxyModelWithHolder Unit)? = null + @EpoxyAttribute var userClicked: ClickListener? = null override fun bind(holder: Holder) { super.bind(holder) @@ -45,7 +47,7 @@ abstract class DisplayReadReceiptItem : EpoxyModelWithHolder) { - readReceipts.forEach { - val timestamp = dateFormatter.format(it.timestamp, DateFormatKind.DEFAULT_DATE_AND_TIME) + readReceipts.forEach { readReceiptData -> + val timestamp = dateFormatter.format(readReceiptData.timestamp, DateFormatKind.DEFAULT_DATE_AND_TIME) DisplayReadReceiptItem_() - .id(it.userId) - .matrixItem(it.toMatrixItem()) + .id(readReceiptData.userId) + .matrixItem(readReceiptData.toMatrixItem()) .avatarRenderer(avatarRender) .timestamp(timestamp) - .userClicked { listener?.didSelectUser(it.userId) } - .addIf(session.myUserId != it.userId, this) + .userClicked { listener?.didSelectUser(readReceiptData.userId) } + .addIf(session.myUserId != readReceiptData.userId, this) } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt index aedb92ff1b..fd5eea1b49 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt @@ -27,8 +27,8 @@ import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import im.vector.app.R import im.vector.app.core.epoxy.ClickListener +import im.vector.app.core.epoxy.onClick import im.vector.app.core.ui.views.SendStateImageView -import im.vector.app.core.utils.DebouncedClickListener import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.room.detail.timeline.MessageColorProvider import im.vector.app.features.home.room.detail.timeline.TimelineEventController @@ -45,12 +45,17 @@ abstract class AbsMessageItem : AbsBaseMessageItem @EpoxyAttribute lateinit var attributes: Attributes - private val _avatarClickListener = DebouncedClickListener({ - attributes.avatarCallback?.onAvatarClicked(attributes.informationData) - }) - private val _memberNameClickListener = DebouncedClickListener({ - attributes.avatarCallback?.onMemberNameClicked(attributes.informationData) - }) + private val _avatarClickListener = object : ClickListener { + override fun invoke(p1: View) { + attributes.avatarCallback?.onAvatarClicked(attributes.informationData) + } + } + + private val _memberNameClickListener = object : ClickListener { + override fun invoke(p1: View) { + attributes.avatarCallback?.onMemberNameClicked(attributes.informationData) + } + } override fun bind(holder: H) { super.bind(holder) @@ -60,9 +65,9 @@ abstract class AbsMessageItem : AbsBaseMessageItem width = attributes.avatarSize } holder.avatarImageView.visibility = View.VISIBLE - holder.avatarImageView.setOnClickListener(_avatarClickListener) + holder.avatarImageView.onClick(_avatarClickListener) holder.memberNameView.visibility = View.VISIBLE - holder.memberNameView.setOnClickListener(_memberNameClickListener) + holder.memberNameView.onClick(_memberNameClickListener) holder.timeView.visibility = View.VISIBLE holder.timeView.text = attributes.informationData.time holder.memberNameView.text = attributes.informationData.memberName diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/CallTileTimelineItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/CallTileTimelineItem.kt index 1919fec456..5c4edf2d62 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/CallTileTimelineItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/CallTileTimelineItem.kt @@ -29,6 +29,7 @@ import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R import im.vector.app.core.epoxy.ClickListener +import im.vector.app.core.epoxy.onClick import im.vector.app.core.extensions.setLeftDrawable import im.vector.app.core.extensions.setTextWithColoredPart import im.vector.app.features.home.AvatarRenderer @@ -65,11 +66,11 @@ abstract class CallTileTimelineItem : AbsBaseMessageItem + holder.roomAvatarImageView.onClick { view -> if (shouldSetAvatar) { attributes.callback?.onTimelineItemAction(RoomDetailAction.QuickActionSetAvatar) } else { // Note: this is no op if there is no avatar on the room attributes.callback?.onTimelineItemAction(RoomDetailAction.ShowRoomAvatarFullScreen(roomItem, view)) } - })) + } } holder.setAvatarButton.isVisible = shouldSetAvatar if (shouldSetAvatar) { - holder.setAvatarButton.setOnClickListener(DebouncedClickListener({ + holder.setAvatarButton.onClick { attributes.callback?.onTimelineItemAction(RoomDetailAction.QuickActionSetAvatar) - })) + } } holder.addPeopleButton.isVisible = !isDirect if (!isDirect) { - holder.addPeopleButton.setOnClickListener(DebouncedClickListener({ + holder.addPeopleButton.onClick { attributes.callback?.onTimelineItemAction(RoomDetailAction.QuickActionInvitePeople) - })) + } } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageOptionsItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageOptionsItem.kt index 46956dd77c..35da0d4291 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageOptionsItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageOptionsItem.kt @@ -23,6 +23,7 @@ import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import com.google.android.material.button.MaterialButton import im.vector.app.R +import im.vector.app.core.epoxy.onClick import im.vector.app.core.extensions.setTextOrHide import im.vector.app.features.home.room.detail.RoomDetailAction import im.vector.app.features.home.room.detail.timeline.TimelineEventController @@ -59,7 +60,7 @@ abstract class MessageOptionsItem : AbsMessageItem() as MaterialButton holder.buttonContainer.addView(materialButton, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) materialButton.text = option.label - materialButton.setOnClickListener { + materialButton.onClick { callback?.onTimelineItemAction(RoomDetailAction.ReplyToOptions(relatedEventId, index, option.value ?: "$index")) } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessagePollItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessagePollItem.kt index ca5c3b2dea..2178843c28 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessagePollItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessagePollItem.kt @@ -24,8 +24,9 @@ import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R +import im.vector.app.core.epoxy.ClickListener +import im.vector.app.core.epoxy.onClick import im.vector.app.core.extensions.setTextOrHide -import im.vector.app.core.utils.DebouncedClickListener import im.vector.app.features.home.room.detail.RoomDetailAction import im.vector.app.features.home.room.detail.timeline.TimelineEventController import org.matrix.android.sdk.api.session.room.model.message.MessageOptionsContent @@ -143,14 +144,16 @@ abstract class MessagePollItem : AbsMessageItem() { override fun bindView(itemView: View) { super.bindView(itemView) val buttons = listOf(button1, button2, button3, button4, button5) - val clickListener = DebouncedClickListener({ - val optionIndex = buttons.indexOf(it) - if (optionIndex != -1 && pollId != null) { - val compatValue = if (optionIndex < optionValues?.size ?: 0) optionValues?.get(optionIndex) else null - callback?.onTimelineItemAction(RoomDetailAction.ReplyToOptions(pollId!!, optionIndex, compatValue ?: "$optionIndex")) + val clickListener = object : ClickListener { + override fun invoke(p1: View) { + val optionIndex = buttons.indexOf(p1) + if (optionIndex != -1 && pollId != null) { + val compatValue = if (optionIndex < optionValues?.size ?: 0) optionValues?.get(optionIndex) else null + callback?.onTimelineItemAction(RoomDetailAction.ReplyToOptions(pollId!!, optionIndex, compatValue ?: "$optionIndex")) + } } - }) - buttons.forEach { it.setOnClickListener(clickListener) } + } + buttons.forEach { it.onClick(clickListener) } } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ReactionInfoSimpleItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ReactionInfoSimpleItem.kt index 2d60556fa3..aef49e1136 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ReactionInfoSimpleItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ReactionInfoSimpleItem.kt @@ -22,7 +22,9 @@ import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import com.airbnb.epoxy.EpoxyModelWithHolder import im.vector.app.R +import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.VectorEpoxyHolder +import im.vector.app.core.epoxy.onClick /** * Item displaying an emoji reaction (single line with emoji, author, time) @@ -40,7 +42,7 @@ abstract class ReactionInfoSimpleItem : EpoxyModelWithHolder Unit)? = null + var userClicked: ClickListener? = null override fun bind(holder: Holder) { super.bind(holder) @@ -52,7 +54,7 @@ abstract class ReactionInfoSimpleItem : EpoxyModelWithHolder { - state.mapReactionKeyToMemberList()?.forEach { + state.mapReactionKeyToMemberList()?.forEach { reactionInfo -> reactionInfoSimpleItem { - id(it.eventId) - timeStamp(it.timestamp) - reactionKey(host.emojiCompatWrapper.safeEmojiSpanify(it.reactionKey)) - authorDisplayName(it.authorName ?: it.authorId) - userClicked { host.listener?.didSelectUser(it.authorId) } + id(reactionInfo.eventId) + timeStamp(reactionInfo.timestamp) + reactionKey(host.emojiCompatWrapper.safeEmojiSpanify(reactionInfo.reactionKey)) + authorDisplayName(reactionInfo.authorName ?: reactionInfo.authorId) + userClicked { host.listener?.didSelectUser(reactionInfo.authorId) } } } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/filtered/FilteredRoomFooterItem.kt b/vector/src/main/java/im/vector/app/features/home/room/filtered/FilteredRoomFooterItem.kt index 42bef2ddae..9c28faa942 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/filtered/FilteredRoomFooterItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/filtered/FilteredRoomFooterItem.kt @@ -22,6 +22,7 @@ import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel +import im.vector.app.core.epoxy.onClick import im.vector.app.features.home.room.list.widget.NotifsFabMenuView @EpoxyModelClass(layout = R.layout.item_room_filter_footer) @@ -35,9 +36,9 @@ abstract class FilteredRoomFooterItem : VectorEpoxyModel Unit) + private val onClickAction: ClickListener ) : RecyclerView.Adapter() { data class RoomsSectionData( @@ -59,7 +60,7 @@ class SectionHeaderAdapter constructor( override fun getItemViewType(position: Int) = R.layout.item_room_category override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { - return VH.create(parent, this.onClickAction) + return VH.create(parent, onClickAction) } override fun onBindViewHolder(holder: VH, position: Int) { @@ -70,13 +71,11 @@ class SectionHeaderAdapter constructor( class VH constructor( private val binding: ItemRoomCategoryBinding, - onClickAction: (() -> Unit) + onClickAction: ClickListener ) : RecyclerView.ViewHolder(binding.root) { init { - binding.root.setOnClickListener(DebouncedClickListener({ - onClickAction.invoke() - })) + binding.root.onClick(onClickAction) } fun bind(roomsSectionData: RoomsSectionData) { @@ -91,7 +90,7 @@ class SectionHeaderAdapter constructor( } companion object { - fun create(parent: ViewGroup, onClickAction: () -> Unit): VH { + fun create(parent: ViewGroup, onClickAction: ClickListener): VH { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_room_category, parent, false) val binding = ItemRoomCategoryBinding.bind(view) diff --git a/vector/src/main/java/im/vector/app/features/reactions/EmojiSearchResultController.kt b/vector/src/main/java/im/vector/app/features/reactions/EmojiSearchResultController.kt index ac015ad1f0..c9903e396e 100644 --- a/vector/src/main/java/im/vector/app/features/reactions/EmojiSearchResultController.kt +++ b/vector/src/main/java/im/vector/app/features/reactions/EmojiSearchResultController.kt @@ -63,13 +63,13 @@ class EmojiSearchResultController @Inject constructor( } } else { // Build the search results - results.forEach { + results.forEach { emojiItem -> emojiSearchResultItem { - id(it.name) - emojiItem(it) + id(emojiItem.name) + emojiItem(emojiItem) emojiTypeFace(host.emojiTypeface) currentQuery(data.query) - onClickListener(host.listener) + onClickListener { host.listener?.onReactionSelected(emojiItem.emoji) } } } } diff --git a/vector/src/main/java/im/vector/app/features/reactions/EmojiSearchResultItem.kt b/vector/src/main/java/im/vector/app/features/reactions/EmojiSearchResultItem.kt index 6db4a6bf58..147ce1306f 100644 --- a/vector/src/main/java/im/vector/app/features/reactions/EmojiSearchResultItem.kt +++ b/vector/src/main/java/im/vector/app/features/reactions/EmojiSearchResultItem.kt @@ -21,7 +21,9 @@ import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import com.airbnb.epoxy.EpoxyModelWithHolder import im.vector.app.R +import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.VectorEpoxyHolder +import im.vector.app.core.epoxy.onClick import im.vector.app.core.extensions.setTextOrHide import im.vector.app.features.reactions.data.EmojiItem @@ -35,7 +37,7 @@ abstract class EmojiSearchResultItem : EpoxyModelWithHolder + val isVerified = cryptoDeviceInfo.trustLevel?.isVerified() == true genericItem { id("title") style(ItemStyle.BIG_TEXT) @@ -78,13 +78,13 @@ class DeviceTrustInfoEpoxyController @Inject constructor(private val stringProvi } genericItemWithValue { - id(it.deviceId) + id(cryptoDeviceInfo.deviceId) titleIconResourceId(if (isVerified) R.drawable.ic_shield_trusted else R.drawable.ic_shield_warning) title( span { - +(it.displayName() ?: "") + +(cryptoDeviceInfo.displayName() ?: "") span { - text = " (${it.deviceId})" + text = " (${cryptoDeviceInfo.deviceId})" textColor = host.colorProvider.getColorFromAttribute(R.attr.riotx_text_secondary) textSize = host.dimensionConverter.spToPx(14) } @@ -107,7 +107,7 @@ class DeviceTrustInfoEpoxyController @Inject constructor(private val stringProvi iconRes(R.drawable.ic_arrow_right) iconColor(host.colorProvider.getColor(R.color.riotx_accent)) listener { - host.interactionListener?.onVerifyManually(it) + host.interactionListener?.onVerifyManually(cryptoDeviceInfo) } } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsImageItem.kt b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsImageItem.kt index b844883e69..ea4c20e045 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsImageItem.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsImageItem.kt @@ -16,15 +16,15 @@ package im.vector.app.features.roomprofile.uploads.media -import android.view.View import android.widget.ImageView import androidx.core.view.ViewCompat import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R +import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel -import im.vector.app.core.utils.DebouncedClickListener +import im.vector.app.core.epoxy.onClick import im.vector.app.features.media.ImageContentRenderer @EpoxyModelClass(layout = R.layout.item_uploads_image) @@ -33,15 +33,11 @@ abstract class UploadsImageItem : VectorEpoxyModel() { @EpoxyAttribute lateinit var imageContentRenderer: ImageContentRenderer @EpoxyAttribute lateinit var data: ImageContentRenderer.Data - @EpoxyAttribute var listener: Listener? = null + @EpoxyAttribute var listener: ClickListener? = null override fun bind(holder: Holder) { super.bind(holder) - holder.view.setOnClickListener( - DebouncedClickListener({ - listener?.onItemClicked(holder.imageView, data) - }) - ) + holder.view.onClick(listener) imageContentRenderer.render(data, holder.imageView, IMAGE_SIZE_DP) ViewCompat.setTransitionName(holder.imageView, "imagePreview_${id()}") } @@ -49,8 +45,4 @@ abstract class UploadsImageItem : VectorEpoxyModel() { class Holder : VectorEpoxyHolder() { val imageView by bind(R.id.uploadsImagePreview) } - - interface Listener { - fun onItemClicked(view: View, data: ImageContentRenderer.Data) - } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsMediaController.kt b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsMediaController.kt index a57d3c45fc..55f28ef3b2 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsMediaController.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsMediaController.kt @@ -87,11 +87,9 @@ class UploadsMediaController @Inject constructor( id(uploadEvent.eventId) imageContentRenderer(host.imageContentRenderer) data(data) - listener(object : UploadsImageItem.Listener { - override fun onItemClicked(view: View, data: ImageContentRenderer.Data) { - host.listener?.onOpenImageClicked(view, data) - } - }) + listener { + host.listener?.onOpenImageClicked(it, data) + } } } MessageType.MSGTYPE_VIDEO -> { @@ -100,11 +98,9 @@ class UploadsMediaController @Inject constructor( id(uploadEvent.eventId) imageContentRenderer(host.imageContentRenderer) data(data) - listener(object : UploadsVideoItem.Listener { - override fun onItemClicked(view: View, data: VideoContentRenderer.Data) { - host.listener?.onOpenVideoClicked(view, data) - } - }) + listener { + host.listener?.onOpenVideoClicked(it, data) + } } } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsVideoItem.kt b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsVideoItem.kt index 66138a70b8..217622c20c 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsVideoItem.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/UploadsVideoItem.kt @@ -16,15 +16,15 @@ package im.vector.app.features.roomprofile.uploads.media -import android.view.View import android.widget.ImageView import androidx.core.view.ViewCompat import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R +import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel -import im.vector.app.core.utils.DebouncedClickListener +import im.vector.app.core.epoxy.onClick import im.vector.app.features.media.ImageContentRenderer import im.vector.app.features.media.VideoContentRenderer @@ -34,15 +34,11 @@ abstract class UploadsVideoItem : VectorEpoxyModel() { @EpoxyAttribute lateinit var imageContentRenderer: ImageContentRenderer @EpoxyAttribute lateinit var data: VideoContentRenderer.Data - @EpoxyAttribute var listener: Listener? = null + @EpoxyAttribute var listener: ClickListener? = null override fun bind(holder: Holder) { super.bind(holder) - holder.view.setOnClickListener( - DebouncedClickListener({ - listener?.onItemClicked(holder.imageView, data) - }) - ) + holder.view.onClick(listener) imageContentRenderer.render(data.thumbnailMediaData, holder.imageView, IMAGE_SIZE_DP) ViewCompat.setTransitionName(holder.imageView, "videoPreview_${id()}") } @@ -50,8 +46,4 @@ abstract class UploadsVideoItem : VectorEpoxyModel() { class Holder : VectorEpoxyHolder() { val imageView by bind(R.id.uploadsVideoPreview) } - - interface Listener { - fun onItemClicked(view: View, data: VideoContentRenderer.Data) - } } diff --git a/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataEpoxyController.kt b/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataEpoxyController.kt index 7636ecac6a..be04dc1a69 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataEpoxyController.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataEpoxyController.kt @@ -26,7 +26,6 @@ import im.vector.app.core.epoxy.loadingItem import im.vector.app.core.resources.StringProvider import im.vector.app.core.ui.list.genericFooterItem import im.vector.app.core.ui.list.genericItemWithValue -import im.vector.app.core.utils.DebouncedClickListener import org.matrix.android.sdk.api.session.accountdata.AccountDataEvent import javax.inject.Inject @@ -69,9 +68,9 @@ class AccountDataEpoxyController @Inject constructor( genericItemWithValue { id(accountData.type) title(accountData.type) - itemClickAction(DebouncedClickListener({ + itemClickAction { host.interactionListener?.didTap(accountData) - })) + } itemLongClickAction(View.OnLongClickListener { host.interactionListener?.didLongTap(accountData) true diff --git a/vector/src/main/java/im/vector/app/features/settings/devtools/GossipingTrailPagedEpoxyController.kt b/vector/src/main/java/im/vector/app/features/settings/devtools/GossipingTrailPagedEpoxyController.kt index 666b0c3712..8e1b2eb175 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devtools/GossipingTrailPagedEpoxyController.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devtools/GossipingTrailPagedEpoxyController.kt @@ -23,7 +23,6 @@ import im.vector.app.core.date.DateFormatKind import im.vector.app.core.date.VectorDateFormatter import im.vector.app.core.resources.ColorProvider import im.vector.app.core.resources.StringProvider -import im.vector.app.core.ui.list.GenericItem import im.vector.app.core.ui.list.GenericItem_ import im.vector.app.core.utils.createUIHandler import me.gujun.android.span.span @@ -58,7 +57,7 @@ class GossipingTrailPagedEpoxyController @Inject constructor( val event = item ?: return GenericItem_().apply { id(currentPosition) } return GenericItem_().apply { id(event.hashCode()) - itemClickAction(GenericItem.Action("view").apply { perform = Runnable { host.interactionListener?.didTap(event) } }) + itemClickAction { host.interactionListener?.didTap(event) } title( if (event.isEncrypted()) { "${event.getClearType()} [encrypted]" diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceAddItem.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceAddItem.kt index 703ba73790..b8f25110c1 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceAddItem.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceAddItem.kt @@ -19,22 +19,19 @@ package im.vector.app.features.spaces import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R +import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel -import im.vector.app.core.utils.DebouncedClickListener +import im.vector.app.core.epoxy.onClick @EpoxyModelClass(layout = R.layout.item_space_add) abstract class SpaceAddItem : VectorEpoxyModel() { - @EpoxyAttribute var listener: (() -> Unit)? = null + @EpoxyAttribute var listener: ClickListener? = null override fun bind(holder: Holder) { super.bind(holder) - holder.view.setOnClickListener( - DebouncedClickListener({ - listener?.invoke() - }) - ) + holder.view.onClick(listener) } class Holder : VectorEpoxyHolder() diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceSummaryController.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceSummaryController.kt index 458e4c4503..7d3bb80132 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceSummaryController.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceSummaryController.kt @@ -119,15 +119,15 @@ class SpaceSummaryController @Inject constructor( // show invites on top summaries?.filter { it.membership == Membership.INVITE } - ?.forEach { + ?.forEach { roomSummary -> spaceSummaryItem { avatarRenderer(host.avatarRenderer) - id(it.roomId) - matrixItem(it.toMatrixItem()) + id(roomSummary.roomId) + matrixItem(roomSummary.toMatrixItem()) countState(UnreadCounterBadgeView.State(1, true)) selected(false) description(host.stringProvider.getString(R.string.you_are_invited)) - listener { host.callback?.onSpaceInviteSelected(it) } + listener { host.callback?.onSpaceInviteSelected(roomSummary) } } } diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceSummaryItem.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceSummaryItem.kt index 5528fc2593..a7432571ed 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceSummaryItem.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceSummaryItem.kt @@ -26,11 +26,12 @@ import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R +import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel +import im.vector.app.core.epoxy.onClick import im.vector.app.core.extensions.setTextOrHide import im.vector.app.core.platform.CheckableConstraintLayout -import im.vector.app.core.utils.DebouncedClickListener import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.room.list.UnreadCounterBadgeView import org.matrix.android.sdk.api.util.MatrixItem @@ -41,31 +42,23 @@ abstract class SpaceSummaryItem : VectorEpoxyModel() { @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) lateinit var avatarRenderer: AvatarRenderer @EpoxyAttribute lateinit var matrixItem: MatrixItem @EpoxyAttribute var selected: Boolean = false - @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var listener: (() -> Unit)? = null - @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var onMore: (() -> Unit)? = null - @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var toggleExpand: (() -> Unit)? = null + @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var listener: ClickListener? = null + @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var onMore: ClickListener? = null + @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var toggleExpand: ClickListener? = null @EpoxyAttribute var expanded: Boolean = false @EpoxyAttribute var hasChildren: Boolean = false @EpoxyAttribute var indent: Int = 0 - @EpoxyAttribute var countState : UnreadCounterBadgeView.State = UnreadCounterBadgeView.State(0, false) + @EpoxyAttribute var countState: UnreadCounterBadgeView.State = UnreadCounterBadgeView.State(0, false) @EpoxyAttribute var description: String? = null @EpoxyAttribute var showSeparator: Boolean = false override fun bind(holder: Holder) { super.bind(holder) - holder.rootView.setOnClickListener { listener?.invoke() } + holder.rootView.onClick(listener) holder.groupNameView.text = matrixItem.displayName holder.rootView.isChecked = selected - if (onMore != null) { - holder.moreView.isVisible = true - holder.moreView.setOnClickListener( - DebouncedClickListener({ _ -> - onMore?.invoke() - }) - ) - } else { - holder.moreView.isVisible = false - } + holder.moreView.isVisible = onMore != null + holder.moreView.onClick(onMore) holder.secondLineText.setTextOrHide(description) if (hasChildren) { @@ -75,11 +68,7 @@ abstract class SpaceSummaryItem : VectorEpoxyModel() { if (expanded) R.drawable.ic_expand_less else R.drawable.ic_expand_more ) ) - holder.collapseIndicator.setOnClickListener( - DebouncedClickListener({ _ -> - toggleExpand?.invoke() - }) - ) + holder.collapseIndicator.onClick(toggleExpand) } else { holder.collapseIndicator.isGone = true } diff --git a/vector/src/main/java/im/vector/app/features/spaces/SubSpaceSummaryItem.kt b/vector/src/main/java/im/vector/app/features/spaces/SubSpaceSummaryItem.kt index 977ab57bc9..f50d418de3 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SubSpaceSummaryItem.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SubSpaceSummaryItem.kt @@ -25,10 +25,11 @@ import androidx.core.view.updateLayoutParams import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R +import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel +import im.vector.app.core.epoxy.onClick import im.vector.app.core.platform.CheckableConstraintLayout -import im.vector.app.core.utils.DebouncedClickListener import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.room.list.UnreadCounterBadgeView import org.matrix.android.sdk.api.util.MatrixItem @@ -39,9 +40,9 @@ abstract class SubSpaceSummaryItem : VectorEpoxyModel Unit)? = null - @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var onMore: (() -> Unit)? = null - @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var toggleExpand: (() -> Unit)? = null + @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var listener: ClickListener? = null + @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var onMore: ClickListener? = null + @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var toggleExpand: ClickListener? = null @EpoxyAttribute var expanded: Boolean = false @EpoxyAttribute var hasChildren: Boolean = false @EpoxyAttribute var indent: Int = 0 @@ -49,31 +50,18 @@ abstract class SubSpaceSummaryItem : VectorEpoxyModel - onMore?.invoke() - }) - ) - } else { - holder.moreView.isVisible = false - } + holder.moreView.isVisible = onMore != null + holder.moreView.onClick(onMore) holder.collapseIndicator.setImageDrawable( ContextCompat.getDrawable(holder.view.context, if (expanded) R.drawable.ic_expand_less else R.drawable.ic_expand_more ) ) - holder.collapseIndicator.setOnClickListener( - DebouncedClickListener({ _ -> - toggleExpand?.invoke() - }) - ) - + holder.collapseIndicator.onClick(toggleExpand) holder.collapseIndicator.isVisible = hasChildren holder.indentSpace.isVisible = indent > 0 diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/ChoosePrivateSpaceTypeFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/create/ChoosePrivateSpaceTypeFragment.kt index 196ec98d6b..4f079551eb 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/ChoosePrivateSpaceTypeFragment.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/ChoosePrivateSpaceTypeFragment.kt @@ -22,10 +22,10 @@ import android.view.View import android.view.ViewGroup import com.airbnb.mvrx.activityViewModel import im.vector.app.R +import im.vector.app.core.epoxy.onClick import im.vector.app.core.platform.OnBackPressed import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.resources.StringProvider -import im.vector.app.core.utils.DebouncedClickListener import im.vector.app.databinding.FragmentSpaceCreateChoosePrivateModelBinding import javax.inject.Inject @@ -41,13 +41,13 @@ class ChoosePrivateSpaceTypeFragment @Inject constructor( override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - views.justMeButton.setOnClickListener(DebouncedClickListener({ + views.justMeButton.onClick { sharedViewModel.handle(CreateSpaceAction.SetSpaceTopology(SpaceTopology.JustMe)) - })) + } - views.teammatesButton.setOnClickListener(DebouncedClickListener({ + views.teammatesButton.onClick { sharedViewModel.handle(CreateSpaceAction.SetSpaceTopology(SpaceTopology.MeAndTeammates)) - })) + } sharedViewModel.subscribe { state -> views.accessInfoHelpText.text = stringProvider.getString(R.string.create_spaces_make_sure_access, state.name ?: "") diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/ChooseSpaceTypeFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/create/ChooseSpaceTypeFragment.kt index 51f1821b38..b4c5e63687 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/ChooseSpaceTypeFragment.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/ChooseSpaceTypeFragment.kt @@ -21,8 +21,8 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.airbnb.mvrx.activityViewModel +import im.vector.app.core.epoxy.onClick import im.vector.app.core.platform.VectorBaseFragment -import im.vector.app.core.utils.DebouncedClickListener import im.vector.app.databinding.FragmentSpaceCreateChooseTypeBinding import javax.inject.Inject @@ -36,12 +36,12 @@ class ChooseSpaceTypeFragment @Inject constructor() : VectorBaseFragment