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