From a930313bf3683e46a0909aadbe9a4e56baadbdff Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Feb 2020 18:27:13 +0100 Subject: [PATCH] Convert to ViewEvents -> VerificationBottomSheetViewModel --- .../VectorBaseBottomSheetDialogFragment.kt | 36 +++++++++++++++++++ .../verification/VerificationBottomSheet.kt | 19 ++++------ .../VerificationBottomSheetViewEvents.kt | 29 +++++++++++++++ .../VerificationBottomSheetViewModel.kt | 13 ++----- 4 files changed, 73 insertions(+), 24 deletions(-) create mode 100644 vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewEvents.kt diff --git a/vector/src/main/java/im/vector/riotx/core/platform/VectorBaseBottomSheetDialogFragment.kt b/vector/src/main/java/im/vector/riotx/core/platform/VectorBaseBottomSheetDialogFragment.kt index 9b86782c42..fbc4bc5292 100644 --- a/vector/src/main/java/im/vector/riotx/core/platform/VectorBaseBottomSheetDialogFragment.kt +++ b/vector/src/main/java/im/vector/riotx/core/platform/VectorBaseBottomSheetDialogFragment.kt @@ -37,6 +37,9 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment import im.vector.riotx.core.di.DaggerScreenComponent import im.vector.riotx.core.di.ScreenComponent import im.vector.riotx.core.utils.DimensionConverter +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.disposables.Disposable import timber.log.Timber /** @@ -87,10 +90,18 @@ abstract class VectorBaseBottomSheetDialogFragment : BottomSheetDialogFragment() return view } + @CallSuper override fun onDestroyView() { super.onDestroyView() unBinder?.unbind() unBinder = null + uiDisposables.clear() + } + + @CallSuper + override fun onDestroy() { + uiDisposables.dispose() + super.onDestroy() } override fun onAttach(context: Context) { @@ -146,4 +157,29 @@ abstract class VectorBaseBottomSheetDialogFragment : BottomSheetDialogFragment() protected fun setArguments(args: Parcelable? = null) { arguments = args?.let { Bundle().apply { putParcelable(MvRx.KEY_ARG, it) } } } + + /* ========================================================================================== + * Disposable + * ========================================================================================== */ + + private val uiDisposables = CompositeDisposable() + + protected fun Disposable.disposeOnDestroyView(): Disposable { + uiDisposables.add(this) + return this + } + + /* ========================================================================================== + * ViewEvents + * ========================================================================================== */ + + protected fun VectorViewModel<*, *, T>.observeViewEvents(observer: (T) -> Unit) { + viewEvents + .observe() + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + observer(it) + } + .disposeOnDestroyView() + } } diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt index b767f74fea..75983a1969 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt @@ -23,18 +23,17 @@ import android.widget.TextView import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.view.isVisible import androidx.fragment.app.Fragment -import androidx.lifecycle.Observer import androidx.transition.AutoTransition import androidx.transition.TransitionManager import butterknife.BindView import com.airbnb.mvrx.MvRx -import com.airbnb.mvrx.Success import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState import im.vector.matrix.android.api.session.crypto.sas.VerificationTxState import im.vector.riotx.R import im.vector.riotx.core.di.ScreenComponent import im.vector.riotx.core.extensions.commitTransactionNow +import im.vector.riotx.core.extensions.exhaustive import im.vector.riotx.core.platform.VectorBaseBottomSheetDialogFragment import im.vector.riotx.features.crypto.verification.choose.VerificationChooseMethodFragment import im.vector.riotx.features.crypto.verification.conclusion.VerificationConclusionFragment @@ -84,17 +83,11 @@ class VerificationBottomSheet : VectorBaseBottomSheetDialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - viewModel.requestLiveData.observe(viewLifecycleOwner, Observer { - it.peekContent().let { va -> - when (va) { - is Success -> { - if (va.invoke() is VerificationAction.GotItConclusion) { - dismiss() - } - } - } - } - }) + viewModel.observeViewEvents { + when (it) { + is VerificationBottomSheetViewEvents.Dismiss -> dismiss() + }.exhaustive + } } override fun invalidate() = withState(viewModel) { state -> diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewEvents.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewEvents.kt new file mode 100644 index 0000000000..99417c6ca2 --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewEvents.kt @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 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.riotx.features.crypto.verification + +import im.vector.riotx.core.platform.VectorViewEvents + +/** + * Transient events for the verification bottom sheet + */ +sealed class VerificationBottomSheetViewEvents : VectorViewEvents { + // data class Loading(val message: CharSequence? = null) : RoomDirectoryViewEvents() + // data class Failure(val throwable: Throwable) : CreateDirectViewEvents() + + object Dismiss : VerificationBottomSheetViewEvents() +} diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewModel.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewModel.kt index 5e11570ced..a9f9987c7f 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewModel.kt @@ -15,8 +15,6 @@ */ package im.vector.riotx.features.crypto.verification -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import com.airbnb.mvrx.Async import com.airbnb.mvrx.Fail import com.airbnb.mvrx.FragmentViewModelContext @@ -43,9 +41,7 @@ import im.vector.matrix.android.api.util.MatrixItem import im.vector.matrix.android.api.util.toMatrixItem import im.vector.matrix.android.internal.crypto.verification.PendingVerificationRequest import im.vector.riotx.core.extensions.exhaustive -import im.vector.riotx.core.platform.EmptyViewEvents import im.vector.riotx.core.platform.VectorViewModel -import im.vector.riotx.core.utils.LiveEvent data class VerificationBottomSheetViewState( val otherUserMxItem: MatrixItem? = null, @@ -63,14 +59,9 @@ data class VerificationBottomSheetViewState( class VerificationBottomSheetViewModel @AssistedInject constructor(@Assisted initialState: VerificationBottomSheetViewState, @Assisted args: VerificationBottomSheet.VerificationArgs, private val session: Session) - : VectorViewModel(initialState), + : VectorViewModel(initialState), VerificationService.VerificationListener { - // Can be used for several actions, for a one shot result - private val _requestLiveData = MutableLiveData>>() - val requestLiveData: LiveData>> - get() = _requestLiveData - init { session.getVerificationService().addListener(this) @@ -255,7 +246,7 @@ class VerificationBottomSheetViewModel @AssistedInject constructor(@Assisted ini ?.shortCodeDoesNotMatch() } is VerificationAction.GotItConclusion -> { - _requestLiveData.postValue(LiveEvent(Success(action))) + _viewEvents.post(VerificationBottomSheetViewEvents.Dismiss) } }.exhaustive }