From 364457d102689340d40a8c4261725b25bb7573bb Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 31 Dec 2021 13:13:48 +0100 Subject: [PATCH] Move logic to dedicated ViewModel --- .../java/im/vector/app/AppStateHandler.kt | 29 -------- .../vector/app/features/home/HomeActivity.kt | 2 + .../home/UserColorAccountDataViewModel.kt | 73 +++++++++++++++++++ 3 files changed, 75 insertions(+), 29 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/home/UserColorAccountDataViewModel.kt diff --git a/vector/src/main/java/im/vector/app/AppStateHandler.kt b/vector/src/main/java/im/vector/app/AppStateHandler.kt index afd4c53c37..9ed9dd5b23 100644 --- a/vector/src/main/java/im/vector/app/AppStateHandler.kt +++ b/vector/src/main/java/im/vector/app/AppStateHandler.kt @@ -21,13 +21,8 @@ import androidx.lifecycle.LifecycleOwner import arrow.core.Option import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.core.utils.BehaviorDataSource -import im.vector.app.features.home.room.detail.timeline.helper.MatrixItemColorProvider import im.vector.app.features.session.coroutineScope import im.vector.app.features.ui.UiStateRepository -import io.reactivex.Observable -import io.reactivex.android.schedulers.AndroidSchedulers -import io.reactivex.disposables.CompositeDisposable -import io.reactivex.rxkotlin.addTo import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob @@ -38,11 +33,8 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.Session -import org.matrix.android.sdk.api.session.accountdata.UserAccountDataTypes -import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.group.model.GroupSummary import org.matrix.android.sdk.api.session.room.model.RoomSummary -import org.matrix.android.sdk.rx.rx import javax.inject.Inject import javax.inject.Singleton @@ -62,7 +54,6 @@ fun RoomGroupingMethod.group() = (this as? RoomGroupingMethod.ByLegacyGroup)?.gr @Singleton class AppStateHandler @Inject constructor( private val sessionDataSource: ActiveSessionDataSource, - private val matrixItemColorProvider: MatrixItemColorProvider, private val uiStateRepository: UiStateRepository, private val activeSessionHolder: ActiveSessionHolder ) : DefaultLifecycleObserver { @@ -141,11 +132,6 @@ class AppStateHandler @Inject constructor( return (selectedSpaceDataSource.currentValue?.orNull() as? RoomGroupingMethod.ByLegacyGroup)?.groupSummary?.groupId } - @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) - fun entersForeground() { - observeUserAccountData() - } - override fun onResume(owner: LifecycleOwner) { observeActiveSession() } @@ -164,19 +150,4 @@ class AppStateHandler @Inject constructor( } } } - - private fun observeUserAccountData() { - sessionDataSource.observe() - .observeOn(AndroidSchedulers.mainThread()) - .switchMap { - it.orNull()?.rx()?.liveUserAccountData(setOf(UserAccountDataTypes.TYPE_OVERRIDE_COLORS)) - ?: Observable.just(emptyList()) - } - .distinctUntilChanged() - .subscribe { - val overrideColorSpecs = it?.firstOrNull()?.content?.toModel>() - matrixItemColorProvider.setOverrideColors(overrideColorSpecs) - } - .addTo(compositeDisposable) - } } diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt index e2696115f4..43456f16bb 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt @@ -106,6 +106,8 @@ class HomeActivity : private val homeActivityViewModel: HomeActivityViewModel by viewModel() @Suppress("UNUSED") private val analyticsAccountDataViewModel: AnalyticsAccountDataViewModel by viewModel() + @Suppress("UNUSED") + private val userColorAccountDataViewModel: UserColorAccountDataViewModel by viewModel() private val serverBackupStatusViewModel: ServerBackupStatusViewModel by viewModel() private val promoteRestrictedViewModel: PromoteRestrictedViewModel by viewModel() diff --git a/vector/src/main/java/im/vector/app/features/home/UserColorAccountDataViewModel.kt b/vector/src/main/java/im/vector/app/features/home/UserColorAccountDataViewModel.kt new file mode 100644 index 0000000000..9e13fe56d0 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/home/UserColorAccountDataViewModel.kt @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2021 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.home + +import com.airbnb.mvrx.MavericksState +import com.airbnb.mvrx.MavericksViewModelFactory +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import im.vector.app.core.di.MavericksAssistedViewModelFactory +import im.vector.app.core.di.hiltMavericksViewModelFactory +import im.vector.app.core.platform.EmptyAction +import im.vector.app.core.platform.EmptyViewEvents +import im.vector.app.core.platform.VectorViewModel +import im.vector.app.features.home.room.detail.timeline.helper.MatrixItemColorProvider +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.mapNotNull +import kotlinx.coroutines.flow.onEach +import org.matrix.android.sdk.api.session.Session +import org.matrix.android.sdk.api.session.accountdata.UserAccountDataTypes +import org.matrix.android.sdk.api.session.events.model.toModel +import org.matrix.android.sdk.flow.flow + +data class DummyState( + val dummy: Boolean = false +) : MavericksState + +class UserColorAccountDataViewModel @AssistedInject constructor( + @Assisted initialState: DummyState, + private val session: Session, + private val matrixItemColorProvider: MatrixItemColorProvider +) : VectorViewModel(initialState) { + + @AssistedFactory + interface Factory : MavericksAssistedViewModelFactory { + override fun create(initialState: DummyState): UserColorAccountDataViewModel + } + + companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() + + init { + observeAccountData() + } + + private fun observeAccountData() { + session.flow() + .liveUserAccountData(setOf(UserAccountDataTypes.TYPE_OVERRIDE_COLORS)) + .mapNotNull { it.firstOrNull() } + .mapNotNull { it.content.toModel>() } + .onEach { userColorAccountDataContent -> + matrixItemColorProvider.setOverrideColors(userColorAccountDataContent) + } + .launchIn(viewModelScope) + } + + override fun handle(action: EmptyAction) { + // No op + } +}