Skip to content

Commit

Permalink
refactor: move methods of SearchProduct to extensions
Browse files Browse the repository at this point in the history
  • Loading branch information
VaiTon committed Mar 18, 2023
1 parent 3483b1a commit 1e49f85
Show file tree
Hide file tree
Showing 14 changed files with 67 additions and 56 deletions.
Expand Up @@ -16,6 +16,7 @@ import openfoodfacts.github.scrachx.openfood.images.ImageSize
import openfoodfacts.github.scrachx.openfood.images.createImageBundle
import openfoodfacts.github.scrachx.openfood.models.Product
import openfoodfacts.github.scrachx.openfood.models.ProductImageField
import openfoodfacts.github.scrachx.openfood.models.getSelectedImageUrl
import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository
import openfoodfacts.github.scrachx.openfood.utils.Intent
import openfoodfacts.github.scrachx.openfood.utils.isAbsoluteUrl
Expand Down Expand Up @@ -99,7 +100,7 @@ object FullScreenActivityOpener {
language: String,
) {
client.getProductImages(product.barcode).product?.let { newProduct ->
val imageUrl = newProduct.getSelectedImage(language, imageType, ImageSize.DISPLAY)
val imageUrl = newProduct.getSelectedImageUrl(language, imageType, ImageSize.DISPLAY)
if (!imageUrl.isNullOrBlank()) {
openForUrl(activity, client, newProduct, imageType, imageUrl, mImageFront, language)
} else {
Expand Down
Expand Up @@ -14,6 +14,7 @@ import openfoodfacts.github.scrachx.openfood.AppFlavor.Companion.isFlavors
import openfoodfacts.github.scrachx.openfood.AppFlavor.OFF
import openfoodfacts.github.scrachx.openfood.R
import openfoodfacts.github.scrachx.openfood.models.SearchProduct
import openfoodfacts.github.scrachx.openfood.models.getSmallFrontImageUrl
import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository
import openfoodfacts.github.scrachx.openfood.utils.LocaleManager
import openfoodfacts.github.scrachx.openfood.utils.getEcoscoreResource
Expand Down Expand Up @@ -47,7 +48,7 @@ class ProductSearchAdapter(
val product = products[position]!!

holder.imageProgress.visibility = View.VISIBLE
val imageSmallUrl = product.getImageSmallUrl(localeManager.getLanguage())
val imageSmallUrl = product.getSmallFrontImageUrl(localeManager.getLanguage())
if (imageSmallUrl == null) {
holder.imageProgress.visibility = View.GONE
}
Expand Down
Expand Up @@ -47,6 +47,7 @@ import openfoodfacts.github.scrachx.openfood.models.Product
import openfoodfacts.github.scrachx.openfood.models.ProductImageField
import openfoodfacts.github.scrachx.openfood.models.buildLevelItem
import openfoodfacts.github.scrachx.openfood.models.entities.additive.AdditiveName
import openfoodfacts.github.scrachx.openfood.models.getFrontImageUrl
import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository
import openfoodfacts.github.scrachx.openfood.utils.MY_PERMISSIONS_REQUEST_CAMERA
import openfoodfacts.github.scrachx.openfood.utils.getEcoscoreResource
Expand Down Expand Up @@ -115,7 +116,7 @@ class ProductCompareAdapter(
addProductButton.setText(R.string.add_another_product)

// Image
val imageUrl = product.getImageUrl(language)
val imageUrl = product.getFrontImageUrl(language)
holder.binding.productComparisonImage.setOnClickListener {
if (imageUrl != null) {
lifecycleOwner.lifecycle.coroutineScope.launchWhenCreated {
Expand Down
Expand Up @@ -71,6 +71,7 @@ import openfoodfacts.github.scrachx.openfood.models.LanguageData
import openfoodfacts.github.scrachx.openfood.models.Product
import openfoodfacts.github.scrachx.openfood.models.ProductImageField
import openfoodfacts.github.scrachx.openfood.models.findByCode
import openfoodfacts.github.scrachx.openfood.models.getSelectedImageUrl
import openfoodfacts.github.scrachx.openfood.network.ApiFields
import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository
import openfoodfacts.github.scrachx.openfood.utils.FileDownloader
Expand Down Expand Up @@ -410,7 +411,7 @@ class ImagesManageActivity : BaseActivity() {
}

private fun getImageUrlToDisplay(product: Product) =
product.getSelectedImage(getCurrentLanguage(), getSelectedType(), ImageSize.DISPLAY)
product.getSelectedImageUrl(getCurrentLanguage(), getSelectedType(), ImageSize.DISPLAY)

private fun getCurrentImageUrl() = intent.getStringExtra(IMAGE_URL)

Expand Down
Expand Up @@ -51,6 +51,7 @@ import openfoodfacts.github.scrachx.openfood.models.Product
import openfoodfacts.github.scrachx.openfood.models.ProductImageField
import openfoodfacts.github.scrachx.openfood.models.entities.OfflineSavedProduct
import openfoodfacts.github.scrachx.openfood.models.entities.allergen.AllergenNameDao
import openfoodfacts.github.scrachx.openfood.models.getIngredientsImageUrl
import openfoodfacts.github.scrachx.openfood.network.ApiFields
import openfoodfacts.github.scrachx.openfood.network.ApiFields.Keys.lcIngredientsKey
import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository
Expand Down Expand Up @@ -225,7 +226,7 @@ class EditIngredientsFragment : ProductEditFragment() {
if (getAddProductActivity() == null) return

val newImageIngredientsUrl =
product!!.getImageIngredientsUrl(getAddProductActivity()!!.getProductLanguageForEdition())
product!!.getIngredientsImageUrl(getAddProductActivity()!!.getProductLanguageForEdition())
photoFile = null
if (newImageIngredientsUrl != null && newImageIngredientsUrl.isNotEmpty()) {
binding.imageProgress.visibility = View.VISIBLE
Expand Down
Expand Up @@ -30,6 +30,7 @@ import openfoodfacts.github.scrachx.openfood.models.Nutriment
import openfoodfacts.github.scrachx.openfood.models.Product
import openfoodfacts.github.scrachx.openfood.models.ProductImageField
import openfoodfacts.github.scrachx.openfood.models.ProductState
import openfoodfacts.github.scrachx.openfood.models.getPackagingImageUrl
import openfoodfacts.github.scrachx.openfood.network.ApiFields
import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository
import openfoodfacts.github.scrachx.openfood.utils.LocaleManager
Expand Down Expand Up @@ -99,7 +100,7 @@ class EnvironmentProductFragment : BaseFragment() {
product = productState.product!!
val nutriments = product.nutriments

val imagePackagingUrl = product.getImagePackagingUrl(langCode)
val imagePackagingUrl = product.getPackagingImageUrl(langCode)
if (!imagePackagingUrl.isNullOrBlank()) {
binding.packagingImagetipBox.setTipMessage(getString(R.string.onboarding_hint_msg,
getString(R.string.image_edit_tip)))
Expand Down
Expand Up @@ -62,6 +62,7 @@ import openfoodfacts.github.scrachx.openfood.models.entities.SendProduct
import openfoodfacts.github.scrachx.openfood.models.entities.additive.AdditiveName
import openfoodfacts.github.scrachx.openfood.models.entities.allergen.AllergenName
import openfoodfacts.github.scrachx.openfood.models.entities.allergen.AllergenNameDao
import openfoodfacts.github.scrachx.openfood.models.getIngredientsImageUrl
import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository
import openfoodfacts.github.scrachx.openfood.repositories.TaxonomiesRepository
import openfoodfacts.github.scrachx.openfood.repositories.WikidataRepository
Expand Down Expand Up @@ -262,7 +263,7 @@ class IngredientsProductFragment : BaseFragment() {
}


if (!product.getImageIngredientsUrl(langCode).isNullOrBlank()) {
if (!product.getIngredientsImageUrl(langCode).isNullOrBlank()) {
binding.ingredientImagetipBox.setTipMessage(getString(R.string.onboarding_hint_msg,
getString(R.string.image_edit_tip)))
binding.ingredientImagetipBox.loadToolTip()
Expand All @@ -271,11 +272,11 @@ class IngredientsProductFragment : BaseFragment() {

// Load Image if isLowBatteryMode is false
if (!requireContext().isPowerSaveMode()) {
picasso.load(product.getImageIngredientsUrl(langCode)).into(binding.imageViewIngredients)
picasso.load(product.getIngredientsImageUrl(langCode)).into(binding.imageViewIngredients)
} else {
binding.imageViewIngredients.visibility = View.GONE
}
ingredientsImgUrl = product.getImageIngredientsUrl(langCode)
ingredientsImgUrl = product.getIngredientsImageUrl(langCode)
}

//useful when this fragment is used in offline saving
Expand All @@ -299,7 +300,7 @@ class IngredientsProductFragment : BaseFragment() {
}
} else {
binding.cvTextIngredientProduct.visibility = View.GONE
if (!product.getImageIngredientsUrl(langCode).isNullOrBlank()) {
if (!product.getIngredientsImageUrl(langCode).isNullOrBlank()) {
binding.extractIngredientsPrompt.visibility = View.VISIBLE
}
}
Expand Down
Expand Up @@ -98,6 +98,8 @@ import openfoodfacts.github.scrachx.openfood.models.entities.analysistagconfig.A
import openfoodfacts.github.scrachx.openfood.models.entities.category.CategoryName
import openfoodfacts.github.scrachx.openfood.models.entities.label.LabelName
import openfoodfacts.github.scrachx.openfood.models.entities.tag.TagDao
import openfoodfacts.github.scrachx.openfood.models.getFrontImageUrl
import openfoodfacts.github.scrachx.openfood.models.getSmallFrontImageUrl
import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository
import openfoodfacts.github.scrachx.openfood.repositories.RobotoffRepository
import openfoodfacts.github.scrachx.openfood.repositories.TaxonomiesRepository
Expand Down Expand Up @@ -349,7 +351,7 @@ class SummaryProductFragment : BaseFragment(), ISummaryProductPresenter.View {
}

val langCode = localeManager.getLanguage()
val imageUrl = product.getImageUrl(langCode)
val imageUrl = product.getFrontImageUrl(langCode)
if (!imageUrl.isNullOrBlank()) {
binding.addPhotoLabel.visibility = View.GONE

Expand Down Expand Up @@ -907,7 +909,7 @@ class SummaryProductFragment : BaseFragment(), ISummaryProductPresenter.View {
it.listName = list.listName
it.productName = product.productName
it.productDetails = product.getProductBrandsQuantityDetails()
it.imageUrl = product.getImageSmallUrl(localeManager.getLanguage())
it.imageUrl = product.getSmallFrontImageUrl(localeManager.getLanguage())
}
addListedProductToDatabase(product, list)
matomoAnalytics.trackEvent(AnalyticsEvent.ShoppingListProductAdded(product.barcode))
Expand Down
Expand Up @@ -12,6 +12,7 @@ import openfoodfacts.github.scrachx.openfood.models.HistoryProductDao
import openfoodfacts.github.scrachx.openfood.models.Product
import openfoodfacts.github.scrachx.openfood.models.entities.ListedProduct
import openfoodfacts.github.scrachx.openfood.models.entities.ProductLists
import openfoodfacts.github.scrachx.openfood.models.getSmallFrontImageUrl
import openfoodfacts.github.scrachx.openfood.utils.*
import java.util.*
import javax.inject.Inject
Expand Down Expand Up @@ -123,15 +124,15 @@ class ProductListViewModel @Inject constructor(
val product = savedStateHandle.get<Product?>(ProductListActivity.KEY_PRODUCT_TO_ADD) ?: return

val locale = localeManager.getLanguage()
if (product.productName != null && product.getImageSmallUrl(locale) != null) {
if (product.productName != null && product.getSmallFrontImageUrl(locale) != null) {

val listedProduct = ListedProduct().also {
it.listId = listId
it.listName = listName
it.barcode = product.code
it.productName = product.productName
it.productDetails = product.getProductBrandsQuantityDetails()
it.imageUrl = product.getImageSmallUrl(locale)
it.imageUrl = product.getSmallFrontImageUrl(locale)
}

daoSession.listedProductDao.insertOrReplace(listedProduct)
Expand Down
Expand Up @@ -11,6 +11,7 @@ import openfoodfacts.github.scrachx.openfood.R
import openfoodfacts.github.scrachx.openfood.models.DaoSession
import openfoodfacts.github.scrachx.openfood.models.HistoryProduct
import openfoodfacts.github.scrachx.openfood.models.HistoryProductDao
import openfoodfacts.github.scrachx.openfood.models.getSmallFrontImageUrl
import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository
import openfoodfacts.github.scrachx.openfood.utils.*
import javax.inject.Inject
Expand Down Expand Up @@ -64,7 +65,7 @@ class ScanHistoryViewModel @Inject constructor(

product.productName?.let { historyProduct.title = it }
product.brands?.let { historyProduct.brands = it }
product.getImageSmallUrl(localeManager.getLanguage())?.let { historyProduct.url = it }
product.getSmallFrontImageUrl(localeManager.getLanguage())?.let { historyProduct.url = it }
product.quantity?.let { historyProduct.quantity = it }
product.nutritionGradeFr?.let { historyProduct.nutritionGrade = it }
product.ecoscore?.let { historyProduct.ecoscore = it }
Expand Down
Expand Up @@ -291,18 +291,9 @@ class Product : SearchProduct() {
fun getIngredientsText(languageCode: String) =
getFieldForLanguage(ApiFields.Keys.INGREDIENTS_TEXT, languageCode) ?: ingredientsText

fun getImageIngredientsUrl(languageCode: String?): String? {
val result = getSelectedImage(languageCode, ProductImageField.INGREDIENTS, ImageSize.DISPLAY)
return if (!result.isNullOrBlank()) result else imageIngredientsUrl
}

fun getImagePackagingUrl(languageCode: String?): String? {
val result = getSelectedImage(languageCode, ProductImageField.PACKAGING, ImageSize.DISPLAY)
return if (!result.isNullOrBlank()) result else imagePackagingUrl
}

fun getImageNutritionUrl(languageCode: String?): String? {
val result = getSelectedImage(languageCode, ProductImageField.NUTRITION, ImageSize.DISPLAY)
val result = getSelectedImageUrl(languageCode, ProductImageField.NUTRITION, ImageSize.DISPLAY)
return if (!result.isNullOrBlank()) result else imageNutritionUrl
}

Expand Down Expand Up @@ -344,7 +335,7 @@ class Product : SearchProduct() {
}

fun getImageFrontUrl(languageCode: String?): String? {
val image = getSelectedImage(languageCode, ProductImageField.FRONT, ImageSize.DISPLAY)
val image = getSelectedImageUrl(languageCode, ProductImageField.FRONT, ImageSize.DISPLAY)
return if (image.isNullOrBlank()) image else imageFrontUrl
}

Expand All @@ -358,10 +349,6 @@ class Product : SearchProduct() {
fun getProductName(languageCode: String) =
getFieldForLanguage(ApiFields.Keys.PRODUCT_NAME, languageCode) ?: productName

fun getImageUrl(languageCode: String?): String? {
val url = getSelectedImage(languageCode, ProductImageField.FRONT, ImageSize.DISPLAY)
return if (!url.isNullOrBlank()) url else imageUrl
}

fun getNutritionGradeTag(): String? {
if (!additionalProperties.containsKey(ApiFields.Keys.NUTRITION_GRADE)) return null
Expand Down
Expand Up @@ -62,7 +62,7 @@ open class SearchProduct : Serializable {
* @return The imageSmallUrl
*/
@JsonProperty(ApiFields.Keys.IMAGE_SMALL_URL)
protected val imageSmallUrl: String? = null
val imageSmallUrl: String? = null

/**
* A string containing the brands, comma separated
Expand Down Expand Up @@ -93,30 +93,41 @@ open class SearchProduct : Serializable {
additionalProperties[name] = value
}

fun getSelectedImage(languageCode: String?, type: ProductImageField, size: ImageSize): String? {
var images = additionalProperties[ApiFields.Keys.SELECTED_IMAGES] as Map<String?, Map<*, *>>?
if (images != null) {
images = images[type.toString()] as Map<String?, Map<*, *>>?
if (images != null) {
val imagesByLocale = images[size.name.lowercase(Locale.ROOT)] as Map<String?, String>?
if (imagesByLocale != null) {
val url = imagesByLocale[languageCode]
if (!url.isNullOrBlank()) {
return url
}
}
@JsonProperty(ApiFields.Keys.SELECTED_IMAGES)
val selectedImages: Map<String, Map<String, Map<String, String>>>? = null
}

fun SearchProduct.getPackagingImageUrl(languageCode: String?): String? =
getSelectedImageUrl(languageCode, ProductImageField.PACKAGING, ImageSize.DISPLAY)
?.ifBlank { imagePackagingUrl }

fun SearchProduct.getIngredientsImageUrl(languageCode: String?): String? =
getSelectedImageUrl(languageCode, ProductImageField.INGREDIENTS, ImageSize.DISPLAY)
?.ifBlank { imageIngredientsUrl }

fun SearchProduct.getSmallFrontImageUrl(languageCode: String?) =
getSelectedImageUrl(languageCode, ProductImageField.FRONT, ImageSize.SMALL)
?.ifBlank { imageSmallUrl }

fun SearchProduct.getFrontImageUrl(languageCode: String?): String? =
getSelectedImageUrl(languageCode, ProductImageField.FRONT, ImageSize.DISPLAY)
?.ifBlank { imageUrl }

fun SearchProduct.getSelectedImageUrl(languageCode: String?, type: ProductImageField, size: ImageSize): String? {
val sizeLowercase = size.name.lowercase(Locale.ROOT)

val url = selectedImages?.get(type.toString())
?.get(sizeLowercase)
?.get(languageCode)
?.ifBlank {
when (type) {
ProductImageField.FRONT -> imageUrl
ProductImageField.INGREDIENTS -> imageIngredientsUrl
ProductImageField.NUTRITION -> imageNutritionUrl
ProductImageField.PACKAGING -> imagePackagingUrl
ProductImageField.OTHER -> null
}
}
return when (type) {
ProductImageField.FRONT -> imageUrl
ProductImageField.INGREDIENTS -> imageIngredientsUrl
ProductImageField.NUTRITION -> imageNutritionUrl
ProductImageField.PACKAGING -> imagePackagingUrl
ProductImageField.OTHER -> null
}
}

fun getImageSmallUrl(languageCode: String?) =
getSelectedImage(languageCode, ProductImageField.FRONT, ImageSize.SMALL)
?.ifBlank { null } ?: imageSmallUrl
return url
}
Expand Up @@ -11,6 +11,7 @@ import logcat.logcat
import openfoodfacts.github.scrachx.openfood.images.IMAGE_URL
import openfoodfacts.github.scrachx.openfood.models.DaoSession
import openfoodfacts.github.scrachx.openfood.models.HistoryProduct
import openfoodfacts.github.scrachx.openfood.models.getSmallFrontImageUrl
import openfoodfacts.github.scrachx.openfood.network.ApiFields
import openfoodfacts.github.scrachx.openfood.utils.CoroutineDispatchers
import openfoodfacts.github.scrachx.openfood.utils.LocaleManager
Expand Down Expand Up @@ -92,7 +93,7 @@ class HistoryRepository @Inject constructor(
val hp = HistoryProduct(
product.productName,
product.brands,
product.getImageSmallUrl(localeManager.getLanguage()),
product.getSmallFrontImageUrl(localeManager.getLanguage()),
product.code,
product.quantity,
product.nutritionGradeFr,
Expand Down
Expand Up @@ -26,6 +26,7 @@ import openfoodfacts.github.scrachx.openfood.models.Search
import openfoodfacts.github.scrachx.openfood.models.entities.OfflineSavedProduct
import openfoodfacts.github.scrachx.openfood.models.entities.ToUploadProduct
import openfoodfacts.github.scrachx.openfood.models.entities.ToUploadProductDao
import openfoodfacts.github.scrachx.openfood.models.getSmallFrontImageUrl
import openfoodfacts.github.scrachx.openfood.network.ApiFields
import openfoodfacts.github.scrachx.openfood.network.ApiFields.Keys
import openfoodfacts.github.scrachx.openfood.network.ApiFields.getAllFields
Expand Down Expand Up @@ -406,7 +407,7 @@ class ProductRepository @Inject constructor(
val hp = HistoryProduct(
product.productName,
product.brands,
product.getImageSmallUrl(language),
product.getSmallFrontImageUrl(language),
product.barcode.raw,
product.quantity,
product.nutritionGradeFr,
Expand Down

0 comments on commit 1e49f85

Please sign in to comment.