Skip to content

Commit

Permalink
fix: allergens alerts
Browse files Browse the repository at this point in the history
Closes #3943
  • Loading branch information
VaiTon committed May 17, 2021
1 parent ff86941 commit 8c40df2
Show file tree
Hide file tree
Showing 5 changed files with 289 additions and 266 deletions.
Expand Up @@ -22,13 +22,16 @@ import android.view.*
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.edit
import androidx.core.content.res.ResourcesCompat
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver
import com.afollestad.materialdialogs.MaterialDialog
import dagger.hilt.android.AndroidEntryPoint
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.rxkotlin.addTo
import io.reactivex.schedulers.Schedulers
import kotlinx.coroutines.launch
import kotlinx.coroutines.rx2.await
import net.steamcrafted.loadtoast.LoadToast
import openfoodfacts.github.scrachx.openfood.R
import openfoodfacts.github.scrachx.openfood.analytics.AnalyticsEvent
Expand Down Expand Up @@ -102,6 +105,7 @@ class AllergensAlertFragment : NavigationBaseFragment() {
.doOnError { Log.e(LOG_TAG, "getAllergensByLanguageCode", it) }
.subscribe { allergens -> allergensFromDao = allergens }
.addTo(disp)

mSettings = requireActivity().getSharedPreferences("prefs", 0)
}

