Skip to content
Snippets Groups Projects
Commit 6e74ea39 authored by Taras's avatar Taras
Browse files

Create adapter

parent a7135c85
No related branches found
No related tags found
No related merge requests found
......@@ -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)
......
......@@ -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
......@@ -27,4 +27,8 @@ class FilterTimelinesViewModel @Inject constructor(
dataSource.toggleItemSelected(id)
}
fun selectAllItems() {
dataSource.selectAllTimelines()
}
}
\ No newline at end of file
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
......@@ -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 ?: "",
......
......@@ -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"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment