Skip to content

Commit

Permalink
fix: product 褋omparison (#4177)
Browse files Browse the repository at this point in the history
  • Loading branch information
naivekook committed Aug 24, 2021
1 parent 87bb22f commit 76e189e
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 30 deletions.
Expand Up @@ -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() {
Expand All @@ -42,7 +41,6 @@ class ProductCompareActivity : BaseActivity() {

private val viewModel: ProductCompareViewModel by viewModels()


@Inject
lateinit var productRepository: ProductRepository

Expand Down Expand Up @@ -71,19 +69,19 @@ class ProductCompareActivity : BaseActivity() {
supportActionBar?.setDisplayHomeAsUpEnabled(true)

// Use activity results if present
var returnedProducts = ArrayList<Product>()
var returnedProducts = emptyList<Product>()
if (intent.extras != null && intent.getBooleanExtra(KEY_PRODUCT_FOUND, false)) {
returnedProducts = intent.extras?.getSerializable(KEY_PRODUCTS_TO_COMPARE) as ArrayList<Product>
returnedProducts = intent.extras?.getSerializable(KEY_PRODUCTS_TO_COMPARE) as List<Product>
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()))
Expand Down Expand Up @@ -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<Product>) }
?: error("Products still not set.")
}

Expand Down
Expand Up @@ -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
Expand All @@ -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<AdditiveName>
)

private val lang: String by lazy { localeManager.getLanguage() }

val productsToCompare = MutableLiveData<ArrayList<Product>>()

val products = productsToCompare.switchMap { products ->
liveData<List<CompareProduct>> {
products.map { CompareProduct(it, fetchAdditives(it)) }
) : ViewModel() {

val productsToCompare = MutableLiveData<List<CompareProduct>>()

fun addProductsToCompare(items: List<Product>) {
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<AdditiveName> {
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 }
}

}
data class CompareProduct(
val product: Product,
val additiveNames: List<AdditiveName>
)
}

0 comments on commit 76e189e

Please sign in to comment.