Expand Down Expand Up @@ -140,7 +144,9 @@ class AllergensAlertFragment : NavigationBaseFragment() {
.title(R.string.title_dialog_alert)
.items(allergens.map { it.name })
.itemsCallback { _, _, position, _ ->
productRepository.setAllergenEnabled(allergens[position].allergenTag, true)
viewLifecycleOwner.lifecycleScope.launch {
productRepository.setAllergenEnabled(allergens[position].allergenTag, true).await()
}
mAllergensEnabled!!.add(allergens[position])
adapter.notifyItemInserted(mAllergensEnabled!!.size - 1)
binding.allergensRecycle.scrollToPosition(adapter.itemCount - 1)
Expand Down
Expand Up @@ -607,8 +607,9 @@ class SummaryProductFragment : BaseFragment(), ISummaryProductPresenter.View {
binding.productAllergenAlertLayout.visibility = View.VISIBLE
return
}
binding.productAllergenAlertText.text =
"${resources.getString(R.string.product_allergen_prompt)}\n${data.allergens.joinToString(", ")}"
binding.productAllergenAlertText.text = StringBuilder(resources.getString(R.string.product_allergen_prompt))
.append("\n").append(data.allergens.joinToString(", "))

binding.productAllergenAlertLayout.visibility = View.VISIBLE
}

Expand Down
Expand Up @@ -7,17 +7,21 @@ import java.util.*

object AllergenHelper {
@Contract(" -> new")
private fun createEmpty() = Data(false, emptyList<String>())
private fun createEmpty() = Data(false, emptyList())

fun computeUserAllergen(product: Product, userAllergens: List<AllergenName>): Data {
if (userAllergens.isEmpty()) return createEmpty()

if (!product.statesTags.contains(ApiFields.StateTags.INGREDIENTS_COMPLETED))
return Data(true, emptyList<String>())
if (ApiFields.StateTags.INGREDIENTS_COMPLETED !in product.statesTags)
return Data(true, emptyList())

val productAllergens = HashSet(product.allergensHierarchy)
.also { it += product.tracesTags }

val productAllergens = HashSet(product.allergensHierarchy).also { it += product.tracesTags }
val allergenMatch = TreeSet<String?>()
userAllergens.filter { productAllergens.contains(it.allergenTag) }.mapTo(allergenMatch) { it.name }
userAllergens.filter { productAllergens.contains(it.allergenTag) }
.mapTo(allergenMatch) { it.name }

return Data(false, allergenMatch.toList())
}

Expand Down
Expand Up @@ -34,12 +34,12 @@ object ApiFields {
const val INGREDIENTS_COMPLETED = "en:ingredients-completed"

val INCOMPLETE_TAGS = listOf(
"to-be-completed",
"to-be-uploaded",
"to-be-checked",
"to-be-validated",
"to-be-selected",
"not-selected"
"to-be-completed",
"to-be-uploaded",
"to-be-checked",
"to-be-validated",
"to-be-selected",
"not-selected"
)
}

Expand Down Expand Up @@ -174,10 +174,10 @@ object ApiFields {
const val SEARCH_TERMS = "search_terms"

val TYPE_IMAGE = arrayOf(
ProductImageField.FRONT,
ProductImageField.INGREDIENTS,
ProductImageField.NUTRITION,
ProductImageField.PACKAGING
ProductImageField.FRONT,
ProductImageField.INGREDIENTS,
ProductImageField.NUTRITION,
ProductImageField.PACKAGING
)
const val LANGUAGES_CODES = "languages_codes"
const val URL = "url"
Expand All @@ -196,108 +196,109 @@ object ApiFields {
const val OTHER = "other"

val PRODUCT_COMMON_FIELDS = setOf(
PRODUCT_NAME,
GENERIC_NAME,
IMAGE_SMALL_URL,
IMAGE_FRONT_URL,
IMAGE_INGREDIENTS_URL,
IMAGE_NUTRITION_URL,
IMAGE_PACKAGING_URL,
IMAGE_URL,
SELECTED_IMAGES,
LANGUAGES_CODES,
VITAMINS_TAGS,
MINERALS_TAGS,
AMINO_ACIDS_TAGS,
OTHER_NUTRITIONAL_SUBSTANCES_TAGS,
URL,
NUTRIMENTS,
BARCODE,
TRACES_TAGS,
INGREDIENTS_MAY_PALM_OIL_TAGS,
BRANDS_TAGS,
TRACES,
CATEGORIES_TAGS,
INGREDIENTS_TEXT,
INGREDIENTS_FROM_PALM_OIL_TAGS,
ADDITIVES_TAGS,
SERVING_SIZE,
ALLERGENS_TAGS,
ALLERGENS,
ORIGINS,
STORES,
NUTRITION_GRADE_FR,
NUTRITION_GRADES_TAGS,
NUTRIENT_LEVELS,
ECOSCORE,
COUNTRIES,
COUNTRIES_TAGS,
BRANDS,
PACKAGING,
LABELS_TAGS,
LABELS_HIERARCHY,
CITIES_TAGS,
QUANTITY,
INGREDIENTS_PALM_OIL_N,
LINK,
EMB_CODES_TAGS,
STATES_TAGS,
CREATOR,
CREATED_DATE_TIME,
LAST_MODIFIED_TIME,
LAST_MODIFIED_BY,
EDITORS_TAGS,
NOVA_GROUPS,
LANG,
PURCHASE_PLACES,
NUTRITION_DATA_PER,
NO_NUTRITION_DATA,
OTHER,
OTHER_INFORMATION,
CONSERVATION_CONDITIONS,
RECYCLING_INSTRUCTIONS_TO_DISCARD,
RECYCLING_INSTRUCTIONS_TO_RECYCLE,
WARNING,
CUSTOMER_SERVICE,
ENVIRONMENT_INFOCARD,
ENVIRONMENT_IMPACT_LEVEL_TAGS,
INGREDIENTS_ANALYSIS_TAGS,
INGREDIENTS,
STATES_TAGS
ALLERGENS_HIERARCHY,
PRODUCT_NAME,
GENERIC_NAME,
IMAGE_SMALL_URL,
IMAGE_FRONT_URL,
IMAGE_INGREDIENTS_URL,
IMAGE_NUTRITION_URL,
IMAGE_PACKAGING_URL,
IMAGE_URL,
SELECTED_IMAGES,
LANGUAGES_CODES,
VITAMINS_TAGS,
MINERALS_TAGS,
AMINO_ACIDS_TAGS,
OTHER_NUTRITIONAL_SUBSTANCES_TAGS,
URL,
NUTRIMENTS,
BARCODE,
TRACES_TAGS,
INGREDIENTS_MAY_PALM_OIL_TAGS,
BRANDS_TAGS,
TRACES,
CATEGORIES_TAGS,
INGREDIENTS_TEXT,
INGREDIENTS_FROM_PALM_OIL_TAGS,
ADDITIVES_TAGS,
SERVING_SIZE,
ALLERGENS_TAGS,
ALLERGENS,
ORIGINS,
STORES,
NUTRITION_GRADE_FR,
NUTRITION_GRADES_TAGS,
NUTRIENT_LEVELS,
ECOSCORE,
COUNTRIES,
COUNTRIES_TAGS,
BRANDS,
PACKAGING,
LABELS_TAGS,
LABELS_HIERARCHY,
CITIES_TAGS,
QUANTITY,
INGREDIENTS_PALM_OIL_N,
LINK,
EMB_CODES_TAGS,
STATES_TAGS,
CREATOR,
CREATED_DATE_TIME,
LAST_MODIFIED_TIME,
LAST_MODIFIED_BY,
EDITORS_TAGS,
NOVA_GROUPS,
LANG,
PURCHASE_PLACES,
NUTRITION_DATA_PER,
NO_NUTRITION_DATA,
OTHER,
OTHER_INFORMATION,
CONSERVATION_CONDITIONS,
RECYCLING_INSTRUCTIONS_TO_DISCARD,
RECYCLING_INSTRUCTIONS_TO_RECYCLE,
WARNING,
CUSTOMER_SERVICE,
ENVIRONMENT_INFOCARD,
ENVIRONMENT_IMPACT_LEVEL_TAGS,
INGREDIENTS_ANALYSIS_TAGS,
INGREDIENTS,
STATES_TAGS
)

val PRODUCT_LOCAL_FIELDS = setOf(
PRODUCT_NAME to true,
GENERIC_NAME to true,
INGREDIENTS_TEXT to true,
OTHER_INFORMATION to true,
CONSERVATION_CONDITIONS to true,
RECYCLING_INSTRUCTIONS_TO_DISCARD to true,
RECYCLING_INSTRUCTIONS_TO_RECYCLE to true,
WARNING to true,
ATTRIBUTE_GROUPS to false,
CUSTOMER_SERVICE to true,
IMAGE_FRONT_URL to true,
IMAGE_INGREDIENTS_URL to true,
IMAGE_NUTRITION_URL to true,
IMAGE_PACKAGING_URL to true
PRODUCT_NAME to true,
GENERIC_NAME to true,
INGREDIENTS_TEXT to true,
OTHER_INFORMATION to true,
CONSERVATION_CONDITIONS to true,
RECYCLING_INSTRUCTIONS_TO_DISCARD to true,
RECYCLING_INSTRUCTIONS_TO_RECYCLE to true,
WARNING to true,
ATTRIBUTE_GROUPS to false,
CUSTOMER_SERVICE to true,
IMAGE_FRONT_URL to true,
IMAGE_INGREDIENTS_URL to true,
IMAGE_NUTRITION_URL to true,
IMAGE_PACKAGING_URL to true
)

val PRODUCT_IMAGES_FIELDS = setOf(
PRODUCT_NAME, GENERIC_NAME, BARCODE, LANG, IMAGE_SMALL_URL, IMAGES,
IMAGE_FRONT_URL, IMAGE_INGREDIENTS_URL, IMAGE_NUTRITION_URL,
IMAGE_PACKAGING_URL, IMAGE_URL, SELECTED_IMAGES
PRODUCT_NAME, GENERIC_NAME, BARCODE, LANG, IMAGE_SMALL_URL, IMAGES,
IMAGE_FRONT_URL, IMAGE_INGREDIENTS_URL, IMAGE_NUTRITION_URL,
IMAGE_PACKAGING_URL, IMAGE_URL, SELECTED_IMAGES
)

val PRODUCT_SEARCH_FIELDS = setOf(
BRANDS,
PRODUCT_NAME,
IMAGE_SMALL_URL,
QUANTITY,
NUTRITION_GRADE_FR,
BARCODE,
ECOSCORE,
NOVA_GROUPS
BRANDS,
PRODUCT_NAME,
IMAGE_SMALL_URL,
QUANTITY,
NUTRITION_GRADE_FR,
BARCODE,
ECOSCORE,
NOVA_GROUPS
)
}
}

0 comments on commit 8c40df2

Please sign in to comment.