17
17
package im.vector.app.features.home.room.list.home
18
18
19
19
import android.widget.ImageView
20
- import androidx.lifecycle.asFlow
20
+ import androidx.lifecycle.LiveData
21
+ import androidx.lifecycle.MutableLiveData
22
+ import androidx.lifecycle.Observer
21
23
import androidx.paging.PagedList
24
+ import arrow.core.Option
22
25
import arrow.core.toOption
23
26
import com.airbnb.mvrx.MavericksViewModelFactory
24
27
import dagger.assisted.Assisted
@@ -35,7 +38,6 @@ import im.vector.app.core.resources.StringProvider
35
38
import im.vector.app.features.displayname.getBestName
36
39
import im.vector.app.features.home.room.list.home.header.HomeRoomFilter
37
40
import kotlinx.coroutines.Dispatchers
38
- import kotlinx.coroutines.Job
39
41
import kotlinx.coroutines.flow.Flow
40
42
import kotlinx.coroutines.flow.MutableSharedFlow
41
43
import kotlinx.coroutines.flow.asSharedFlow
@@ -69,7 +71,6 @@ import org.matrix.android.sdk.api.session.room.state.isPublic
69
71
import org.matrix.android.sdk.api.util.Optional
70
72
import org.matrix.android.sdk.api.util.toMatrixItem
71
73
import org.matrix.android.sdk.flow.flow
72
- import java.util.concurrent.CancellationException
73
74
74
75
class HomeRoomListViewModel @AssistedInject constructor(
75
76
@Assisted initialState : HomeRoomListViewState ,
@@ -87,19 +88,24 @@ class HomeRoomListViewModel @AssistedInject constructor(
87
88
88
89
companion object : MavericksViewModelFactory <HomeRoomListViewModel , HomeRoomListViewState > by hiltMavericksViewModelFactory()
89
90
91
+ private var roomsFlow: Flow <Option <RoomSummary >>? = null
90
92
private val pagedListConfig = PagedList .Config .Builder ()
91
93
.setPageSize(10 )
92
94
.setInitialLoadSizeHint(20 )
93
95
.setEnablePlaceholders(true )
94
- .setPrefetchDistance(10 )
95
96
.build()
96
97
98
+ private val _roomsLivePagedList = MutableLiveData <PagedList <RoomSummary >>()
99
+ val roomsLivePagedList: LiveData <PagedList <RoomSummary >> = _roomsLivePagedList
100
+
101
+ private val internalPagedListObserver = Observer <PagedList <RoomSummary >> {
102
+ _roomsLivePagedList .postValue(it)
103
+ }
104
+
97
105
private var currentFilter: HomeRoomFilter = HomeRoomFilter .ALL
98
106
private val _emptyStateFlow = MutableSharedFlow <Optional <StateView .State .Empty >>(replay = 1 )
99
107
val emptyStateFlow = _emptyStateFlow .asSharedFlow()
100
108
101
- private var roomsFlowJob: Job ? = null
102
-
103
109
private var filteredPagedRoomSummariesLive: UpdatableLivePageResult ? = null
104
110
105
111
init {
@@ -223,6 +229,8 @@ class HomeRoomListViewModel @AssistedInject constructor(
223
229
}
224
230
225
231
private fun observeRooms () = viewModelScope.launch {
232
+ filteredPagedRoomSummariesLive?.livePagedList?.removeObserver(internalPagedListObserver)
233
+
226
234
val builder = RoomSummaryQueryParams .Builder ().also {
227
235
it.memberships = listOf (Membership .JOIN )
228
236
}
@@ -233,7 +241,6 @@ class HomeRoomListViewModel @AssistedInject constructor(
233
241
} else {
234
242
RoomSortOrder .ACTIVITY
235
243
}
236
-
237
244
val liveResults = session.roomService().getFilteredPagedRoomSummariesLive(
238
245
params,
239
246
pagedListConfig,
@@ -249,21 +256,15 @@ class HomeRoomListViewModel @AssistedInject constructor(
249
256
}
250
257
.onEach { selectedSpaceOption ->
251
258
val selectedSpace = selectedSpaceOption.orNull()
252
- liveResults .queryParams = liveResults.queryParams.copy(
259
+ filteredPagedRoomSummariesLive? .queryParams = liveResults.queryParams.copy(
253
260
spaceFilter = selectedSpace?.roomId.toActiveSpaceOrNoFilter()
254
261
)
255
262
emitEmptyState()
256
263
}
264
+ .also { roomsFlow = it }
257
265
.launchIn(viewModelScope)
258
266
259
- roomsFlowJob?.cancel(CancellationException ())
260
-
261
- roomsFlowJob = liveResults.livePagedList
262
- .asFlow()
263
- .onEach {
264
- setState { copy(roomsPagedList = it) }
265
- }
266
- .launchIn(viewModelScope)
267
+ liveResults.livePagedList.observeForever(internalPagedListObserver)
267
268
}
268
269
269
270
private fun observeOrderPreferences () {
@@ -344,6 +345,11 @@ class HomeRoomListViewModel @AssistedInject constructor(
344
345
}
345
346
}
346
347
348
+ override fun onCleared () {
349
+ super .onCleared()
350
+ filteredPagedRoomSummariesLive?.livePagedList?.removeObserver(internalPagedListObserver)
351
+ }
352
+
347
353
private fun handleChangeRoomFilter (newFilter : HomeRoomFilter ) {
348
354
if (currentFilter == newFilter) {
349
355
return
0 commit comments