Merge pull request #7186 from vector-im/bugfix/eric/fixes-room-list-updates

Fixes Room List not getting updated when fragment is not in focus
This commit is contained in:
Benoit Marty 2022-09-21 12:14:20 +02:00 committed by GitHub
commit 52d7369ac3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 27 additions and 10 deletions

1
changelog.d/7186.bugfix Normal file
View File

@ -0,0 +1 @@
Fixes Room List not getting updated when fragment is not in focus

View File

@ -16,6 +16,7 @@
package im.vector.app.features.home.room.list.home package im.vector.app.features.home.room.list.home
import androidx.paging.PagedList
import com.airbnb.epoxy.EpoxyModel import com.airbnb.epoxy.EpoxyModel
import com.airbnb.epoxy.paging.PagedListEpoxyController import com.airbnb.epoxy.paging.PagedListEpoxyController
import im.vector.app.core.platform.StateView import im.vector.app.core.platform.StateView
@ -75,6 +76,13 @@ class HomeFilteredRoomsController @Inject constructor(
this.emptyStateData = state this.emptyStateData = state
} }
fun submitPagedList(newList: PagedList<RoomSummary>) {
submitList(newList)
if (newList.isEmpty()) {
requestForcedModelBuild()
}
}
override fun buildItemModel(currentPosition: Int, item: RoomSummary?): EpoxyModel<*> { override fun buildItemModel(currentPosition: Int, item: RoomSummary?): EpoxyModel<*> {
return if (item == null) { return if (item == null) {
val host = this val host = this

View File

@ -152,10 +152,10 @@ class HomeRoomListFragment :
headersController.submitData(it) headersController.submitData(it)
} }
roomListViewModel.onEach(HomeRoomListViewState::roomsLivePagedList) { roomsListLive -> roomListViewModel.onEach(HomeRoomListViewState::roomsPagedList) { roomsList ->
roomsListLive?.observe(viewLifecycleOwner) { roomsList -> roomsList?.let {
roomsController.submitList(roomsList) roomsController.submitPagedList(it)
if (roomsList.isEmpty()) { if (it.isEmpty()) {
roomsController.requestForcedModelBuild() roomsController.requestForcedModelBuild()
} }
} }

View File

@ -17,8 +17,8 @@
package im.vector.app.features.home.room.list.home package im.vector.app.features.home.room.list.home
import android.widget.ImageView import android.widget.ImageView
import androidx.lifecycle.asFlow
import androidx.paging.PagedList import androidx.paging.PagedList
import arrow.core.Option
import arrow.core.toOption import arrow.core.toOption
import com.airbnb.mvrx.MavericksViewModelFactory import com.airbnb.mvrx.MavericksViewModelFactory
import dagger.assisted.Assisted import dagger.assisted.Assisted
@ -35,6 +35,7 @@ import im.vector.app.core.resources.StringProvider
import im.vector.app.features.displayname.getBestName import im.vector.app.features.displayname.getBestName
import im.vector.app.features.home.room.list.home.header.HomeRoomFilter import im.vector.app.features.home.room.list.home.header.HomeRoomFilter
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asSharedFlow
@ -68,6 +69,7 @@ import org.matrix.android.sdk.api.session.room.state.isPublic
import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.api.util.Optional
import org.matrix.android.sdk.api.util.toMatrixItem import org.matrix.android.sdk.api.util.toMatrixItem
import org.matrix.android.sdk.flow.flow import org.matrix.android.sdk.flow.flow
import java.util.concurrent.CancellationException
class HomeRoomListViewModel @AssistedInject constructor( class HomeRoomListViewModel @AssistedInject constructor(
@Assisted initialState: HomeRoomListViewState, @Assisted initialState: HomeRoomListViewState,
@ -85,7 +87,6 @@ class HomeRoomListViewModel @AssistedInject constructor(
companion object : MavericksViewModelFactory<HomeRoomListViewModel, HomeRoomListViewState> by hiltMavericksViewModelFactory() companion object : MavericksViewModelFactory<HomeRoomListViewModel, HomeRoomListViewState> by hiltMavericksViewModelFactory()
private var roomsFlow: Flow<Option<RoomSummary>>? = null
private val pagedListConfig = PagedList.Config.Builder() private val pagedListConfig = PagedList.Config.Builder()
.setPageSize(10) .setPageSize(10)
.setInitialLoadSizeHint(20) .setInitialLoadSizeHint(20)
@ -97,6 +98,8 @@ class HomeRoomListViewModel @AssistedInject constructor(
private val _emptyStateFlow = MutableSharedFlow<Optional<StateView.State.Empty>>(replay = 1) private val _emptyStateFlow = MutableSharedFlow<Optional<StateView.State.Empty>>(replay = 1)
val emptyStateFlow = _emptyStateFlow.asSharedFlow() val emptyStateFlow = _emptyStateFlow.asSharedFlow()
private var roomsFlowJob: Job? = null
private var filteredPagedRoomSummariesLive: UpdatableLivePageResult? = null private var filteredPagedRoomSummariesLive: UpdatableLivePageResult? = null
init { init {
@ -251,10 +254,16 @@ class HomeRoomListViewModel @AssistedInject constructor(
) )
emitEmptyState() emitEmptyState()
} }
.also { roomsFlow = it }
.launchIn(viewModelScope) .launchIn(viewModelScope)
setState { copy(roomsLivePagedList = liveResults.livePagedList) } roomsFlowJob?.cancel(CancellationException())
roomsFlowJob = liveResults.livePagedList
.asFlow()
.onEach {
setState { copy(roomsPagedList = it) }
}
.launchIn(viewModelScope)
} }
private fun observeOrderPreferences() { private fun observeOrderPreferences() {

View File

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