From 001a23683ab17d54911053d43582c5eb6ca63643 Mon Sep 17 00:00:00 2001 From: yuvraj-coder1 Date: Fri, 3 Jan 2025 22:50:43 +0530 Subject: [PATCH] refactor: replace LiveData with StateFlow --- .../customselector/ui/adapter/ImageAdapter.kt | 7 ++-- .../ui/selector/ImageFragment.kt | 37 +++++++++++++++---- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt index 0b2380d9c..cf0e62dc3 100644 --- a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt @@ -7,8 +7,6 @@ import android.view.ViewGroup import android.widget.ImageView import android.widget.Toast import androidx.constraintlayout.widget.Group -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide @@ -26,6 +24,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.MainScope import kotlinx.coroutines.cancel +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch import java.util.TreeMap import kotlin.collections.ArrayList @@ -108,8 +107,8 @@ class ImageAdapter( /** * Stores the number of images currently visible on the screen */ - private val _currentImagesCount = MutableLiveData(0) - val currentImagesCountLiveData: LiveData = _currentImagesCount + private val _currentImagesCount = MutableStateFlow(0) + val currentImagesCount = _currentImagesCount /** * Coroutine Dispatchers and Scope. diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/ImageFragment.kt b/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/ImageFragment.kt index f8f923d0b..4c48b8261 100644 --- a/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/ImageFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/ImageFragment.kt @@ -13,8 +13,11 @@ import android.widget.Switch import androidx.appcompat.app.AlertDialog import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.isVisible +import androidx.lifecycle.Lifecycle import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import fr.free.nrw.commons.contributions.Contribution @@ -39,6 +42,10 @@ import fr.free.nrw.commons.theme.BaseActivity import fr.free.nrw.commons.upload.FileProcessor import fr.free.nrw.commons.upload.FileUtilsWrapper import io.reactivex.schedulers.Schedulers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.launch import java.util.TreeMap import javax.inject.Inject import kotlin.collections.ArrayList @@ -81,6 +88,12 @@ class ImageFragment : */ var allImages: ArrayList = ArrayList() + /** + * Keeps track of switch state + */ + private val _switchState = MutableStateFlow(false) + val switchState = _switchState.asStateFlow() + /** * View model Factory. */ @@ -215,15 +228,25 @@ class ImageFragment : switch = binding?.switchWidget switch?.visibility = View.VISIBLE - switch?.setOnCheckedChangeListener { _, isChecked -> onChangeSwitchState(isChecked) } + _switchState.value = switch?.isChecked ?: false + switch?.setOnCheckedChangeListener { _, isChecked -> + onChangeSwitchState(isChecked) + _switchState.value = isChecked + } - imageAdapter.currentImagesCountLiveData.observe(viewLifecycleOwner, Observer { - if (switch?.isChecked == false && it == 0 && switch?.isVisible == true) { - binding?.allImagesUploadedOrMarked?.isVisible = true - } else { - binding?.allImagesUploadedOrMarked?.isVisible = false + viewLifecycleOwner.lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + combine( + imageAdapter.currentImagesCount, + switchState + ) { imageCount, isChecked -> + imageCount to isChecked + }.collect { (imageCount, isChecked) -> + binding?.allImagesUploadedOrMarked?.isVisible = + !isChecked && imageCount == 0 && (switch?.isVisible == true) + } } - }) + } selectorRV = binding?.selectorRv loader = binding?.loader