Convert WhoCanFindMeByPhoneNumber to StateFlow.

This commit is contained in:
Alex Hart
2025-11-07 10:41:39 -04:00
committed by Michelle Tang
parent ba378d28f4
commit d241aebade
2 changed files with 24 additions and 28 deletions

View File

@@ -4,10 +4,12 @@ import android.os.Bundle
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.fragment.app.setFragmentResult import androidx.fragment.app.setFragmentResult
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import io.reactivex.rxjava3.kotlin.subscribeBy import kotlinx.coroutines.launch
import org.signal.core.util.concurrent.LifecycleDisposable
import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.ViewBinderDelegate import org.thoughtcrime.securesms.components.ViewBinderDelegate
import org.thoughtcrime.securesms.components.settings.DSLConfiguration import org.thoughtcrime.securesms.components.settings.DSLConfiguration
@@ -33,21 +35,25 @@ class WhoCanFindMeByPhoneNumberFragment : DSLSettingsFragment(
} }
private val viewModel: WhoCanFindMeByPhoneNumberViewModel by viewModels() private val viewModel: WhoCanFindMeByPhoneNumberViewModel by viewModels()
private val lifecycleDisposable = LifecycleDisposable()
private val binding by ViewBinderDelegate(WhoCanFindMeByPhoneNumberFragmentBinding::bind) private val binding by ViewBinderDelegate(WhoCanFindMeByPhoneNumberFragmentBinding::bind)
override fun bindAdapter(adapter: MappingAdapter) { override fun bindAdapter(adapter: MappingAdapter) {
lifecycleDisposable += viewModel.state.subscribe { viewLifecycleOwner.lifecycleScope.launch {
adapter.submitList(getConfiguration(it).toMappingModelList()) viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.state.collect { state ->
adapter.submitList(getConfiguration(state).toMappingModelList())
}
}
} }
binding.save.setOnClickListener { binding.save.setOnClickListener {
binding.save.isEnabled = false binding.save.isEnabled = false
lifecycleDisposable += viewModel.onSave().subscribeBy(onComplete = { viewLifecycleOwner.lifecycleScope.launch {
viewModel.onSave()
setFragmentResult(REQUEST_KEY, Bundle()) setFragmentResult(REQUEST_KEY, Bundle())
findNavController().popBackStack() findNavController().popBackStack()
}) }
} }
} }

View File

@@ -1,38 +1,28 @@
package org.thoughtcrime.securesms.profiles.edit.pnp package org.thoughtcrime.securesms.profiles.edit.pnp
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import kotlinx.coroutines.flow.MutableStateFlow
import io.reactivex.rxjava3.core.Completable import kotlinx.coroutines.flow.StateFlow
import io.reactivex.rxjava3.core.Flowable import kotlinx.coroutines.flow.asStateFlow
import io.reactivex.rxjava3.disposables.CompositeDisposable import kotlinx.coroutines.flow.update
import org.thoughtcrime.securesms.util.rx.RxStore import kotlinx.coroutines.rx3.await
class WhoCanFindMeByPhoneNumberViewModel : ViewModel() { class WhoCanFindMeByPhoneNumberViewModel : ViewModel() {
private val repository = WhoCanFindMeByPhoneNumberRepository() private val repository = WhoCanFindMeByPhoneNumberRepository()
private val store = RxStore(repository.getCurrentState())
private val disposables = CompositeDisposable()
val state: Flowable<WhoCanFindMeByPhoneNumberState> = store.stateFlowable.subscribeOn(AndroidSchedulers.mainThread()) private val internalState = MutableStateFlow(repository.getCurrentState())
val state: StateFlow<WhoCanFindMeByPhoneNumberState> = internalState.asStateFlow()
fun onEveryoneCanFindMeByPhoneNumberSelected() { fun onEveryoneCanFindMeByPhoneNumberSelected() {
store.update { internalState.update { WhoCanFindMeByPhoneNumberState.EVERYONE }
WhoCanFindMeByPhoneNumberState.EVERYONE
}
} }
fun onNobodyCanFindMeByPhoneNumberSelected() { fun onNobodyCanFindMeByPhoneNumberSelected() {
store.update { internalState.update { WhoCanFindMeByPhoneNumberState.NOBODY }
WhoCanFindMeByPhoneNumberState.NOBODY
}
} }
fun onSave(): Completable { suspend fun onSave() {
return repository.onSave(store.state).observeOn(AndroidSchedulers.mainThread()) repository.onSave(internalState.value).await()
}
override fun onCleared() {
disposables.clear()
store.dispose()
} }
} }