diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/HomeDetailViewModel.kt b/vector/src/main/java/im/vector/riotredesign/features/home/HomeDetailViewModel.kt index 5d246922..8b6b7734 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/HomeDetailViewModel.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/HomeDetailViewModel.kt @@ -18,21 +18,22 @@ package im.vector.riotredesign.features.home import com.airbnb.mvrx.MvRxViewModelFactory import com.airbnb.mvrx.ViewModelContext -import im.vector.matrix.android.api.session.Session -import im.vector.matrix.rx.rx import im.vector.riotredesign.core.platform.VectorViewModel import org.koin.android.ext.android.get +/** + * View model used to update the home bottom bar notification counts + */ class HomeDetailViewModel(initialState: HomeDetailViewState, - private val session: Session) + private val homeRoomListStore: HomeRoomListObservableStore) : VectorViewModel(initialState) { companion object : MvRxViewModelFactory { @JvmStatic override fun create(viewModelContext: ViewModelContext, state: HomeDetailViewState): HomeDetailViewModel? { - val currentSession = viewModelContext.activity.get() - return HomeDetailViewModel(state, currentSession) + val homeRoomListStore = viewModelContext.activity.get() + return HomeDetailViewModel(state, homeRoomListStore) } } @@ -42,13 +43,11 @@ class HomeDetailViewModel(initialState: HomeDetailViewState, // PRIVATE METHODS ***************************************************************************** - // TODO Filter with selected group private fun observeRoomSummaries() { - session - .rx() - .liveRoomSummaries() - .execute { state -> - state.invoke()?.let { summaries -> + homeRoomListStore + .observe() + .subscribe { list -> + list.let { summaries -> val peopleNotifications = summaries .filter { it.isDirect } .map { it.notificationCount } @@ -65,19 +64,19 @@ class HomeDetailViewModel(initialState: HomeDetailViewState, .filter { !it.isDirect } .any { it.highlightCount > 0 } - copy( - notificationCountCatchup = peopleNotifications + roomsNotifications, - notificationHighlightCatchup = peopleHasHighlight || roomsHasHighlight, - notificationCountPeople = peopleNotifications, - notificationHighlightPeople = peopleHasHighlight, - notificationCountRooms = roomsNotifications, - notificationHighlightRooms = roomsHasHighlight - ) - } ?: run { - // No change - copy() + setState { + copy( + notificationCountCatchup = peopleNotifications + roomsNotifications, + notificationHighlightCatchup = peopleHasHighlight || roomsHasHighlight, + notificationCountPeople = peopleNotifications, + notificationHighlightPeople = peopleHasHighlight, + notificationCountRooms = roomsNotifications, + notificationHighlightRooms = roomsHasHighlight + ) + } } } + .disposeOnClear() } } \ No newline at end of file diff --git a/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/RoomDirectoryViewModel.kt b/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/RoomDirectoryViewModel.kt index 6f04f786..fa980b20 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/RoomDirectoryViewModel.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/RoomDirectoryViewModel.kt @@ -82,22 +82,25 @@ class RoomDirectoryViewModel(initialState: PublicRoomsViewState, session .rx() .liveRoomSummaries() - .execute { async -> - val joinedRoomIds = async.invoke() + .subscribe { list -> + val joinedRoomIds = list // Keep only joined room ?.filter { it.membership == Membership.JOIN } ?.map { it.roomId } ?.toList() ?: emptyList() - copy( - joinedRoomsIds = joinedRoomIds, - // Remove (newly) joined room id from the joining room list - joiningRoomsIds = joiningRoomsIds.toMutableList().apply { removeAll(joinedRoomIds) }, - // Remove (newly) joined room id from the joining room list in error - joiningErrorRoomsIds = joiningErrorRoomsIds.toMutableList().apply { removeAll(joinedRoomIds) } - ) + setState { + copy( + joinedRoomsIds = joinedRoomIds, + // Remove (newly) joined room id from the joining room list + joiningRoomsIds = joiningRoomsIds.toMutableList().apply { removeAll(joinedRoomIds) }, + // Remove (newly) joined room id from the joining room list in error + joiningErrorRoomsIds = joiningErrorRoomsIds.toMutableList().apply { removeAll(joinedRoomIds) } + ) + } } + .disposeOnClear() } fun setRoomDirectoryData(roomDirectoryData: RoomDirectoryData) { diff --git a/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/roompreview/RoomPreviewViewModel.kt b/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/roompreview/RoomPreviewViewModel.kt index e3e0c019..18ced521 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/roompreview/RoomPreviewViewModel.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/roompreview/RoomPreviewViewModel.kt @@ -49,23 +49,25 @@ class RoomPreviewViewModel(initialState: RoomPreviewViewState, session .rx() .liveRoomSummaries() - .execute { async -> - val isRoomJoined = async.invoke() - // Keep only joined room - ?.filter { it.membership == Membership.JOIN } - ?.map { it.roomId } - ?.toList() - ?.contains(roomId) == true + .subscribe { list -> + withState { state -> + val isRoomJoined = list + // Keep only joined room + ?.filter { it.membership == Membership.JOIN } + ?.map { it.roomId } + ?.toList() + ?.contains(state.roomId) == true - if (isRoomJoined) { - copy( - roomJoinState = JoinState.JOINED - ) - } else { - // TODO No change... - copy() + if (isRoomJoined) { + setState { + copy( + roomJoinState = JoinState.JOINED + ) + } + } } } + .disposeOnClear() } // TODO I should not have to do that @@ -88,7 +90,7 @@ class RoomPreviewViewModel(initialState: RoomPreviewViewState, copy( roomJoinState = JoinState.JOINING, lastError = null - ) + ) } session.joinRoom(state.roomId, object : MatrixCallback {