From 7ae9d65d122e36798944ec142d40293074fa59f8 Mon Sep 17 00:00:00 2001
From: Taras Smakula <tarassmakula@gmail.com>
Date: Fri, 29 Sep 2023 14:34:53 +0300
Subject: [PATCH] Improve isJoinedCircle check

---
 .../feature/circles/CirclesDataSource.kt      | 20 +++++++++++++------
 .../room/select/SelectRoomsDataSource.kt      |  9 ++++++---
 2 files changed, 20 insertions(+), 9 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 c563754a0..2f5555fbc 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
@@ -42,7 +42,10 @@ class CirclesDataSource @Inject constructor(
     private fun buildCirclesList(list: List<RoomSummary>): List<CircleListItem> {
         val invites =
             list.filter { isInviteToCircleTimeline(it) }.map { it.toInviteCircleListItem() }
-        val joinedCircles = list.filter { isJoinedCircle(it) }
+
+        val joinedCirclesSpaceIds = getJoinedCirclesIds()
+        val joinedCircles = list.filter { isJoinedCircle(it, joinedCirclesSpaceIds) }
+
         val sharedCircles =
             joinedCircles.filter { joinedCircle ->
                 sharedCircleDataSource.isCircleShared(joinedCircle.roomId)
@@ -63,13 +66,18 @@ class CirclesDataSource @Inject constructor(
         return displayList
     }
 
-    fun isJoinedCircle(summary: RoomSummary): Boolean {
-        if (summary.roomId == sharedCircleDataSource.getSharedCirclesSpaceId()) return false
+    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
-        ) ?: return false
-        return getJoinedRoomById(circlesSpaceId)?.roomSummary()?.spaceChildren?.map { it.childRoomId }
-            ?.contains(summary.roomId) == true
+        ) ?: return emptyList()
+        val sharedCircleSpaceId = sharedCircleDataSource.getSharedCirclesSpaceId()
+        val ids = getJoinedRoomById(circlesSpaceId)?.roomSummary()?.spaceChildren
+            ?.map { it.childRoomId }
+            ?.filter { it != sharedCircleSpaceId }
+        return ids ?: emptyList()
     }
 
     private fun isInviteToCircleTimeline(summary: RoomSummary) =
diff --git a/app/src/main/java/org/futo/circles/feature/room/select/SelectRoomsDataSource.kt b/app/src/main/java/org/futo/circles/feature/room/select/SelectRoomsDataSource.kt
index 8b625ae69..c6d1c96e2 100644
--- a/app/src/main/java/org/futo/circles/feature/room/select/SelectRoomsDataSource.kt
+++ b/app/src/main/java/org/futo/circles/feature/room/select/SelectRoomsDataSource.kt
@@ -18,7 +18,6 @@ import org.futo.circles.core.model.GALLERY_TYPE
 import org.futo.circles.core.model.GROUP_TYPE
 import org.futo.circles.core.model.SelectableRoomListItem
 import org.futo.circles.core.provider.MatrixSessionProvider
-import org.futo.circles.core.workspace.SharedCircleDataSource
 import org.futo.circles.feature.circles.CirclesDataSource
 import org.matrix.android.sdk.api.session.room.model.Membership
 import org.matrix.android.sdk.api.session.room.model.RoomSummary
@@ -31,7 +30,7 @@ class SelectRoomsDataSource @Inject constructor(
     private val circleDataSource: CirclesDataSource
 ) {
 
-    val ordinal = savedStateHandle.getOrThrow<Int>(SelectRoomsFragment.TYPE_ORDINAL)
+    private val ordinal = savedStateHandle.getOrThrow<Int>(SelectRoomsFragment.TYPE_ORDINAL)
     private val roomType: CircleRoomTypeArg =
         CircleRoomTypeArg.values().firstOrNull { it.ordinal == ordinal }
             ?: CircleRoomTypeArg.Circle
@@ -47,7 +46,11 @@ class SelectRoomsDataSource @Inject constructor(
         }.flowOn(Dispatchers.IO).distinctUntilChanged()
 
     private fun getRoomsFlowWithType(): Flow<List<RoomSummary>> = when (roomType) {
-        CircleRoomTypeArg.Circle -> getFilteredRoomsFlow { circleDataSource.isJoinedCircle(it) }
+        CircleRoomTypeArg.Circle -> {
+            val joinedCirclesIds = circleDataSource.getJoinedCirclesIds()
+            getFilteredRoomsFlow { circleDataSource.isJoinedCircle(it, joinedCirclesIds) }
+        }
+
         CircleRoomTypeArg.Group -> getFilteredRoomsFlow { (it.roomType == GROUP_TYPE && it.membership == Membership.JOIN) }
         CircleRoomTypeArg.Photo -> getFilteredRoomsFlow { (it.roomType == GALLERY_TYPE && it.membership == Membership.JOIN) }
     }
-- 
GitLab