From 5c78991ae1f864d9b1cc24772a12ca8961822850 Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 19 Feb 2019 11:16:31 +0100 Subject: [PATCH] Rx : hides subject inside a class --- .../vector/riotredesign/core/utils/RxStore.kt | 37 +++++++++++++++++++ .../riotredesign/features/home/HomeModule.kt | 8 ++-- .../features/home/group/GroupListViewModel.kt | 8 ++-- ...edGroupHolder.kt => SelectedGroupStore.kt} | 19 +--------- ...sibleRoomHolder.kt => VisibleRoomStore.kt} | 19 +--------- .../home/room/detail/RoomDetailViewModel.kt | 8 ++-- .../home/room/list/RoomListViewModel.kt | 19 +++++----- 7 files changed, 64 insertions(+), 54 deletions(-) create mode 100644 app/src/main/java/im/vector/riotredesign/core/utils/RxStore.kt rename app/src/main/java/im/vector/riotredesign/features/home/group/{SelectedGroupHolder.kt => SelectedGroupStore.kt} (60%) rename app/src/main/java/im/vector/riotredesign/features/home/room/{VisibleRoomHolder.kt => VisibleRoomStore.kt} (61%) diff --git a/app/src/main/java/im/vector/riotredesign/core/utils/RxStore.kt b/app/src/main/java/im/vector/riotredesign/core/utils/RxStore.kt new file mode 100644 index 0000000000..cbf96a3241 --- /dev/null +++ b/app/src/main/java/im/vector/riotredesign/core/utils/RxStore.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotredesign.core.utils + +import com.jakewharton.rxrelay2.BehaviorRelay +import io.reactivex.Observable + +open class RxStore(defaultValue: T? = null) { + + private val storeSubject: BehaviorRelay = if (defaultValue == null) { + BehaviorRelay.create() + } else { + BehaviorRelay.createDefault(defaultValue) + } + + fun observe(): Observable { + return storeSubject.hide().distinctUntilChanged() + } + + fun post(value: T) { + storeSubject.accept(value) + } +} diff --git a/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt b/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt index 3b3bd51df5..b63f7142f2 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt @@ -16,8 +16,8 @@ package im.vector.riotredesign.features.home -import im.vector.riotredesign.features.home.group.SelectedGroupHolder -import im.vector.riotredesign.features.home.room.VisibleRoomHolder +import im.vector.riotredesign.features.home.group.SelectedGroupStore +import im.vector.riotredesign.features.home.room.VisibleRoomStore import im.vector.riotredesign.features.home.room.detail.timeline.DefaultItemFactory import im.vector.riotredesign.features.home.room.detail.timeline.MessageItemFactory import im.vector.riotredesign.features.home.room.detail.timeline.RoomMemberItemFactory @@ -80,11 +80,11 @@ class HomeModule { } single { - SelectedGroupHolder() + SelectedGroupStore() } single { - VisibleRoomHolder() + VisibleRoomStore() } single { diff --git a/app/src/main/java/im/vector/riotredesign/features/home/group/GroupListViewModel.kt b/app/src/main/java/im/vector/riotredesign/features/home/group/GroupListViewModel.kt index 07e9b4ef76..f35c46fc10 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/group/GroupListViewModel.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/group/GroupListViewModel.kt @@ -16,6 +16,7 @@ package im.vector.riotredesign.features.home.group +import arrow.core.Option import com.airbnb.mvrx.MvRxViewModelFactory import com.airbnb.mvrx.ViewModelContext import im.vector.matrix.android.api.Matrix @@ -25,7 +26,7 @@ import im.vector.riotredesign.core.platform.RiotViewModel import org.koin.android.ext.android.get class GroupListViewModel(initialState: GroupListViewState, - private val selectedGroupHolder: SelectedGroupHolder, + private val selectedGroupHolder: SelectedGroupStore, private val session: Session ) : RiotViewModel(initialState) { @@ -34,7 +35,7 @@ class GroupListViewModel(initialState: GroupListViewState, @JvmStatic override fun create(viewModelContext: ViewModelContext, state: GroupListViewState): GroupListViewModel? { val currentSession = Matrix.getInstance().currentSession - val selectedGroupHolder = viewModelContext.activity.get() + val selectedGroupHolder = viewModelContext.activity.get() return GroupListViewModel(state, selectedGroupHolder, currentSession) } } @@ -46,7 +47,8 @@ class GroupListViewModel(initialState: GroupListViewState, private fun observeState() { subscribe { - selectedGroupHolder.setSelectedGroup(it.selectedGroup) + val selectedGroup = Option.fromNullable(it.selectedGroup) + selectedGroupHolder.post(selectedGroup) } } diff --git a/app/src/main/java/im/vector/riotredesign/features/home/group/SelectedGroupHolder.kt b/app/src/main/java/im/vector/riotredesign/features/home/group/SelectedGroupStore.kt similarity index 60% rename from app/src/main/java/im/vector/riotredesign/features/home/group/SelectedGroupHolder.kt rename to app/src/main/java/im/vector/riotredesign/features/home/group/SelectedGroupStore.kt index 78af1e77ef..5ee3cc4b1c 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/group/SelectedGroupHolder.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/group/SelectedGroupStore.kt @@ -17,22 +17,7 @@ package im.vector.riotredesign.features.home.group import arrow.core.Option -import com.jakewharton.rxrelay2.BehaviorRelay import im.vector.matrix.android.api.session.group.model.GroupSummary -import io.reactivex.Observable +import im.vector.riotredesign.core.utils.RxStore -class SelectedGroupHolder { - - private val selectedGroupStream = BehaviorRelay.createDefault>(Option.empty()) - - fun setSelectedGroup(group: GroupSummary?) { - val optionValue = Option.fromNullable(group) - selectedGroupStream.accept(optionValue) - } - - fun selectedGroup(): Observable> { - return selectedGroupStream.hide() - } - - -} \ No newline at end of file +class SelectedGroupStore : RxStore>(Option.empty()) diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/VisibleRoomHolder.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/VisibleRoomStore.kt similarity index 61% rename from app/src/main/java/im/vector/riotredesign/features/home/room/VisibleRoomHolder.kt rename to app/src/main/java/im/vector/riotredesign/features/home/room/VisibleRoomStore.kt index 0ef1df4712..6b2d60f69f 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/VisibleRoomHolder.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/VisibleRoomStore.kt @@ -16,21 +16,6 @@ package im.vector.riotredesign.features.home.room -import com.jakewharton.rxrelay2.BehaviorRelay -import io.reactivex.Observable -import io.reactivex.subjects.BehaviorSubject +import im.vector.riotredesign.core.utils.RxStore -class VisibleRoomHolder { - - private val visibleRoomStream = BehaviorRelay.create() - - fun setVisibleRoom(roomId: String) { - visibleRoomStream.accept(roomId) - } - - fun visibleRoom(): Observable { - return visibleRoomStream.hide() - } - - -} \ No newline at end of file +class VisibleRoomStore : RxStore() diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewModel.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewModel.kt index 3d1d4cf104..3ce30c0e59 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewModel.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewModel.kt @@ -26,14 +26,14 @@ import im.vector.matrix.android.api.session.events.model.Event import im.vector.matrix.rx.rx import im.vector.riotredesign.core.extensions.lastMinBy import im.vector.riotredesign.core.platform.RiotViewModel -import im.vector.riotredesign.features.home.room.VisibleRoomHolder +import im.vector.riotredesign.features.home.room.VisibleRoomStore import io.reactivex.rxkotlin.subscribeBy import org.koin.android.ext.android.get import java.util.concurrent.TimeUnit class RoomDetailViewModel(initialState: RoomDetailViewState, private val session: Session, - private val visibleRoomHolder: VisibleRoomHolder + private val visibleRoomHolder: VisibleRoomStore ) : RiotViewModel(initialState) { private val room = session.getRoom(initialState.roomId)!! @@ -47,7 +47,7 @@ class RoomDetailViewModel(initialState: RoomDetailViewState, @JvmStatic override fun create(viewModelContext: ViewModelContext, state: RoomDetailViewState): RoomDetailViewModel? { val currentSession = Matrix.getInstance().currentSession - val visibleRoomHolder = viewModelContext.activity.get() + val visibleRoomHolder = viewModelContext.activity.get() return RoomDetailViewModel(state, currentSession, visibleRoomHolder) } } @@ -78,7 +78,7 @@ class RoomDetailViewModel(initialState: RoomDetailViewState, } private fun handleIsDisplayed() { - visibleRoomHolder.setVisibleRoom(roomId) + visibleRoomHolder.post(roomId) } private fun observeDisplayedEvents() { diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListViewModel.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListViewModel.kt index 68d41bae82..0612016c06 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListViewModel.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListViewModel.kt @@ -27,8 +27,8 @@ import im.vector.matrix.android.api.session.room.model.RoomSummary import im.vector.matrix.android.api.session.room.model.tag.RoomTag import im.vector.matrix.rx.rx import im.vector.riotredesign.core.platform.RiotViewModel -import im.vector.riotredesign.features.home.group.SelectedGroupHolder -import im.vector.riotredesign.features.home.room.VisibleRoomHolder +import im.vector.riotredesign.features.home.group.SelectedGroupStore +import im.vector.riotredesign.features.home.room.VisibleRoomStore import io.reactivex.Observable import io.reactivex.functions.Function3 import io.reactivex.rxkotlin.subscribeBy @@ -39,8 +39,8 @@ typealias RoomListFilterName = CharSequence class RoomListViewModel(initialState: RoomListViewState, private val session: Session, - private val selectedGroupHolder: SelectedGroupHolder, - private val visibleRoomHolder: VisibleRoomHolder, + private val selectedGroupHolder: SelectedGroupStore, + private val visibleRoomHolder: VisibleRoomStore, private val roomSelectionRepository: RoomSelectionRepository, private val roomSummaryComparator: RoomSummaryComparator) : RiotViewModel(initialState) { @@ -51,8 +51,8 @@ class RoomListViewModel(initialState: RoomListViewState, override fun create(viewModelContext: ViewModelContext, state: RoomListViewState): RoomListViewModel? { val currentSession = Matrix.getInstance().currentSession val roomSelectionRepository = viewModelContext.activity.get() - val selectedGroupHolder = viewModelContext.activity.get() - val visibleRoomHolder = viewModelContext.activity.get() + val selectedGroupHolder = viewModelContext.activity.get() + val visibleRoomHolder = viewModelContext.activity.get() val roomSummaryComparator = viewModelContext.activity.get() return RoomListViewModel(state, currentSession, selectedGroupHolder, visibleRoomHolder, roomSelectionRepository, roomSummaryComparator) } @@ -87,17 +87,18 @@ class RoomListViewModel(initialState: RoomListViewState, } private fun observeVisibleRoom() { - visibleRoomHolder.visibleRoom() - .subscribeBy { + visibleRoomHolder.observe() + .doOnNext { setState { copy(selectedRoomId = it) } } + .subscribe() .disposeOnClear() } private fun observeRoomSummaries() { Observable.combineLatest, Option, Option, RoomSummaries>( session.rx().liveRoomSummaries().throttleLast(300, TimeUnit.MILLISECONDS), - selectedGroupHolder.selectedGroup(), + selectedGroupHolder.observe(), roomListFilter.throttleLast(300, TimeUnit.MILLISECONDS), Function3 { rooms, selectedGroupOption, filterRoomOption -> val filteredRooms = filterRooms(rooms, filterRoomOption)