From c467f179e1949aad963c8c685c473d407c254d2f Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 19 Feb 2019 10:31:05 +0100 Subject: [PATCH] Epoxy : start using viewholder instead of kotlin model as it's more efficient --- .../home/group/GroupSummaryController.kt | 15 +++--- .../features/home/group/GroupSummaryItem.kt | 35 +++++++------ .../home/room/list/RoomCategoryItem.kt | 50 +++++++++++-------- .../home/room/list/RoomSummaryController.kt | 43 ++++++++-------- .../home/room/list/RoomSummaryItem.kt | 47 ++++++++++------- 5 files changed, 105 insertions(+), 85 deletions(-) diff --git a/app/src/main/java/im/vector/riotredesign/features/home/group/GroupSummaryController.kt b/app/src/main/java/im/vector/riotredesign/features/home/group/GroupSummaryController.kt index d2bc0b95..3f24f9e0 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/group/GroupSummaryController.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/group/GroupSummaryController.kt @@ -32,14 +32,13 @@ class GroupSummaryController(private val callback: Callback? = null } summaries.forEach { groupSummary -> val isSelected = groupSummary.groupId == selected?.groupId - GroupSummaryItem( - groupName = groupSummary.displayName, - avatarUrl = groupSummary.avatarUrl, - isSelected = isSelected, - listener = { callback?.onGroupSelected(groupSummary) } - ) - .id(groupSummary.groupId) - .addTo(this) + groupSummaryItem { + id(groupSummary.groupId) + groupName(groupSummary.displayName) + selected(isSelected) + avatarUrl(groupSummary.avatarUrl) + listener { callback?.onGroupSelected(groupSummary) } + } } } diff --git a/app/src/main/java/im/vector/riotredesign/features/home/group/GroupSummaryItem.kt b/app/src/main/java/im/vector/riotredesign/features/home/group/GroupSummaryItem.kt index 664e7453..5b23f408 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/group/GroupSummaryItem.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/group/GroupSummaryItem.kt @@ -17,25 +17,32 @@ package im.vector.riotredesign.features.home.group import android.widget.ImageView +import com.airbnb.epoxy.EpoxyAttribute +import com.airbnb.epoxy.EpoxyModelClass +import com.airbnb.epoxy.EpoxyModelWithHolder import im.vector.riotredesign.R -import im.vector.riotredesign.core.epoxy.KotlinModel +import im.vector.riotredesign.core.epoxy.KotlinEpoxyHolder import im.vector.riotredesign.core.platform.CheckableFrameLayout import im.vector.riotredesign.features.home.AvatarRenderer +@EpoxyModelClass(layout = R.layout.item_group) +abstract class GroupSummaryItem : EpoxyModelWithHolder() { -data class GroupSummaryItem( - val groupName: CharSequence, - val avatarUrl: String?, - val isSelected: Boolean, - val listener: (() -> Unit)? = null -) : KotlinModel(R.layout.item_group) { + @EpoxyAttribute lateinit var groupName: CharSequence + @EpoxyAttribute var avatarUrl: String? = null + @EpoxyAttribute var selected: Boolean = false + @EpoxyAttribute var listener: (() -> Unit)? = null - private val avatarImageView by bind(R.id.groupAvatarImageView) - private val rootView by bind(R.id.itemGroupLayout) - - override fun bind() { - rootView.isSelected = isSelected - rootView.setOnClickListener { listener?.invoke() } - AvatarRenderer.render(avatarUrl, groupName.toString(), avatarImageView) + override fun bind(holder: Holder) { + super.bind(holder) + holder.rootView.isSelected = selected + holder.rootView.setOnClickListener { listener?.invoke() } + AvatarRenderer.render(avatarUrl, groupName.toString(), holder.avatarImageView) } + + class Holder : KotlinEpoxyHolder() { + val avatarImageView by bind(R.id.groupAvatarImageView) + val rootView by bind(R.id.itemGroupLayout) + } + } \ No newline at end of file diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomCategoryItem.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomCategoryItem.kt index 7fcc0210..895be8f6 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomCategoryItem.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomCategoryItem.kt @@ -20,33 +20,39 @@ import android.view.ViewGroup import android.widget.TextView import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.DrawableCompat +import com.airbnb.epoxy.EpoxyAttribute +import com.airbnb.epoxy.EpoxyModelClass +import com.airbnb.epoxy.EpoxyModelWithHolder import im.vector.riotredesign.R -import im.vector.riotredesign.core.epoxy.KotlinModel +import im.vector.riotredesign.core.epoxy.KotlinEpoxyHolder -data class RoomCategoryItem( - val title: CharSequence, - val isExpanded: Boolean, - val unreadCount: Int, - val showHighlighted: Boolean, - val listener: (() -> Unit)? = null -) : KotlinModel(R.layout.item_room_category) { +@EpoxyModelClass(layout = R.layout.item_room_category) +abstract class RoomCategoryItem : EpoxyModelWithHolder() { - private val unreadCounterBadgeView by bind(R.id.roomCategoryUnreadCounterBadgeView) - private val titleView by bind(R.id.roomCategoryTitleView) - private val rootView by bind(R.id.roomCategoryRootView) + @EpoxyAttribute lateinit var title: CharSequence + @EpoxyAttribute var expanded: Boolean = false + @EpoxyAttribute var unreadCount: Int = 0 + @EpoxyAttribute var showHighlighted: Boolean = false + @EpoxyAttribute var listener: (() -> Unit)? = null - private val tintColor by lazy { - ContextCompat.getColor(rootView.context, R.color.bluey_grey_two) - } - - override fun bind() { - val expandedArrowDrawableRes = if (isExpanded) R.drawable.ic_expand_more_white else R.drawable.ic_expand_less_white - val expandedArrowDrawable = ContextCompat.getDrawable(rootView.context, expandedArrowDrawableRes)?.also { + override fun bind(holder: Holder) { + val tintColor = ContextCompat.getColor(holder.rootView.context, R.color.bluey_grey_two) + val expandedArrowDrawableRes = if (expanded) R.drawable.ic_expand_more_white else R.drawable.ic_expand_less_white + val expandedArrowDrawable = ContextCompat.getDrawable(holder.rootView.context, expandedArrowDrawableRes)?.also { DrawableCompat.setTint(it, tintColor) } - unreadCounterBadgeView.render(unreadCount, showHighlighted) - titleView.setCompoundDrawablesWithIntrinsicBounds(expandedArrowDrawable, null, null, null) - titleView.text = title - rootView.setOnClickListener { listener?.invoke() } + holder.unreadCounterBadgeView.render(unreadCount, showHighlighted) + holder.titleView.setCompoundDrawablesWithIntrinsicBounds(expandedArrowDrawable, null, null, null) + holder.titleView.text = title + holder.rootView.setOnClickListener { listener?.invoke() } } + + + class Holder : KotlinEpoxyHolder() { + val unreadCounterBadgeView by bind(R.id.roomCategoryUnreadCounterBadgeView) + val titleView by bind(R.id.roomCategoryTitleView) + val rootView by bind(R.id.roomCategoryRootView) + } + } + diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryController.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryController.kt index cc69d375..8178e2b8 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryController.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryController.kt @@ -85,18 +85,17 @@ class RoomSummaryController(private val stringProvider: StringProvider summaries.map { it.notificationCount }.reduce { acc, i -> acc + i } } val showHighlighted = summaries.any { it.highlightCount > 0 } - RoomCategoryItem( - title = stringProvider.getString(titleRes).toUpperCase(), - isExpanded = isExpanded, - unreadCount = unreadCount, - showHighlighted = showHighlighted, - listener = { - mutateExpandedState() - setData(viewState) - } - ) - .id(titleRes) - .addTo(this) + roomCategoryItem { + id(titleRes) + title(stringProvider.getString(titleRes).toUpperCase()) + expanded(isExpanded) + unreadCount(unreadCount) + showHighlighted(showHighlighted) + listener { + mutateExpandedState() + setData(viewState) + } + } } private fun buildRoomModels(summaries: List, selectedRoomId: String?) { @@ -104,16 +103,16 @@ class RoomSummaryController(private val stringProvider: StringProvider val unreadCount = roomSummary.notificationCount val showHighlighted = roomSummary.highlightCount > 0 val isSelected = roomSummary.roomId == selectedRoomId - RoomSummaryItem( - roomName = roomSummary.displayName, - avatarUrl = roomSummary.avatarUrl, - isSelected = isSelected, - showHighlighted = showHighlighted, - unreadCount = unreadCount, - listener = { callback?.onRoomSelected(roomSummary) } - ) - .id(roomSummary.roomId) - .addTo(this) + + roomSummaryItem { + id(roomSummary.roomId) + roomName(roomSummary.displayName) + avatarUrl(roomSummary.avatarUrl) + selected(isSelected) + showHighlighted(showHighlighted) + unreadCount(unreadCount) + listener { callback?.onRoomSelected(roomSummary) } + } } } diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryItem.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryItem.kt index 6b4bd8a3..a45c7909 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryItem.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryItem.kt @@ -18,31 +18,40 @@ package im.vector.riotredesign.features.home.room.list import android.widget.ImageView import android.widget.TextView +import com.airbnb.epoxy.EpoxyAttribute +import com.airbnb.epoxy.EpoxyModelClass +import com.airbnb.epoxy.EpoxyModelWithHolder import im.vector.riotredesign.R -import im.vector.riotredesign.core.epoxy.KotlinModel +import im.vector.riotredesign.core.epoxy.KotlinEpoxyHolder import im.vector.riotredesign.core.platform.CheckableFrameLayout import im.vector.riotredesign.features.home.AvatarRenderer -data class RoomSummaryItem( - val roomName: CharSequence, - val avatarUrl: String?, - val isSelected: Boolean, - val unreadCount: Int, - val showHighlighted: Boolean, - val listener: (() -> Unit)? = null -) : KotlinModel(R.layout.item_room) { +@EpoxyModelClass(layout = R.layout.item_room) +abstract class RoomSummaryItem : EpoxyModelWithHolder() { - private val unreadCounterBadgeView by bind(R.id.roomUnreadCounterBadgeView) - private val titleView by bind(R.id.roomNameView) - private val avatarImageView by bind(R.id.roomAvatarImageView) - private val rootView by bind(R.id.itemRoomLayout) + @EpoxyAttribute lateinit var roomName: CharSequence + @EpoxyAttribute var avatarUrl: String? = null + @EpoxyAttribute var selected: Boolean = false + @EpoxyAttribute var unreadCount: Int = 0 + @EpoxyAttribute var showHighlighted: Boolean = false + @EpoxyAttribute var listener: (() -> Unit)? = null - override fun bind() { - unreadCounterBadgeView.render(unreadCount, showHighlighted) - rootView.isChecked = isSelected - rootView.setOnClickListener { listener?.invoke() } - titleView.text = roomName - AvatarRenderer.render(avatarUrl, roomName.toString(), avatarImageView) + + override fun bind(holder: Holder) { + super.bind(holder) + holder.unreadCounterBadgeView.render(unreadCount, showHighlighted) + holder.rootView.isChecked = selected + holder.rootView.setOnClickListener { listener?.invoke() } + holder.titleView.text = roomName + AvatarRenderer.render(avatarUrl, roomName.toString(), holder.avatarImageView) } + + class Holder : KotlinEpoxyHolder() { + val unreadCounterBadgeView by bind(R.id.roomUnreadCounterBadgeView) + val titleView by bind(R.id.roomNameView) + val avatarImageView by bind(R.id.roomAvatarImageView) + val rootView by bind(R.id.itemRoomLayout) + } + } \ No newline at end of file