From c4e03c59a0c85fcb47846b3af0f96c0f535ba4e6 Mon Sep 17 00:00:00 2001 From: valere Date: Mon, 30 Jan 2023 09:45:03 +0100 Subject: [PATCH] refactor home room list --- .../session/room/UpdatableLivePageResult.kt | 1 + .../room/summary/RoomSummaryDataSource.kt | 10 ++- .../room/list/home/HomeRoomListFragment.kt | 2 +- .../room/list/home/HomeRoomListViewModel.kt | 73 ++++++------------- 4 files changed, 35 insertions(+), 51 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/UpdatableLivePageResult.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/UpdatableLivePageResult.kt index db87f913b9..f0a5dfd2d7 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/UpdatableLivePageResult.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/UpdatableLivePageResult.kt @@ -24,6 +24,7 @@ interface UpdatableLivePageResult { val livePagedList: LiveData> val liveBoundaries: LiveData var queryParams: RoomSummaryQueryParams + var sortOrder: RoomSortOrder } data class ResultBoundaries( diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryDataSource.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryDataSource.kt index abba1a9f5a..d27fe72709 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryDataSource.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryDataSource.kt @@ -265,6 +265,7 @@ internal class RoomSummaryDataSource @Inject constructor( ) return object : UpdatableLivePageResult { + override val livePagedList: LiveData> = mapped override val liveBoundaries: LiveData @@ -274,7 +275,14 @@ internal class RoomSummaryDataSource @Inject constructor( set(value) { field = value realmDataSourceFactory.updateQuery { - roomSummariesQuery(it, value).process(sortOrder) + roomSummariesQuery(it, value).process(this.sortOrder) + } + } + override var sortOrder: RoomSortOrder = sortOrder + set(value) { + field = value + realmDataSourceFactory.updateQuery { + roomSummariesQuery(it, this.queryParams).process(value) } } } 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 d8c71e3e17..9cbfaedf93 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 @@ -151,7 +151,7 @@ class HomeRoomListFragment : roomListViewModel.onEach(HomeRoomListViewState::headersData) { headersController.submitData(it) } - roomListViewModel.roomsLivePagedList.observe(viewLifecycleOwner) { roomsList -> + roomListViewModel.filteredPagedRoomSummariesLive.livePagedList.observe(viewLifecycleOwner) { roomsList -> roomsController.submitRoomsList(roomsList) } roomListViewModel.onEach(HomeRoomListViewState::emptyState) { emptyState -> 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 f358601399..5ce96646c6 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,9 +17,6 @@ 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 com.airbnb.mvrx.MavericksViewModelFactory import dagger.assisted.Assisted @@ -88,20 +85,26 @@ class HomeRoomListViewModel @AssistedInject constructor( companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() private val pagedListConfig = PagedList.Config.Builder() - .setPageSize(10) - .setInitialLoadSizeHint(20) + .setPageSize(30) + .setInitialLoadSizeHint(50) .setEnablePlaceholders(true) + .setPrefetchDistance(10) .build() - private val _roomsLivePagedList = MutableLiveData>() - val roomsLivePagedList: LiveData> = _roomsLivePagedList - - private val internalPagedListObserver = Observer> { - _roomsLivePagedList.postValue(it) + val filteredPagedRoomSummariesLive: UpdatableLivePageResult by lazy { + val builder = RoomSummaryQueryParams.Builder().also { + it.memberships = listOf(Membership.JOIN) + it.spaceFilter = spaceStateHandler.getCurrentSpace()?.roomId.toActiveSpaceOrNoFilter() + } + val params = getFilteredQueryParams(initialState.headersData.currentFilter, builder.build()) + val sortOrder = RoomSortOrder.ACTIVITY + session.roomService().getFilteredPagedRoomSummariesLive( + params, + pagedListConfig, + sortOrder + ) } - private var filteredPagedRoomSummariesLive: UpdatableLivePageResult? = null - init { observeOrderPreferences() observeInvites() @@ -119,11 +122,9 @@ class HomeRoomListViewModel @AssistedInject constructor( .onEach { selectedSpaceOption -> val selectedSpace = selectedSpaceOption.orNull() updateEmptyState() - filteredPagedRoomSummariesLive?.let { liveResults -> - liveResults.queryParams = liveResults.queryParams.copy( - spaceFilter = selectedSpace?.roomId.toActiveSpaceOrNoFilter() - ) - } + filteredPagedRoomSummariesLive.queryParams = filteredPagedRoomSummariesLive.queryParams.copy( + spaceFilter = selectedSpace?.roomId.toActiveSpaceOrNoFilter() + ) } .launchIn(viewModelScope) } @@ -239,33 +240,14 @@ class HomeRoomListViewModel @AssistedInject constructor( } } - private fun observeRooms(currentFilter: HomeRoomFilter, isAZOrdering: Boolean) { - filteredPagedRoomSummariesLive?.livePagedList?.removeObserver(internalPagedListObserver) - val builder = RoomSummaryQueryParams.Builder().also { - it.memberships = listOf(Membership.JOIN) - it.spaceFilter = spaceStateHandler.getCurrentSpace()?.roomId.toActiveSpaceOrNoFilter() - } - val params = getFilteredQueryParams(currentFilter, builder.build()) - val sortOrder = if (isAZOrdering) { - RoomSortOrder.NAME - } else { - RoomSortOrder.ACTIVITY - } - val liveResults = session.roomService().getFilteredPagedRoomSummariesLive( - params, - pagedListConfig, - sortOrder - ).also { - filteredPagedRoomSummariesLive = it - } - liveResults.livePagedList.observeForever(internalPagedListObserver) - } - private fun observeOrderPreferences() { preferencesStore.isAZOrderingEnabledFlow .onEach { isAZOrdering -> - val currentFilter = awaitState().headersData.currentFilter - observeRooms(currentFilter, isAZOrdering) + filteredPagedRoomSummariesLive.sortOrder = if (isAZOrdering) { + RoomSortOrder.NAME + } else { + RoomSortOrder.ACTIVITY + } }.launchIn(viewModelScope) } @@ -340,11 +322,6 @@ class HomeRoomListViewModel @AssistedInject constructor( } } - override fun onCleared() { - filteredPagedRoomSummariesLive?.livePagedList?.removeObserver(internalPagedListObserver) - super.onCleared() - } - private fun handleChangeRoomFilter(newFilter: HomeRoomFilter) { viewModelScope.launch { changeRoomFilter(newFilter) @@ -359,9 +336,7 @@ class HomeRoomListViewModel @AssistedInject constructor( setState { copy(headersData = headersData.copy(currentFilter = newFilter)) } updateEmptyState() analyticsTracker.updateUserProperties(UserProperties(allChatsActiveFilter = newFilter.toTrackingValue())) - filteredPagedRoomSummariesLive?.let { liveResults -> - liveResults.queryParams = getFilteredQueryParams(newFilter, liveResults.queryParams) - } + filteredPagedRoomSummariesLive.queryParams = getFilteredQueryParams(newFilter, filteredPagedRoomSummariesLive.queryParams) } fun isPublicRoom(roomId: String): Boolean {