From 43b933f5193fa666daff46be05ec0b110a54f2a4 Mon Sep 17 00:00:00 2001 From: VaiTon Date: Sun, 24 Oct 2021 18:46:04 +0200 Subject: [PATCH] fix: disable serving size field if fetched value is wrong Temporary fix for https://github.com/openfoodfacts/openfoodfacts-androidapp/issues/4328 --- .../ProductEditNutritionFactsFragment.kt | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/nutrition/ProductEditNutritionFactsFragment.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/nutrition/ProductEditNutritionFactsFragment.kt index 4172701b97c0..3573592bb4b1 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/nutrition/ProductEditNutritionFactsFragment.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/nutrition/ProductEditNutritionFactsFragment.kt @@ -228,38 +228,38 @@ class ProductEditNutritionFactsFragment : ProductEditFragment() { // Set nutrition data per product!!.nutritionDataPer ?.takeUnless { it.isEmpty() } - ?.let { updateSelectedDataPer(it) } + ?.let(::updateSelectedDataPer) // Set serving size product!!.servingSize ?.takeUnless { it.isEmpty() } // Splits the serving size into value and unit. Example: "15g" into "15" and "g" - ?.let { updateServingSize(it) } + ?.let(::updateServingSize) if (view == null) return val nutriments = product!!.nutriments - binding.energyKj.setText(nutriments.getEnergyKjValue(isDataPerServing)?.let { getRoundNumber(it) }) - binding.energyKcal.setText(nutriments.getEnergyKcalValue(isDataPerServing)?.let { getRoundNumber(it) }) + binding.energyKj.setText(nutriments.getEnergyKjValue(isDataPerServing)?.let(::getRoundNumber)) + binding.energyKcal.setText(nutriments.getEnergyKcalValue(isDataPerServing)?.let(::getRoundNumber)) // Fill default nutriments fields - for (view in (view as ViewGroup).getViewsByType(CustomValidatingEditTextView::class.java)) { - var nutrimentShortName = view.entryName + for (editView in (view as ViewGroup).getViewsByType(CustomValidatingEditTextView::class.java)) { + var nutrimentShortName = editView.entryName // Workaround for saturated-fat if (nutrimentShortName == "saturated_fat") nutrimentShortName = "saturated-fat" // Skip serving size and energy view, we already filled them - if (view === binding.servingSize || view === binding.energyKcal || view === binding.energyKj) continue + if (editView === binding.servingSize || editView === binding.energyKcal || editView === binding.energyKj) continue // Get the value val nutriment = Nutriment.findbyKey(nutrimentShortName) ?: error("Cannot find nutrient $nutrimentShortName") val value = (if (isDataPer100g) nutriments[nutriment]?.per100gInUnit else nutriments[nutriment]?.perServingInUnit) ?: continue - view.setText(getRoundNumber(value)) - view.unitSpinner?.setSelection(getUnitIndexUnitFromShortName(nutriments, nutriment) ?: 0) - view.modSpinner?.setSelection(getModifierIndexFromShortName(nutriments, nutriment)) + editView.setText(getRoundNumber(value)) + editView.unitSpinner?.setSelection(getUnitIndexUnitFromShortName(nutriments, nutriment) ?: 0) + editView.modSpinner?.setSelection(getModifierIndexFromShortName(nutriments, nutriment)) } // Set the values of all the other nutrients if defined and create new row in the tableLayout. @@ -310,16 +310,21 @@ class ProductEditNutritionFactsFragment : ProductEditFragment() { getModifierIndex(nutriments[nutriment]?.modifier) private fun updateServingSize(servingSize: String) { - try { - val (value, unit) = parseServing(servingSize) - - binding.servingSize.setText(value) + val (value, unit) = try { + parseServing(servingSize) + } catch (ex: IllegalArgumentException) { + // Serving size not not matching size regex. Incorrect format + sentryAnalytics.record(ex) + + // Disable fields and return + binding.servingSize.isEnabled = false + binding.servingSize.unitSpinner?.isEnabled = false + return + } - if (unit != null) { - binding.servingSize.unitSpinner?.setSelection(getServingUnitIndex(unit)) - } - } catch (exception : IllegalArgumentException) { - binding.servingSize.setText("") + binding.servingSize.setText(value) + if (unit != null) { + binding.servingSize.unitSpinner?.setSelection(getServingUnitIndex(unit)) } }