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 df94f0842c0ebfe548d16bc5d38fb560dfcc1018..e8bfab5106bafc4204b5ce4029805a293601c15a 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 @@ -2,6 +2,7 @@ package org.futo.circles.core.feature.circles.filter import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.asFlow +import androidx.lifecycle.asLiveData import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine @@ -9,7 +10,7 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.update import org.futo.circles.core.extensions.createResult import org.futo.circles.core.extensions.getOrThrow -import org.futo.circles.core.model.toCircleFilterListItem +import org.futo.circles.core.model.toFilterTimelinesListItem import org.futo.circles.core.provider.MatrixSessionProvider import org.futo.circles.core.utils.getTimelineRoomFor import org.matrix.android.sdk.api.session.getRoom @@ -34,9 +35,9 @@ class FilterTimelinesDataSource @Inject constructor( children.mapNotNull { session.getRoom(it.childRoomId)?.roomSummary()?.takeIf { summary -> summary.membership.isActive() && summary.roomId != myTimelineId - }?.toCircleFilterListItem(isTimelineSelected(selectedIds, it.childRoomId)) + }?.toFilterTimelinesListItem(isTimelineSelected(selectedIds, it.childRoomId)) } - }.flowOn(Dispatchers.IO) + }.flowOn(Dispatchers.IO).asLiveData() suspend fun applyFilter() = createResult { session.getRoom(circleId)?.roomAccountDataService() @@ -56,6 +57,11 @@ class FilterTimelinesDataSource @Inject constructor( } } + fun selectAllTimelines() { + val ids = timelinesLiveData.value?.map { it.id }?.toSet() ?: emptySet() + selectedTimelinesIds.update { ids } + } + private fun isTimelineSelected(selectedIds: Set<String>, roomId: String): Boolean = if (selectedIds.isEmpty()) true else selectedIds.contains(roomId) diff --git a/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesDialogFragment.kt b/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesDialogFragment.kt index 6cb18bda06608510a2be8f4ee3d8f2219ef521ef..8c01da7d97c4644fd338395581b8f68d084fc617 100644 --- a/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesDialogFragment.kt +++ b/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesDialogFragment.kt @@ -4,12 +4,16 @@ import android.os.Bundle import android.view.View import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import androidx.recyclerview.widget.DividerItemDecoration import dagger.hilt.android.AndroidEntryPoint import org.futo.circles.core.R import org.futo.circles.core.base.fragment.BaseFullscreenDialogFragment import org.futo.circles.core.base.fragment.HasLoadingState import org.futo.circles.core.databinding.DialogFragmentFilterTimelineBinding import org.futo.circles.core.extensions.observeData +import org.futo.circles.core.extensions.observeResponse +import org.futo.circles.core.extensions.showSuccess +import org.futo.circles.core.feature.circles.filter.list.FilterTimelinesAdapter import org.futo.circles.core.mapping.nameOrId @@ -24,6 +28,12 @@ class FilterTimelinesDialogFragment : getBinding() as DialogFragmentFilterTimelineBinding } + private val filterTimelinesAdapter by lazy { + FilterTimelinesAdapter( + onItemSelected = { id -> viewModel.toggleItemSelected(id) } + ) + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setupViews() @@ -31,7 +41,17 @@ class FilterTimelinesDialogFragment : } private fun setupViews() { - + with(binding) { + btnSave.setOnClickListener { + startLoading(btnSave) + viewModel.saveFilter() + } + btnSelectAll.setOnClickListener { viewModel.selectAllItems() } + rvTimelines.apply { + addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL)) + adapter = filterTimelinesAdapter + } + } } private fun setupObservers() { @@ -41,6 +61,14 @@ class FilterTimelinesDialogFragment : getString(R.string.select_timelines_format, info.nameOrId()) } } + viewModel.timelinesLiveData.observeData(this) { + filterTimelinesAdapter.submitList(it) + } + viewModel.updateFilterResultLiveData.observeResponse(this, + success = { + showSuccess(getString(R.string.updated)) + dismiss() + }) } } \ No newline at end of file diff --git a/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesViewModel.kt b/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesViewModel.kt index c5c29b9ef1dd4bed6602498fe658bf026aed4c54..b1aefc52a6c37e00ad3dda26c913c70911172647 100644 --- a/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesViewModel.kt +++ b/core/src/main/java/org/futo/circles/core/feature/circles/filter/FilterTimelinesViewModel.kt @@ -27,4 +27,8 @@ class FilterTimelinesViewModel @Inject constructor( dataSource.toggleItemSelected(id) } + fun selectAllItems() { + dataSource.selectAllTimelines() + } + } \ No newline at end of file diff --git a/core/src/main/java/org/futo/circles/core/feature/circles/filter/list/FilterTimelinesAdapter.kt b/core/src/main/java/org/futo/circles/core/feature/circles/filter/list/FilterTimelinesAdapter.kt new file mode 100644 index 0000000000000000000000000000000000000000..ec3560d135bca6e413912c31452daa762bed28f2 --- /dev/null +++ b/core/src/main/java/org/futo/circles/core/feature/circles/filter/list/FilterTimelinesAdapter.kt @@ -0,0 +1,23 @@ +package org.futo.circles.core.feature.circles.filter.list + +import android.view.ViewGroup +import org.futo.circles.core.base.list.BaseRvAdapter +import org.futo.circles.core.model.FilterTimelinesListItem + +class FilterTimelinesAdapter( + private val onItemSelected: (String) -> Unit +) : BaseRvAdapter<FilterTimelinesListItem, FilterTimelinesViewHolder>(DefaultIdEntityCallback()) { + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): FilterTimelinesViewHolder = FilterTimelinesViewHolder( + parent = parent, + onItemClicked = { position -> onItemSelected(getItem(position).id) } + ) + + override fun onBindViewHolder(holder: FilterTimelinesViewHolder, position: Int) { + holder.bind(getItem(position)) + } + +} \ No newline at end of file diff --git a/core/src/main/java/org/futo/circles/core/model/CircleFilterListItem.kt b/core/src/main/java/org/futo/circles/core/model/FilterTimelinesListItem.kt similarity index 80% rename from core/src/main/java/org/futo/circles/core/model/CircleFilterListItem.kt rename to core/src/main/java/org/futo/circles/core/model/FilterTimelinesListItem.kt index 637ef8fa1bb688b16103abe5b8df306b295b04b1..ba5b0b24c0c263fe8141f4d1dfcc33d2a640d23a 100644 --- a/core/src/main/java/org/futo/circles/core/model/CircleFilterListItem.kt +++ b/core/src/main/java/org/futo/circles/core/model/FilterTimelinesListItem.kt @@ -5,7 +5,7 @@ import org.futo.circles.core.extensions.getRoomOwner import org.futo.circles.core.mapping.nameOrId import org.matrix.android.sdk.api.session.room.model.RoomSummary -data class CircleFilterListItem( +data class FilterTimelinesListItem( override val id: String, val name: String, val ownerName: String, @@ -13,7 +13,7 @@ data class CircleFilterListItem( val isSelected: Boolean ) : IdEntity<String> -fun RoomSummary.toCircleFilterListItem(isSelected: Boolean = true) = CircleFilterListItem( +fun RoomSummary.toFilterTimelinesListItem(isSelected: Boolean = true) = FilterTimelinesListItem( id = roomId, name = nameOrId(), ownerName = getRoomOwner(roomId)?.displayName ?: "", 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 deed8c8e1383b6d5d1c615f72be5ba0a43df0afa..0a24f4d0f77ab839b3a3e7693f822e19e9d3f5c7 100644 --- a/core/src/main/res/layout/dialog_fragment_filter_timeline.xml +++ b/core/src/main/res/layout/dialog_fragment_filter_timeline.xml @@ -58,7 +58,7 @@ <org.futo.circles.core.view.LoadingRecyclerView - android:id="@+id/rvUsers" + android:id="@+id/rvTimelines" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="8dp"