1
0
mirror of https://github.com/vector-im/riotX-android synced 2025-10-06 00:02:48 +02:00

RoomList: Extract PagedList from ViewState to ViewModel

This commit is contained in:
ganfra
2022-09-22 16:59:42 +02:00
parent 1a2b6bd0d4
commit 4bded2f0d8
3 changed files with 19 additions and 16 deletions

View File

@@ -157,15 +157,10 @@ class HomeRoomListFragment :
headersController.submitData(it)
}
roomListViewModel.onEach(HomeRoomListViewState::roomsLivePagedList, deliveryMode = UniqueOnly(UUID.randomUUID().toString())) { roomsListLive ->
this.roomsListLive?.removeObservers(viewLifecycleOwner)
this.roomsListLive = roomsListLive
roomsListLive?.observeForever { }
roomsListLive?.observe(viewLifecycleOwner) { roomsList ->
roomsController.submitList(roomsList)
if (roomsList.isEmpty()) {
roomsController.requestForcedModelBuild()
}
roomListViewModel.roomsLivePagedList.observe(viewLifecycleOwner) { roomsList ->
roomsController.submitList(roomsList)
if (roomsList.isEmpty()) {
roomsController.requestForcedModelBuild()
}
}

View File

@@ -17,6 +17,9 @@
package im.vector.app.features.home.room.list.home
import android.widget.ImageView
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import androidx.paging.PagedList
import arrow.core.Option
import arrow.core.toOption
@@ -93,6 +96,14 @@ class HomeRoomListViewModel @AssistedInject constructor(
.setPrefetchDistance(10)
.build()
private val roomListRelay = MutableLiveData<PagedList<RoomSummary>>()
// PagedList doesn't work well with State, so extract in a variable for now
val roomsLivePagedList: LiveData<PagedList<RoomSummary>> = roomListRelay
private val roomListRelayObserver = Observer<PagedList<RoomSummary>> {
roomListRelay.postValue(it)
}
private var currentFilter: HomeRoomFilter = HomeRoomFilter.ALL
private val _emptyStateFlow = MutableSharedFlow<Optional<StateView.State.Empty>>(replay = 1)
val emptyStateFlow = _emptyStateFlow.asSharedFlow()
@@ -220,6 +231,8 @@ class HomeRoomListViewModel @AssistedInject constructor(
}
private fun observeRooms() = viewModelScope.launch {
filteredPagedRoomSummariesLive?.livePagedList?.removeObserver(roomListRelayObserver)
val builder = RoomSummaryQueryParams.Builder().also {
it.memberships = listOf(Membership.JOIN)
}
@@ -230,7 +243,6 @@ class HomeRoomListViewModel @AssistedInject constructor(
} else {
RoomSortOrder.ACTIVITY
}
val liveResults = session.roomService().getFilteredPagedRoomSummariesLive(
params,
pagedListConfig,
@@ -246,7 +258,7 @@ class HomeRoomListViewModel @AssistedInject constructor(
}
.onEach { selectedSpaceOption ->
val selectedSpace = selectedSpaceOption.orNull()
liveResults.queryParams = liveResults.queryParams.copy(
filteredPagedRoomSummariesLive?.queryParams = liveResults.queryParams.copy(
spaceFilter = selectedSpace?.roomId.toActiveSpaceOrNoFilter()
)
emitEmptyState()
@@ -254,7 +266,7 @@ class HomeRoomListViewModel @AssistedInject constructor(
.also { roomsFlow = it }
.launchIn(viewModelScope)
setState { copy(roomsLivePagedList = liveResults.livePagedList) }
liveResults.livePagedList.observeForever(roomListRelayObserver)
}
private fun observeOrderPreferences() {

View File

@@ -16,15 +16,11 @@
package im.vector.app.features.home.room.list.home
import androidx.lifecycle.LiveData
import androidx.paging.PagedList
import com.airbnb.mvrx.MavericksState
import im.vector.app.core.platform.StateView
import im.vector.app.features.home.room.list.home.header.RoomsHeadersData
import org.matrix.android.sdk.api.session.room.model.RoomSummary
data class HomeRoomListViewState(
val state: StateView.State = StateView.State.Content,
val headersData: RoomsHeadersData = RoomsHeadersData(),
val roomsLivePagedList: LiveData<PagedList<RoomSummary>>? = null,
) : MavericksState