From cd252325725c1c8ad365873e0593caf6c7cafcac Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 7 Nov 2018 12:17:10 +0100 Subject: [PATCH] Group/Room list : show filtered room when a group is selected --- .../riotredesign/features/home/HomeViewModel.kt | 3 +++ .../features/home/group/GroupSummaryItem.kt | 5 ++++- .../home/room/list/RoomSummaryController.kt | 16 ++++++++++++++-- app/src/main/res/drawable/fg_group_item.xml | 13 +++++++++++++ app/src/main/res/layout/fragment_home_drawer.xml | 2 +- app/src/main/res/layout/item_group.xml | 6 ++++-- app/src/main/res/layout/item_room_category.xml | 10 ++++++---- .../api/session/room/model/RoomSummary.kt | 3 ++- .../database/mapper/RoomSummaryMapper.kt | 3 ++- .../internal/database/model/RoomSummaryEntity.kt | 3 ++- .../android/internal/session/SessionModule.kt | 2 +- .../internal/session/room/RoomSummaryUpdater.kt | 11 +++++++++-- 12 files changed, 61 insertions(+), 16 deletions(-) create mode 100644 app/src/main/res/drawable/fg_group_item.xml diff --git a/app/src/main/java/im/vector/riotredesign/features/home/HomeViewModel.kt b/app/src/main/java/im/vector/riotredesign/features/home/HomeViewModel.kt index b290f6ee26..3accb774ac 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/HomeViewModel.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/HomeViewModel.kt @@ -48,6 +48,8 @@ class HomeViewModel(initialState: HomeViewState, private val session: Session) : withState { state -> if (state.selectedGroup?.groupId != action.groupSummary.groupId) { setState { copy(selectedGroup = action.groupSummary) } + } else { + setState { copy(selectedGroup = null) } } } } @@ -56,6 +58,7 @@ class HomeViewModel(initialState: HomeViewState, private val session: Session) : session .rx().liveRoomSummaries() .execute { async -> + val summaries = async() val directRooms = summaries?.filter { it.isDirect } ?: emptyList() val groupRooms = summaries?.filter { !it.isDirect } ?: emptyList() 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 75e7463ea0..0215349fdb 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 @@ -3,6 +3,7 @@ package im.vector.riotredesign.features.home.group import android.widget.ImageView import im.vector.riotredesign.R import im.vector.riotredesign.core.epoxy.KotlinModel +import im.vector.riotredesign.core.platform.CheckableFrameLayout import im.vector.riotredesign.features.home.AvatarRenderer @@ -14,9 +15,11 @@ data class GroupSummaryItem( ) : KotlinModel(R.layout.item_group) { private val avatarImageView by bind(R.id.groupAvatarImageView) + private val rootView by bind(R.id.itemGroupLayout) override fun bind() { - avatarImageView.setOnClickListener { listener?.invoke() } + rootView.isSelected = isSelected + rootView.setOnClickListener { listener?.invoke() } AvatarRenderer.render(avatarUrl, groupName.toString(), avatarImageView) } } \ No newline at end of file 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 485fc1b3b4..6aeb893c6d 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 @@ -25,7 +25,16 @@ class RoomSummaryController(private val callback: Callback? = null .addTo(this) if (isDirectRoomsExpanded) { - buildRoomModels(viewState.directRooms, viewState.selectedRoom) + val filteredDirectRooms = viewState.directRooms.filter { + if (viewState.selectedGroup == null) { + true + } else { + it.otherMemberIds + .intersect(viewState.selectedGroup.userIds) + .isNotEmpty() + } + } + buildRoomModels(filteredDirectRooms, viewState.selectedRoom) } RoomCategoryItem( @@ -40,7 +49,10 @@ class RoomSummaryController(private val callback: Callback? = null .addTo(this) if (isGroupRoomsExpanded) { - buildRoomModels(viewState.groupRooms, viewState.selectedRoom) + val filteredGroupRooms = viewState.groupRooms.filter { + viewState.selectedGroup?.roomIds?.contains(it.roomId) ?: true + } + buildRoomModels(filteredGroupRooms, viewState.selectedRoom) } } diff --git a/app/src/main/res/drawable/fg_group_item.xml b/app/src/main/res/drawable/fg_group_item.xml new file mode 100644 index 0000000000..a9e09faa52 --- /dev/null +++ b/app/src/main/res/drawable/fg_group_item.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home_drawer.xml b/app/src/main/res/layout/fragment_home_drawer.xml index b43f68f251..a889b5d1c1 100644 --- a/app/src/main/res/layout/fragment_home_drawer.xml +++ b/app/src/main/res/layout/fragment_home_drawer.xml @@ -7,7 +7,7 @@ \ No newline at end of file diff --git a/app/src/main/res/layout/item_room_category.xml b/app/src/main/res/layout/item_room_category.xml index 587ae7d995..80d0162862 100644 --- a/app/src/main/res/layout/item_room_category.xml +++ b/app/src/main/res/layout/item_room_category.xml @@ -2,15 +2,17 @@ = emptyList() ) \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/RoomSummaryMapper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/RoomSummaryMapper.kt index c5a3547eeb..859af6ffac 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/RoomSummaryMapper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/RoomSummaryMapper.kt @@ -12,7 +12,8 @@ object RoomSummaryMapper { roomSummaryEntity.displayName ?: "", roomSummaryEntity.topic ?: "", roomSummaryEntity.avatarUrl ?: "", - roomSummaryEntity.isDirect + roomSummaryEntity.isDirect, + roomSummaryEntity.otherMemberIds.toList() ) } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/RoomSummaryEntity.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/RoomSummaryEntity.kt index f5069b9c5d..7e47cee787 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/RoomSummaryEntity.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/RoomSummaryEntity.kt @@ -13,7 +13,8 @@ open class RoomSummaryEntity(@PrimaryKey var roomId: String = "", var joinedMembersCount: Int? = 0, var invitedMembersCount: Int? = 0, var isDirect: Boolean = false, - var isLatestSelected: Boolean = false + var isLatestSelected: Boolean = false, + var otherMemberIds: RealmList = RealmList() ) : RealmObject() { companion object diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt index 08a9f25d27..c5c0dec20d 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt @@ -54,7 +54,7 @@ class SessionModule(private val sessionParams: SessionParams) : Module { } scope(DefaultSession.SCOPE) { - RoomSummaryUpdater(get(), get(), get(), get()) + RoomSummaryUpdater(get(), get(), get(), get(), sessionParams.credentials) } scope(DefaultSession.SCOPE) { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomSummaryUpdater.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomSummaryUpdater.kt index a1f5e31dd8..4fdbe7236f 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomSummaryUpdater.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomSummaryUpdater.kt @@ -6,6 +6,7 @@ import com.zhuinden.monarchy.Monarchy import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.api.session.room.Room import im.vector.matrix.android.api.session.room.model.RoomTopicContent +import im.vector.matrix.android.internal.auth.data.Credentials import im.vector.matrix.android.internal.database.mapper.asDomain import im.vector.matrix.android.internal.database.model.EventEntity import im.vector.matrix.android.internal.database.model.RoomEntity @@ -13,6 +14,7 @@ import im.vector.matrix.android.internal.database.model.RoomSummaryEntity import im.vector.matrix.android.internal.database.query.last import im.vector.matrix.android.internal.database.query.where import im.vector.matrix.android.internal.session.room.members.RoomDisplayNameResolver +import im.vector.matrix.android.internal.session.room.members.RoomMembers import io.realm.Realm import io.realm.kotlin.createObject import timber.log.Timber @@ -21,7 +23,8 @@ import java.util.concurrent.atomic.AtomicBoolean internal class RoomSummaryUpdater(private val monarchy: Monarchy, private val roomDisplayNameResolver: RoomDisplayNameResolver, private val roomAvatarResolver: RoomAvatarResolver, - private val context: Context + private val context: Context, + private val credentials: Credentials ) : Observer> { private var isStarted = AtomicBoolean(false) @@ -69,15 +72,19 @@ internal class RoomSummaryUpdater(private val monarchy: Monarchy, return } val roomSummary = RoomSummaryEntity.where(realm, room.roomId).findFirst() - ?: realm.createObject(room.roomId) + ?: realm.createObject(room.roomId) val lastMessageEvent = EventEntity.where(realm, room.roomId, EventType.MESSAGE).last() val lastTopicEvent = EventEntity.where(realm, room.roomId, EventType.STATE_ROOM_TOPIC).last()?.asDomain() + val otherRoomMembers = RoomMembers(realm, room.roomId).getLoaded().filterKeys { it != credentials.userId } + roomSummary.displayName = roomDisplayNameResolver.resolve(context, room).toString() roomSummary.avatarUrl = roomAvatarResolver.resolve(room) roomSummary.topic = lastTopicEvent?.content()?.topic roomSummary.lastMessage = lastMessageEvent + roomSummary.otherMemberIds.clear() + roomSummary.otherMemberIds.addAll(otherRoomMembers.keys) } } \ No newline at end of file