From 78408fa0ecc0b1584bc7790f257b4a923b097ca3 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 16 Jan 2020 21:18:14 +0100 Subject: [PATCH] Room profile: create extension join for Collections --- .../vector/riotx/core/extensions/Iterable.kt | 16 +++++++++- .../members/RoomMemberListController.kt | 32 +++++++++++-------- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/vector/src/main/java/im/vector/riotx/core/extensions/Iterable.kt b/vector/src/main/java/im/vector/riotx/core/extensions/Iterable.kt index b4e5b9a921..987194ea2f 100644 --- a/vector/src/main/java/im/vector/riotx/core/extensions/Iterable.kt +++ b/vector/src/main/java/im/vector/riotx/core/extensions/Iterable.kt @@ -19,7 +19,7 @@ package im.vector.riotx.core.extensions /** * Returns the last element yielding the smallest value of the given function or `null` if there are no elements. */ -public inline fun > Iterable.lastMinBy(selector: (T) -> R): T? { +inline fun > Iterable.lastMinBy(selector: (T) -> R): T? { val iterator = iterator() if (!iterator.hasNext()) return null var minElem = iterator.next() @@ -34,3 +34,17 @@ public inline fun > Iterable.lastMinBy(selector: (T) -> } return minElem } + +/** + * Call each for each item, and between between each items + */ +inline fun Collection.join(each: (T) -> Unit, between: (T) -> Unit) { + val lastIndex = size - 1 + forEachIndexed { idx, t -> + each(t) + + if (idx != lastIndex) { + between(t) + } + } +} diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListController.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListController.kt index 7d6bce7bbb..0d838e9c72 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListController.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListController.kt @@ -23,6 +23,7 @@ import im.vector.riotx.R import im.vector.riotx.core.epoxy.dividerItem import im.vector.riotx.core.epoxy.profiles.buildProfileSection import im.vector.riotx.core.epoxy.profiles.profileMatrixItem +import im.vector.riotx.core.extensions.join import im.vector.riotx.core.resources.ColorProvider import im.vector.riotx.core.resources.StringProvider import im.vector.riotx.features.home.AvatarRenderer @@ -55,21 +56,24 @@ class RoomMemberListController @Inject constructor( buildProfileSection( stringProvider.getString(powerLevelCategory.titleRes) ) - roomMemberList.forEach { roomMember -> - profileMatrixItem { - id(roomMember.userId) - matrixItem(roomMember.toMatrixItem()) - avatarRenderer(avatarRenderer) - clickListener { _ -> - callback?.onRoomMemberClicked(roomMember) + roomMemberList.join( + each = { roomMember -> + profileMatrixItem { + id(roomMember.userId) + matrixItem(roomMember.toMatrixItem()) + avatarRenderer(avatarRenderer) + clickListener { _ -> + callback?.onRoomMemberClicked(roomMember) + } + } + }, + between = { roomMemberBefore -> + dividerItem { + id("divider_${roomMemberBefore.userId}") + color(dividerColor) + } } - } - - dividerItem { - id("divider_${roomMember.userId}") - color(dividerColor) - } - } + ) } } }