Refactor duplicated code.
This commit is contained in:
parent
e2313ad1cd
commit
e87d4db72c
|
@ -24,10 +24,7 @@ import dagger.assisted.AssistedInject
|
||||||
import im.vector.app.core.di.ActiveSessionHolder
|
import im.vector.app.core.di.ActiveSessionHolder
|
||||||
import im.vector.app.core.di.MavericksAssistedViewModelFactory
|
import im.vector.app.core.di.MavericksAssistedViewModelFactory
|
||||||
import im.vector.app.core.di.hiltMavericksViewModelFactory
|
import im.vector.app.core.di.hiltMavericksViewModelFactory
|
||||||
import im.vector.app.core.platform.VectorViewModel
|
|
||||||
import im.vector.app.core.utils.PublishDataSource
|
|
||||||
import im.vector.app.features.settings.devices.v2.filter.DeviceManagerFilterType
|
import im.vector.app.features.settings.devices.v2.filter.DeviceManagerFilterType
|
||||||
import im.vector.lib.core.utils.flow.throttleFirst
|
|
||||||
import kotlinx.coroutines.flow.launchIn
|
import kotlinx.coroutines.flow.launchIn
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
@ -35,16 +32,15 @@ import org.matrix.android.sdk.api.extensions.orFalse
|
||||||
import org.matrix.android.sdk.api.session.crypto.verification.VerificationService
|
import org.matrix.android.sdk.api.session.crypto.verification.VerificationService
|
||||||
import org.matrix.android.sdk.api.session.crypto.verification.VerificationTransaction
|
import org.matrix.android.sdk.api.session.crypto.verification.VerificationTransaction
|
||||||
import org.matrix.android.sdk.api.session.crypto.verification.VerificationTxState
|
import org.matrix.android.sdk.api.session.crypto.verification.VerificationTxState
|
||||||
import kotlin.time.Duration.Companion.seconds
|
|
||||||
|
|
||||||
class DevicesViewModel @AssistedInject constructor(
|
class DevicesViewModel @AssistedInject constructor(
|
||||||
@Assisted initialState: DevicesViewState,
|
@Assisted initialState: DevicesViewState,
|
||||||
private val activeSessionHolder: ActiveSessionHolder,
|
private val activeSessionHolder: ActiveSessionHolder,
|
||||||
private val getCurrentSessionCrossSigningInfoUseCase: GetCurrentSessionCrossSigningInfoUseCase,
|
private val getCurrentSessionCrossSigningInfoUseCase: GetCurrentSessionCrossSigningInfoUseCase,
|
||||||
private val getDeviceFullInfoListUseCase: GetDeviceFullInfoListUseCase,
|
private val getDeviceFullInfoListUseCase: GetDeviceFullInfoListUseCase,
|
||||||
private val refreshDevicesUseCase: RefreshDevicesUseCase,
|
|
||||||
private val refreshDevicesOnCryptoDevicesChangeUseCase: RefreshDevicesOnCryptoDevicesChangeUseCase,
|
private val refreshDevicesOnCryptoDevicesChangeUseCase: RefreshDevicesOnCryptoDevicesChangeUseCase,
|
||||||
) : VectorViewModel<DevicesViewState, DevicesAction, DevicesViewEvent>(initialState), VerificationService.Listener {
|
refreshDevicesUseCase: RefreshDevicesUseCase,
|
||||||
|
) : VectorSessionsListViewModel<DevicesViewState, DevicesAction, DevicesViewEvent>(initialState, refreshDevicesUseCase), VerificationService.Listener {
|
||||||
|
|
||||||
@AssistedFactory
|
@AssistedFactory
|
||||||
interface Factory : MavericksAssistedViewModelFactory<DevicesViewModel, DevicesViewState> {
|
interface Factory : MavericksAssistedViewModelFactory<DevicesViewModel, DevicesViewState> {
|
||||||
|
@ -53,14 +49,10 @@ class DevicesViewModel @AssistedInject constructor(
|
||||||
|
|
||||||
companion object : MavericksViewModelFactory<DevicesViewModel, DevicesViewState> by hiltMavericksViewModelFactory()
|
companion object : MavericksViewModelFactory<DevicesViewModel, DevicesViewState> by hiltMavericksViewModelFactory()
|
||||||
|
|
||||||
private val refreshSource = PublishDataSource<Unit>()
|
|
||||||
private val refreshThrottleDelayMs = 4.seconds.inWholeMilliseconds
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
addVerificationListener()
|
addVerificationListener()
|
||||||
observeCurrentSessionCrossSigningInfo()
|
observeCurrentSessionCrossSigningInfo()
|
||||||
observeDevices()
|
observeDevices()
|
||||||
observeRefreshSource()
|
|
||||||
refreshDevicesOnCryptoDevicesChange()
|
refreshDevicesOnCryptoDevicesChange()
|
||||||
queryRefreshDevicesList()
|
queryRefreshDevicesList()
|
||||||
}
|
}
|
||||||
|
@ -123,13 +115,6 @@ class DevicesViewModel @AssistedInject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun observeRefreshSource() {
|
|
||||||
refreshSource.stream()
|
|
||||||
.throttleFirst(refreshThrottleDelayMs)
|
|
||||||
.onEach { refreshDevicesUseCase.execute() }
|
|
||||||
.launchIn(viewModelScope)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun transactionUpdated(tx: VerificationTransaction) {
|
override fun transactionUpdated(tx: VerificationTransaction) {
|
||||||
if (tx.state == VerificationTxState.Verified) {
|
if (tx.state == VerificationTxState.Verified) {
|
||||||
queryRefreshDevicesList()
|
queryRefreshDevicesList()
|
||||||
|
@ -142,7 +127,7 @@ class DevicesViewModel @AssistedInject constructor(
|
||||||
* It can be any mobile devices, and any browsers.
|
* It can be any mobile devices, and any browsers.
|
||||||
*/
|
*/
|
||||||
private fun queryRefreshDevicesList() {
|
private fun queryRefreshDevicesList() {
|
||||||
refreshSource.post(Unit)
|
refreshDeviceList()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun handle(action: DevicesAction) {
|
override fun handle(action: DevicesAction) {
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 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.app.features.settings.devices.v2
|
||||||
|
|
||||||
|
import com.airbnb.mvrx.MavericksState
|
||||||
|
import im.vector.app.core.platform.VectorViewEvents
|
||||||
|
import im.vector.app.core.platform.VectorViewModel
|
||||||
|
import im.vector.app.core.platform.VectorViewModelAction
|
||||||
|
import im.vector.app.core.utils.PublishDataSource
|
||||||
|
import im.vector.lib.core.utils.flow.throttleFirst
|
||||||
|
import kotlinx.coroutines.flow.launchIn
|
||||||
|
import kotlinx.coroutines.flow.onEach
|
||||||
|
import kotlin.time.Duration.Companion.seconds
|
||||||
|
|
||||||
|
abstract class VectorSessionsListViewModel<S : MavericksState, VA : VectorViewModelAction, VE : VectorViewEvents>(
|
||||||
|
initialState: S,
|
||||||
|
private val refreshDevicesUseCase: RefreshDevicesUseCase,
|
||||||
|
) : VectorViewModel<S, VA, VE>(initialState) {
|
||||||
|
|
||||||
|
private val refreshSource = PublishDataSource<Unit>()
|
||||||
|
private val refreshThrottleDelayMs = 4.seconds.inWholeMilliseconds
|
||||||
|
|
||||||
|
init {
|
||||||
|
observeRefreshSource()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun observeRefreshSource() {
|
||||||
|
refreshSource.stream()
|
||||||
|
.throttleFirst(refreshThrottleDelayMs)
|
||||||
|
.onEach { refreshDevicesUseCase.execute() }
|
||||||
|
.launchIn(viewModelScope)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun refreshDeviceList() {
|
||||||
|
refreshSource.post(Unit)
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,33 +17,28 @@
|
||||||
package im.vector.app.features.settings.devices.v2.othersessions
|
package im.vector.app.features.settings.devices.v2.othersessions
|
||||||
|
|
||||||
import com.airbnb.mvrx.MavericksViewModelFactory
|
import com.airbnb.mvrx.MavericksViewModelFactory
|
||||||
import com.airbnb.mvrx.Success
|
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedFactory
|
import dagger.assisted.AssistedFactory
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
import im.vector.app.core.di.ActiveSessionHolder
|
import im.vector.app.core.di.ActiveSessionHolder
|
||||||
import im.vector.app.core.di.MavericksAssistedViewModelFactory
|
import im.vector.app.core.di.MavericksAssistedViewModelFactory
|
||||||
import im.vector.app.core.di.hiltMavericksViewModelFactory
|
import im.vector.app.core.di.hiltMavericksViewModelFactory
|
||||||
import im.vector.app.core.platform.VectorViewModel
|
|
||||||
import im.vector.app.core.utils.PublishDataSource
|
|
||||||
import im.vector.app.features.settings.devices.v2.GetDeviceFullInfoListUseCase
|
import im.vector.app.features.settings.devices.v2.GetDeviceFullInfoListUseCase
|
||||||
import im.vector.app.features.settings.devices.v2.RefreshDevicesUseCase
|
import im.vector.app.features.settings.devices.v2.RefreshDevicesUseCase
|
||||||
|
import im.vector.app.features.settings.devices.v2.VectorSessionsListViewModel
|
||||||
import im.vector.app.features.settings.devices.v2.filter.DeviceManagerFilterType
|
import im.vector.app.features.settings.devices.v2.filter.DeviceManagerFilterType
|
||||||
import im.vector.lib.core.utils.flow.throttleFirst
|
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.flow.launchIn
|
|
||||||
import kotlinx.coroutines.flow.onEach
|
|
||||||
import org.matrix.android.sdk.api.session.crypto.verification.VerificationService
|
import org.matrix.android.sdk.api.session.crypto.verification.VerificationService
|
||||||
import org.matrix.android.sdk.api.session.crypto.verification.VerificationTransaction
|
import org.matrix.android.sdk.api.session.crypto.verification.VerificationTransaction
|
||||||
import org.matrix.android.sdk.api.session.crypto.verification.VerificationTxState
|
import org.matrix.android.sdk.api.session.crypto.verification.VerificationTxState
|
||||||
import kotlin.time.Duration.Companion.seconds
|
|
||||||
|
|
||||||
class OtherSessionsViewModel @AssistedInject constructor(
|
class OtherSessionsViewModel @AssistedInject constructor(
|
||||||
@Assisted initialState: OtherSessionsViewState,
|
@Assisted initialState: OtherSessionsViewState,
|
||||||
private val activeSessionHolder: ActiveSessionHolder,
|
private val activeSessionHolder: ActiveSessionHolder,
|
||||||
private val getDeviceFullInfoListUseCase: GetDeviceFullInfoListUseCase,
|
private val getDeviceFullInfoListUseCase: GetDeviceFullInfoListUseCase,
|
||||||
private val refreshDevicesUseCase: RefreshDevicesUseCase,
|
refreshDevicesUseCase: RefreshDevicesUseCase
|
||||||
) : VectorViewModel<OtherSessionsViewState, OtherSessionsAction, OtherSessionsViewEvents>(initialState), VerificationService.Listener {
|
) : VectorSessionsListViewModel<OtherSessionsViewState, OtherSessionsAction, OtherSessionsViewEvents>(initialState, refreshDevicesUseCase),
|
||||||
|
VerificationService.Listener {
|
||||||
|
|
||||||
@AssistedFactory
|
@AssistedFactory
|
||||||
interface Factory : MavericksAssistedViewModelFactory<OtherSessionsViewModel, OtherSessionsViewState> {
|
interface Factory : MavericksAssistedViewModelFactory<OtherSessionsViewModel, OtherSessionsViewState> {
|
||||||
|
@ -54,13 +49,9 @@ class OtherSessionsViewModel @AssistedInject constructor(
|
||||||
|
|
||||||
private var observeDevicesJob: Job? = null
|
private var observeDevicesJob: Job? = null
|
||||||
|
|
||||||
private val refreshSource = PublishDataSource<Unit>()
|
|
||||||
private val refreshThrottleDelayMs = 4.seconds.inWholeMilliseconds
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
observeDevices(initialState.currentFilter)
|
observeDevices(initialState.currentFilter)
|
||||||
addVerificationListener()
|
addVerificationListener()
|
||||||
observeRefreshSource()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCleared() {
|
override fun onCleared() {
|
||||||
|
@ -75,15 +66,9 @@ class OtherSessionsViewModel @AssistedInject constructor(
|
||||||
excludeCurrentDevice = true
|
excludeCurrentDevice = true
|
||||||
)
|
)
|
||||||
.execute { async ->
|
.execute { async ->
|
||||||
if (async is Success) {
|
|
||||||
copy(
|
copy(
|
||||||
devices = async,
|
devices = async,
|
||||||
)
|
)
|
||||||
} else {
|
|
||||||
copy(
|
|
||||||
devices = async
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,13 +86,6 @@ class OtherSessionsViewModel @AssistedInject constructor(
|
||||||
?.removeListener(this)
|
?.removeListener(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun observeRefreshSource() {
|
|
||||||
refreshSource.stream()
|
|
||||||
.throttleFirst(refreshThrottleDelayMs)
|
|
||||||
.onEach { refreshDevicesUseCase.execute() }
|
|
||||||
.launchIn(viewModelScope)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun transactionUpdated(tx: VerificationTransaction) {
|
override fun transactionUpdated(tx: VerificationTransaction) {
|
||||||
if (tx.state == VerificationTxState.Verified) {
|
if (tx.state == VerificationTxState.Verified) {
|
||||||
queryRefreshDevicesList()
|
queryRefreshDevicesList()
|
||||||
|
@ -115,7 +93,7 @@ class OtherSessionsViewModel @AssistedInject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun queryRefreshDevicesList() {
|
private fun queryRefreshDevicesList() {
|
||||||
refreshSource.post(Unit)
|
refreshDeviceList()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun handle(action: OtherSessionsAction) {
|
override fun handle(action: OtherSessionsAction) {
|
||||||
|
|
Loading…
Reference in New Issue