From 76e189e39e3ea37e7b7639ad744025d20b131ed1 Mon Sep 17 00:00:00 2001 From: Vladimir Tanakov Date: Tue, 24 Aug 2021 16:46:35 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20product=20=D1=81omparison=20(#4177)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compare/ProductCompareActivity.kt | 13 +++-- .../compare/ProductCompareViewModel.kt | 51 ++++++++++--------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/compare/ProductCompareActivity.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/compare/ProductCompareActivity.kt index 3b54dd207443..de63ce9e023d 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/compare/ProductCompareActivity.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/compare/ProductCompareActivity.kt @@ -33,7 +33,6 @@ import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository import openfoodfacts.github.scrachx.openfood.utils.* import java.util.* import javax.inject.Inject -import kotlin.collections.ArrayList @AndroidEntryPoint class ProductCompareActivity : BaseActivity() { @@ -42,7 +41,6 @@ class ProductCompareActivity : BaseActivity() { private val viewModel: ProductCompareViewModel by viewModels() - @Inject lateinit var productRepository: ProductRepository @@ -71,19 +69,19 @@ class ProductCompareActivity : BaseActivity() { supportActionBar?.setDisplayHomeAsUpEnabled(true) // Use activity results if present - var returnedProducts = ArrayList() + var returnedProducts = emptyList() if (intent.extras != null && intent.getBooleanExtra(KEY_PRODUCT_FOUND, false)) { - returnedProducts = intent.extras?.getSerializable(KEY_PRODUCTS_TO_COMPARE) as ArrayList + returnedProducts = intent.extras?.getSerializable(KEY_PRODUCTS_TO_COMPARE) as List if (intent.getBooleanExtra(KEY_PRODUCT_ALREADY_EXISTS, false)) { Toast.makeText(this, getString(R.string.product_already_exists_in_comparison), Toast.LENGTH_SHORT).show() } } - viewModel.productsToCompare.value = returnedProducts + viewModel.addProductsToCompare(returnedProducts) binding.navigationBottomInclude.bottomNavigation.installBottomNavigation(this) - viewModel.products.observe(this) { products -> + viewModel.productsToCompare.observe(this) { products -> // Track compare event if (products.size > 1) { matomoAnalytics.trackEvent(AnalyticsEvent.CompareProducts(products.size.toFloat())) @@ -151,7 +149,8 @@ class ProductCompareActivity : BaseActivity() { override fun startScanActivity() { viewModel.productsToCompare.value - ?.let { ContinuousScanActivity.start(this, it) } + ?.map { it.product } + ?.let { ContinuousScanActivity.start(this, it as java.util.ArrayList) } ?: error("Products still not set.") } diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/compare/ProductCompareViewModel.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/compare/ProductCompareViewModel.kt index 93d549765bfc..af514f58d44a 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/compare/ProductCompareViewModel.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/compare/ProductCompareViewModel.kt @@ -2,10 +2,12 @@ package openfoodfacts.github.scrachx.openfood.features.compare import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import androidx.lifecycle.liveData -import androidx.lifecycle.switchMap +import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import kotlinx.coroutines.rx2.await +import kotlinx.coroutines.withContext import openfoodfacts.github.scrachx.openfood.models.Product import openfoodfacts.github.scrachx.openfood.models.entities.additive.AdditiveName import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository @@ -16,30 +18,33 @@ import javax.inject.Inject class ProductCompareViewModel @Inject constructor( private val productRepository: ProductRepository, private val localeManager: LocaleManager -) : ViewModel( - -) { - data class CompareProduct( - val product: Product, - val additiveNames: List - ) - - private val lang: String by lazy { localeManager.getLanguage() } - - val productsToCompare = MutableLiveData>() - - val products = productsToCompare.switchMap { products -> - liveData> { - products.map { CompareProduct(it, fetchAdditives(it)) } +) : ViewModel() { + + val productsToCompare = MutableLiveData>() + + fun addProductsToCompare(items: List) { + viewModelScope.launch { + val result = withContext(Dispatchers.IO) { + items.map { CompareProduct(it, fetchAdditives(it)) } + } + withContext(Dispatchers.Main) { + productsToCompare.postValue(result) + } } } - private suspend fun fetchAdditives(product: Product): List { - return product.additivesTags.map { tag -> - productRepository.getAdditiveByTagAndLanguageCode(tag, lang).await() - .takeUnless { it.isNull } ?: productRepository.getAdditiveByTagAndDefaultLanguageCode(tag).await() - }.filter { it.isNotNull } + return product + .additivesTags + .map { tag -> + productRepository.getAdditiveByTagAndLanguageCode(tag, localeManager.getLanguage()).await() + .takeUnless { it.isNull } ?: productRepository.getAdditiveByTagAndDefaultLanguageCode(tag).await() + } + .filter { it.isNotNull } } -} \ No newline at end of file + data class CompareProduct( + val product: Product, + val additiveNames: List + ) +}