From fe1e74fa06b7814a50fa1d99d39e8e3f60e0707c Mon Sep 17 00:00:00 2001 From: ericdecanini Date: Tue, 20 Sep 2022 18:22:39 -0400 Subject: [PATCH 1/5] Fixes room list not getting updated when not in focus --- .../home/room/list/home/HomeRoomListFragment.kt | 8 ++++---- .../home/room/list/home/HomeRoomListViewModel.kt | 10 +++++++++- .../home/room/list/home/HomeRoomListViewState.kt | 3 +-- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt index 829634259a..a0bd2d670a 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt @@ -152,10 +152,10 @@ class HomeRoomListFragment : headersController.submitData(it) } - roomListViewModel.onEach(HomeRoomListViewState::roomsLivePagedList) { roomsListLive -> - roomsListLive?.observe(viewLifecycleOwner) { roomsList -> - roomsController.submitList(roomsList) - if (roomsList.isEmpty()) { + roomListViewModel.onEach(HomeRoomListViewState::roomsLivePagedList) { roomsList -> + roomsList?.let { + roomsController.submitList(it) + if (it.isEmpty()) { roomsController.requestForcedModelBuild() } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt index 35b2f02917..93856abd30 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt @@ -17,6 +17,7 @@ package im.vector.app.features.home.room.list.home import android.widget.ImageView +import androidx.lifecycle.asFlow import androidx.paging.PagedList import arrow.core.Option import arrow.core.toOption @@ -43,6 +44,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach @@ -254,7 +256,13 @@ class HomeRoomListViewModel @AssistedInject constructor( .also { roomsFlow = it } .launchIn(viewModelScope) - setState { copy(roomsLivePagedList = liveResults.livePagedList) } + liveResults.livePagedList + .asFlow() + .onEach { + setState { copy(roomsLivePagedList = it) } + } + .flowOn(Dispatchers.Default) + .launchIn(viewModelScope) } private fun observeOrderPreferences() { diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt index 95625bc4b9..7b7719981f 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt @@ -16,7 +16,6 @@ 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 @@ -26,5 +25,5 @@ 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>? = null, + val roomsLivePagedList: PagedList? = null, ) : MavericksState From 1a93bbf92fb0b6c7872db7f2fb9024b6c21290c5 Mon Sep 17 00:00:00 2001 From: ericdecanini Date: Tue, 20 Sep 2022 18:32:59 -0400 Subject: [PATCH 2/5] Renames roomsPagedList --- .../app/features/home/room/list/home/HomeRoomListFragment.kt | 2 +- .../app/features/home/room/list/home/HomeRoomListViewModel.kt | 2 +- .../app/features/home/room/list/home/HomeRoomListViewState.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt index a0bd2d670a..4d61057b59 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt @@ -152,7 +152,7 @@ class HomeRoomListFragment : headersController.submitData(it) } - roomListViewModel.onEach(HomeRoomListViewState::roomsLivePagedList) { roomsList -> + roomListViewModel.onEach(HomeRoomListViewState::roomsPagedList) { roomsList -> roomsList?.let { roomsController.submitList(it) if (it.isEmpty()) { diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt index 93856abd30..4bc5d8ba95 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt @@ -259,7 +259,7 @@ class HomeRoomListViewModel @AssistedInject constructor( liveResults.livePagedList .asFlow() .onEach { - setState { copy(roomsLivePagedList = it) } + setState { copy(roomsPagedList = it) } } .flowOn(Dispatchers.Default) .launchIn(viewModelScope) diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt index 7b7719981f..db3a57e63e 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt @@ -25,5 +25,5 @@ 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: PagedList? = null, + val roomsPagedList: PagedList? = null, ) : MavericksState From 821636bcb23f2498e4f149add1bf803dae7c029c Mon Sep 17 00:00:00 2001 From: ericdecanini Date: Tue, 20 Sep 2022 18:36:25 -0400 Subject: [PATCH 3/5] Adds changelog file --- changelog.d/7186.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/7186.bugfix diff --git a/changelog.d/7186.bugfix b/changelog.d/7186.bugfix new file mode 100644 index 0000000000..418dbbda9f --- /dev/null +++ b/changelog.d/7186.bugfix @@ -0,0 +1 @@ +Fixes Room List not getting updated when fragment is not in focus From 602b378b65652334641fe81182cd577143275a15 Mon Sep 17 00:00:00 2001 From: NIkita Fedrunov Date: Wed, 21 Sep 2022 10:43:08 +0200 Subject: [PATCH 4/5] cancel flow when order is changed --- .../home/room/list/home/HomeRoomListViewModel.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt index 4bc5d8ba95..18ab57dce9 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt @@ -36,6 +36,8 @@ import im.vector.app.core.resources.StringProvider import im.vector.app.features.displayname.getBestName import im.vector.app.features.home.room.list.home.header.HomeRoomFilter import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow @@ -70,6 +72,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.toMatrixItem import org.matrix.android.sdk.flow.flow +import java.util.concurrent.CancellationException class HomeRoomListViewModel @AssistedInject constructor( @Assisted initialState: HomeRoomListViewState, @@ -99,6 +102,8 @@ class HomeRoomListViewModel @AssistedInject constructor( private val _emptyStateFlow = MutableSharedFlow>(replay = 1) val emptyStateFlow = _emptyStateFlow.asSharedFlow() + private var roomsFlowJob: Job? = null + private var filteredPagedRoomSummariesLive: UpdatableLivePageResult? = null init { @@ -256,7 +261,9 @@ class HomeRoomListViewModel @AssistedInject constructor( .also { roomsFlow = it } .launchIn(viewModelScope) - liveResults.livePagedList + roomsFlowJob?.cancel(CancellationException()) + + roomsFlowJob = liveResults.livePagedList .asFlow() .onEach { setState { copy(roomsPagedList = it) } From d8060a7922ca65a94a56f631009713c57d418f38 Mon Sep 17 00:00:00 2001 From: NIkita Fedrunov Date: Wed, 21 Sep 2022 11:28:21 +0200 Subject: [PATCH 5/5] review fixes --- .../home/room/list/home/HomeFilteredRoomsController.kt | 8 ++++++++ .../features/home/room/list/home/HomeRoomListFragment.kt | 2 +- .../features/home/room/list/home/HomeRoomListViewModel.kt | 6 ------ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeFilteredRoomsController.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeFilteredRoomsController.kt index ebf322dc23..2b4a514750 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeFilteredRoomsController.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeFilteredRoomsController.kt @@ -16,6 +16,7 @@ package im.vector.app.features.home.room.list.home +import androidx.paging.PagedList import com.airbnb.epoxy.EpoxyModel import com.airbnb.epoxy.paging.PagedListEpoxyController import im.vector.app.core.platform.StateView @@ -75,6 +76,13 @@ class HomeFilteredRoomsController @Inject constructor( this.emptyStateData = state } + fun submitPagedList(newList: PagedList) { + submitList(newList) + if (newList.isEmpty()) { + requestForcedModelBuild() + } + } + override fun buildItemModel(currentPosition: Int, item: RoomSummary?): EpoxyModel<*> { return if (item == null) { val host = this diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt index 4d61057b59..9b8a686f37 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt @@ -154,7 +154,7 @@ class HomeRoomListFragment : roomListViewModel.onEach(HomeRoomListViewState::roomsPagedList) { roomsList -> roomsList?.let { - roomsController.submitList(it) + roomsController.submitPagedList(it) if (it.isEmpty()) { roomsController.requestForcedModelBuild() } diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt index 18ab57dce9..ad2656cec1 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt @@ -19,7 +19,6 @@ package im.vector.app.features.home.room.list.home import android.widget.ImageView import androidx.lifecycle.asFlow import androidx.paging.PagedList -import arrow.core.Option import arrow.core.toOption import com.airbnb.mvrx.MavericksViewModelFactory import dagger.assisted.Assisted @@ -37,7 +36,6 @@ import im.vector.app.features.displayname.getBestName import im.vector.app.features.home.room.list.home.header.HomeRoomFilter import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job -import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow @@ -46,7 +44,6 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach @@ -90,7 +87,6 @@ class HomeRoomListViewModel @AssistedInject constructor( companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() - private var roomsFlow: Flow>? = null private val pagedListConfig = PagedList.Config.Builder() .setPageSize(10) .setInitialLoadSizeHint(20) @@ -258,7 +254,6 @@ class HomeRoomListViewModel @AssistedInject constructor( ) emitEmptyState() } - .also { roomsFlow = it } .launchIn(viewModelScope) roomsFlowJob?.cancel(CancellationException()) @@ -268,7 +263,6 @@ class HomeRoomListViewModel @AssistedInject constructor( .onEach { setState { copy(roomsPagedList = it) } } - .flowOn(Dispatchers.Default) .launchIn(viewModelScope) }