From 437dcee3fd076bdcb6889ef1b6aa6cb8fabee087 Mon Sep 17 00:00:00 2001
From: Taras Smakula <tarassmakula@gmail.com>
Date: Thu, 14 Mar 2024 17:06:07 +0200
Subject: [PATCH] Handle select

---
 .../filter/FilterTimelinesDataSource.kt       | 36 ++++++++++---------
 .../filter/list/FilterTimelinesViewHolder.kt  |  5 ++-
 .../dialog_fragment_filter_timeline.xml       |  3 +-
 .../res/layout/list_item_timeline_filter.xml  |  5 +++
 4 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesDataSource.kt b/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesDataSource.kt
index e8bfab510..dd7d02755 100644
--- a/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesDataSource.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesDataSource.kt
@@ -29,13 +29,9 @@ class FilterTimelinesDataSource @Inject constructor(
     val timelinesLiveData = combine(
         circleSummaryLiveData.asFlow(),
         selectedTimelinesIds
-    ) { circle, selectedIds ->
-        val children = circle.getOrNull()?.spaceChildren ?: emptyList()
-        val myTimelineId = getTimelineRoomFor(circleId)?.roomId
-        children.mapNotNull {
-            session.getRoom(it.childRoomId)?.roomSummary()?.takeIf { summary ->
-                summary.membership.isActive() && summary.roomId != myTimelineId
-            }?.toFilterTimelinesListItem(isTimelineSelected(selectedIds, it.childRoomId))
+    ) { _, selectedIds ->
+        getAllTimelinesIds().mapNotNull {
+            session.getRoom(it)?.roomSummary()?.toFilterTimelinesListItem(selectedIds.contains(it))
         }
     }.flowOn(Dispatchers.IO).asLiveData()
 
@@ -48,7 +44,7 @@ class FilterTimelinesDataSource @Inject constructor(
     }
 
     fun toggleItemSelected(roomId: String) {
-        val isItemSelected = isTimelineSelected(selectedTimelinesIds.value, roomId)
+        val isItemSelected = selectedTimelinesIds.value.contains(roomId)
         selectedTimelinesIds.update { value ->
             val newSet = value.toMutableSet()
             if (isItemSelected) newSet.remove(roomId)
@@ -58,18 +54,26 @@ class FilterTimelinesDataSource @Inject constructor(
     }
 
     fun selectAllTimelines() {
-        val ids = timelinesLiveData.value?.map { it.id }?.toSet() ?: emptySet()
-        selectedTimelinesIds.update { ids }
+        selectedTimelinesIds.update { getAllTimelinesIds() }
     }
 
-    private fun isTimelineSelected(selectedIds: Set<String>, roomId: String): Boolean =
-        if (selectedIds.isEmpty()) true
-        else selectedIds.contains(roomId)
-
     private fun getCircleFilter(): Set<String> {
         val content = session.getRoom(circleId)?.roomAccountDataService()
-            ?.getAccountDataEvent(CIRCLE_FILTER_EVENT_TYPE)?.content ?: return emptySet()
-        return (content[TIMELINES_KEY] as? List<*>)?.map { it.toString() }?.toSet() ?: emptySet()
+            ?.getAccountDataEvent(CIRCLE_FILTER_EVENT_TYPE)?.content ?: return getAllTimelinesIds()
+        return (content[TIMELINES_KEY] as? List<*>)?.map { it.toString() }?.toSet()
+            ?: getAllTimelinesIds()
+    }
+
+    private fun getAllTimelinesIds(): Set<String> {
+        val children = session.getRoom(circleId)?.roomSummary()?.spaceChildren ?: emptyList()
+        val myTimelineId = getTimelineRoomFor(circleId)?.roomId
+        return children.mapNotNull {
+            val timelineSummary =
+                session.getRoom(it.childRoomId)?.roomSummary()?.takeIf { summary ->
+                    summary.membership.isActive() && summary.roomId != myTimelineId
+                }
+            timelineSummary?.roomId
+        }.toSet()
     }
 
     companion object {
diff --git a/core/src/main/java/org/futo/circles/core/feature/circles/filter/list/FilterTimelinesViewHolder.kt b/core/src/main/java/org/futo/circles/core/feature/circles/filter/list/FilterTimelinesViewHolder.kt
index ced137870..23487542d 100644
--- a/core/src/main/java/org/futo/circles/core/feature/circles/filter/list/FilterTimelinesViewHolder.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/circles/filter/list/FilterTimelinesViewHolder.kt
@@ -18,7 +18,10 @@ class FilterTimelinesViewHolder(
     private val binding = baseBinding as ListItemTimelineFilterBinding
 
     init {
-        onClick(itemView) { position -> onItemClicked(position) }
+        onClick(itemView) { position ->
+            binding.vCheck.isChecked = !binding.vCheck.isChecked
+            onItemClicked(position)
+        }
     }
 
     fun bind(data: FilterTimelinesListItem) {
diff --git a/core/src/main/res/layout/dialog_fragment_filter_timeline.xml b/core/src/main/res/layout/dialog_fragment_filter_timeline.xml
index 0a24f4d0f..36e9ca78f 100644
--- a/core/src/main/res/layout/dialog_fragment_filter_timeline.xml
+++ b/core/src/main/res/layout/dialog_fragment_filter_timeline.xml
@@ -61,8 +61,7 @@
         android:id="@+id/rvTimelines"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_marginTop="8dp"
-        android:paddingHorizontal="8dp" />
+        android:layout_marginTop="8dp" />
 
 
 </LinearLayout>
\ No newline at end of file
diff --git a/core/src/main/res/layout/list_item_timeline_filter.xml b/core/src/main/res/layout/list_item_timeline_filter.xml
index f51d40d0c..94346abdb 100644
--- a/core/src/main/res/layout/list_item_timeline_filter.xml
+++ b/core/src/main/res/layout/list_item_timeline_filter.xml
@@ -14,11 +14,14 @@
         android:id="@+id/ivRoom"
         android:layout_width="45dp"
         android:layout_height="45dp"
+        android:padding="2dp"
         android:scaleType="fitCenter"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent"
         app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.App.CornerSize50Percent"
+        app:strokeColor="@color/black"
+        app:strokeWidth="1dp"
         tools:src="@color/blue" />
 
 
@@ -55,6 +58,8 @@
         android:id="@+id/vCheck"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
+        android:clickable="false"
+        android:focusable="false"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
-- 
GitLab