From 172acc8668ed21df7bfa0ec25714da2a750ea677 Mon Sep 17 00:00:00 2001 From: Taras Smakula <tarassmakula@gmail.com> Date: Fri, 12 Jan 2024 16:50:16 +0200 Subject: [PATCH] Observe only timelines on circles screen --- .../feature/circles/CirclesDataSource.kt | 21 +++++++---------- .../futo/circles/core/utils/MatrixUtils.kt | 23 +++++++++++++++---- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/futo/circles/feature/circles/CirclesDataSource.kt b/app/src/main/java/org/futo/circles/feature/circles/CirclesDataSource.kt index f59a347c0..85d9f53d4 100644 --- a/app/src/main/java/org/futo/circles/feature/circles/CirclesDataSource.kt +++ b/app/src/main/java/org/futo/circles/feature/circles/CirclesDataSource.kt @@ -1,5 +1,6 @@ package org.futo.circles.feature.circles +import android.util.Log import androidx.lifecycle.asFlow import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.combine @@ -11,13 +12,13 @@ import org.futo.circles.core.model.CIRCLES_SPACE_ACCOUNT_DATA_KEY import org.futo.circles.core.model.TIMELINE_TYPE import org.futo.circles.core.provider.MatrixSessionProvider import org.futo.circles.core.utils.getJoinedRoomById +import org.futo.circles.core.utils.getTimelinesLiveData import org.futo.circles.mapping.toJoinedCircleListItem import org.futo.circles.model.CircleInvitesNotificationListItem import org.futo.circles.model.CircleListItem import org.futo.circles.model.CirclesHeaderItem import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.model.RoomSummary -import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams import javax.inject.Inject class CirclesDataSource @Inject constructor( @@ -26,19 +27,16 @@ class CirclesDataSource @Inject constructor( ) { fun getCirclesFlow() = combine( - MatrixSessionProvider.getSessionOrThrow().roomService() - .getRoomSummariesLive(roomSummaryQueryParams { excludeType = null }) - .asFlow(), + getTimelinesLiveData().asFlow(), MatrixSessionProvider.getSessionOrThrow().roomService().getChangeMembershipsLive().asFlow() - ) { roomSummaries, _ -> - withContext(Dispatchers.IO) { buildCirclesList(roomSummaries) } + ) { timelines, _ -> + withContext(Dispatchers.IO) { buildCirclesList(timelines) } }.distinctUntilChanged() - private fun buildCirclesList(list: List<RoomSummary>): List<CircleListItem> { - val invitesCount = list.filter { isInviteToCircleTimeline(it) }.size + private fun buildCirclesList(timelines: List<RoomSummary>): List<CircleListItem> { + val invitesCount = timelines.filter { it.membership == Membership.INVITE }.size - val joinedCirclesSpaceIds = getJoinedCirclesIds() - val joinedCircles = list.filter { isJoinedCircle(it, joinedCirclesSpaceIds) } + val joinedCircles = getJoinedCirclesIds().mapNotNull { getJoinedRoomById(it)?.roomSummary() } val sharedCirclesTimelinesIds = sharedCircleDataSource.getSharedCirclesTimelinesIds() val sharedCircles = joinedCircles.filter { joinedCircle -> @@ -63,9 +61,6 @@ class CirclesDataSource @Inject constructor( return displayList } - fun isJoinedCircle(summary: RoomSummary, joinedCirclesIds: List<String>): Boolean = - joinedCirclesIds.contains(summary.roomId) - fun getJoinedCirclesIds(): List<String> { val circlesSpaceId = spacesTreeAccountDataSource.getRoomIdByKey( CIRCLES_SPACE_ACCOUNT_DATA_KEY diff --git a/core/src/main/java/org/futo/circles/core/utils/MatrixUtils.kt b/core/src/main/java/org/futo/circles/core/utils/MatrixUtils.kt index 75922ab74..db72dff03 100644 --- a/core/src/main/java/org/futo/circles/core/utils/MatrixUtils.kt +++ b/core/src/main/java/org/futo/circles/core/utils/MatrixUtils.kt @@ -2,7 +2,9 @@ package org.futo.circles.core.utils import org.futo.circles.core.model.GALLERY_TYPE import org.futo.circles.core.model.GROUP_TYPE +import org.futo.circles.core.model.TIMELINE_TYPE import org.futo.circles.core.provider.MatrixSessionProvider +import org.matrix.android.sdk.api.query.RoomCategoryFilter import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.model.RoomType import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams @@ -10,6 +12,14 @@ import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams const val roomType = "m.room" const val spaceType = RoomType.SPACE +private val roomTypes = listOf( + roomType, + spaceType, + GALLERY_TYPE, + TIMELINE_TYPE, + GROUP_TYPE +) + private fun getRoomsLiveDataWithType( type: String, membershipFilter: List<Membership> = Membership.activeMemberships() @@ -22,24 +32,27 @@ private fun getRoomsWithType( ) = MatrixSessionProvider.getSessionOrThrow().roomService() .getRoomSummaries(getCirclesRoomTypeFilter(type, membershipFilter)) -private fun getCirclesRoomTypeFilter(type: String, membershipFilter: List<Membership>) = +private fun getCirclesRoomTypeFilter(type:String, membershipFilter: List<Membership>) = roomSummaryQueryParams { memberships = membershipFilter includeType = listOf(type) - excludeType = listOf(roomType, spaceType) + excludeType = roomTypes - type + roomCategoryFilter = RoomCategoryFilter.ONLY_ROOMS } fun getGroupsLiveData(membershipFilter: List<Membership> = Membership.activeMemberships()) = getRoomsLiveDataWithType(GROUP_TYPE, membershipFilter) -fun getGroups(membershipFilter: List<Membership> = Membership.activeMemberships()) = - getRoomsWithType(GROUP_TYPE, membershipFilter) - fun getGalleriesLiveData(membershipFilter: List<Membership> = Membership.activeMemberships()) = getRoomsLiveDataWithType(GALLERY_TYPE, membershipFilter) fun getGalleries(membershipFilter: List<Membership> = Membership.activeMemberships()) = getRoomsWithType(GALLERY_TYPE, membershipFilter) +fun getSpacesLiveData(membershipFilter: List<Membership> = Membership.activeMemberships()) = + getRoomsLiveDataWithType(spaceType, membershipFilter) + +fun getTimelinesLiveData(membershipFilter: List<Membership> = Membership.activeMemberships()) = + getRoomsLiveDataWithType(TIMELINE_TYPE, membershipFilter) -- GitLab