Skip to content

Commit

Permalink
fix: ModifierTest.kt
Browse files Browse the repository at this point in the history
refactor: made ImageTransformation.kt immutable
  • Loading branch information
VaiTon committed Aug 21, 2022
1 parent fe8f54f commit 1785cff
Show file tree
Hide file tree
Showing 6 changed files with 191 additions and 121 deletions.
Expand Up @@ -49,16 +49,40 @@ import openfoodfacts.github.scrachx.openfood.features.adapters.LanguageDataAdapt
import openfoodfacts.github.scrachx.openfood.features.images.select.ImagesSelectActivity
import openfoodfacts.github.scrachx.openfood.features.login.LoginActivity
import openfoodfacts.github.scrachx.openfood.features.shared.BaseActivity
import openfoodfacts.github.scrachx.openfood.images.*
import openfoodfacts.github.scrachx.openfood.images.IMAGE_STRING_ID
import openfoodfacts.github.scrachx.openfood.images.IMAGE_TYPE
import openfoodfacts.github.scrachx.openfood.images.IMAGE_URL
import openfoodfacts.github.scrachx.openfood.images.IMG_ID
import openfoodfacts.github.scrachx.openfood.images.ImageSize
import openfoodfacts.github.scrachx.openfood.images.ImageTransformation
import openfoodfacts.github.scrachx.openfood.images.LANGUAGE
import openfoodfacts.github.scrachx.openfood.images.PRODUCT
import openfoodfacts.github.scrachx.openfood.images.PRODUCT_BARCODE
import openfoodfacts.github.scrachx.openfood.images.ProductImage
import openfoodfacts.github.scrachx.openfood.images.getImageStringKey
import openfoodfacts.github.scrachx.openfood.images.getInitialServerTransformation
import openfoodfacts.github.scrachx.openfood.images.getLanguageCodeFromUrl
import openfoodfacts.github.scrachx.openfood.images.getResourceId
import openfoodfacts.github.scrachx.openfood.images.getResourceIdForEditAction
import openfoodfacts.github.scrachx.openfood.images.getScreenTransformation
import openfoodfacts.github.scrachx.openfood.images.toServerTransformation
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.network.ApiFields
import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository
import openfoodfacts.github.scrachx.openfood.utils.*
import openfoodfacts.github.scrachx.openfood.utils.FileDownloader
import openfoodfacts.github.scrachx.openfood.utils.LocaleManager
import openfoodfacts.github.scrachx.openfood.utils.LocaleUtils
import openfoodfacts.github.scrachx.openfood.utils.PhotoReceiverHandler
import openfoodfacts.github.scrachx.openfood.utils.SupportedLanguages
import openfoodfacts.github.scrachx.openfood.utils.SwipeDetector
import openfoodfacts.github.scrachx.openfood.utils.SwipeDetector.OnSwipeEventListener
import openfoodfacts.github.scrachx.openfood.utils.SwipeDetector.SwipeTypeEnum
import openfoodfacts.github.scrachx.openfood.utils.getAppPreferences
import openfoodfacts.github.scrachx.openfood.utils.isAbsoluteUrl
import openfoodfacts.github.scrachx.openfood.utils.isUserSet
import org.apache.commons.lang3.StringUtils
import pl.aprilapps.easyphotopicker.EasyImage
import smartdevelop.ir.eram.showcaseviewlib.GuideView
Expand Down Expand Up @@ -121,7 +145,10 @@ class ImagesManageActivity : BaseActivity() {
}
settings.let {
if (it.getBoolean(getString(R.string.check_first_time), true)) {
startShowCase(getString(R.string.title_image_type), getString(R.string.content_image_type), R.id.comboImageType, 1)
startShowCase(getString(R.string.title_image_type),
getString(R.string.content_image_type),
R.id.comboImageType,
1)
}
}

Expand Down Expand Up @@ -172,12 +199,30 @@ class ImagesManageActivity : BaseActivity() {
.setDismissType(GuideView.DismissType.outside)
.setGuideListener {
when (type) {
1 -> startShowCase(getString(R.string.title_choose_language), getString(R.string.content_choose_language), R.id.comboLanguages, 2)
2 -> startShowCase(getString(R.string.title_add_photo), getString(R.string.content_add_photo), R.id.btnAddImage, 3)
3 -> startShowCase(getString(R.string.title_choose_photo), getString(R.string.content_choose_photo), R.id.btnChooseImage, 4)
4 -> startShowCase(getString(R.string.title_edit_photo), getString(R.string.content_edit_photo), R.id.btnEditImage, 5)
5 -> startShowCase(getString(R.string.title_unselect_photo), getString(R.string.content_unselect_photo), R.id.btnUnselectImage, 6)
6 -> startShowCase(getString(R.string.title_exit), getString(R.string.content_exit), R.id.btn_done, 7)
1 -> startShowCase(getString(R.string.title_choose_language),
getString(R.string.content_choose_language),
R.id.comboLanguages,
2)
2 -> startShowCase(getString(R.string.title_add_photo),
getString(R.string.content_add_photo),
R.id.btnAddImage,
3)
3 -> startShowCase(getString(R.string.title_choose_photo),
getString(R.string.content_choose_photo),
R.id.btnChooseImage,
4)
4 -> startShowCase(getString(R.string.title_edit_photo),
getString(R.string.content_edit_photo),
R.id.btnEditImage,
5)
5 -> startShowCase(getString(R.string.title_unselect_photo),
getString(R.string.content_unselect_photo),
R.id.btnUnselectImage,
6)
6 -> startShowCase(getString(R.string.title_exit),
getString(R.string.content_exit),
R.id.btn_done,
7)
7 -> settings.edit { putBoolean(getString(R.string.check_first_time), false) }
}
}
Expand Down Expand Up @@ -260,7 +305,8 @@ class ImagesManageActivity : BaseActivity() {

private fun updateToolbarTitle(product: Product?) {
product?.let {
binding.toolbar.title = "${it.getProductName(localeManager.getLanguage()).orEmpty()} / ${binding.comboImageType.selectedItem}"
binding.toolbar.title =
"${it.getProductName(localeManager.getLanguage()).orEmpty()} / ${binding.comboImageType.selectedItem}"
}
}

Expand Down Expand Up @@ -299,7 +345,9 @@ class ImagesManageActivity : BaseActivity() {
override fun onError(ex: Exception) {
if (_binding == null) return
binding.imageViewFullScreen.visibility = View.VISIBLE
Toast.makeText(this@ImagesManageActivity, resources.getString(R.string.txtConnectionError), Toast.LENGTH_LONG).show()
Toast.makeText(this@ImagesManageActivity,
resources.getString(R.string.txtConnectionError),
Toast.LENGTH_LONG).show()
stopRefresh()
}
})
Expand Down Expand Up @@ -450,7 +498,8 @@ class ImagesManageActivity : BaseActivity() {
}

private fun updateSelectDefaultLanguageAction() {
val isDefault = getProduct()?.lang != null && getCurrentLanguage() == LocaleUtils.parseLocale(getProduct()!!.lang).language
val isDefault =
getProduct()?.lang != null && getCurrentLanguage() == LocaleUtils.parseLocale(getProduct()!!.lang).language
binding.btnChooseDefaultLanguage.visibility = if (isDefault) View.INVISIBLE else View.VISIBLE
}

Expand All @@ -465,8 +514,11 @@ class ImagesManageActivity : BaseActivity() {
val transformation = getScreenTransformation(product, productImageField, language)

// The first time, the images properties are not loaded...
if (transformation.isEmpty()) {
updateProductImagesInfo { editPhoto(productImageField, getScreenTransformation(product, productImageField, language)) }
if (transformation.isUrlEmpty()) {
updateProductImagesInfo {
editPhoto(productImageField,
getScreenTransformation(product, productImageField, language))
}
}
editPhoto(productImageField, transformation)
}
Expand Down Expand Up @@ -583,14 +635,17 @@ class ImagesManageActivity : BaseActivity() {
startRefresh(StringUtils.EMPTY)
val result = CropImage.getActivityResult(dataFromCropActivity)!!
val product = requireProduct()
val currentServerTransformation = getInitialServerTransformation(product, getSelectedType(), getCurrentLanguage())
val currentServerTransformation =
getInitialServerTransformation(product, getSelectedType(), getCurrentLanguage())
val newServerTransformation =
toServerTransformation(ImageTransformation(result.rotation, result.cropRect), product, getSelectedType(), getCurrentLanguage())
toServerTransformation(ImageTransformation(result.rotation, result.cropRect),
product,
getSelectedType(),
getCurrentLanguage())
val isModified = currentServerTransformation != newServerTransformation
if (isModified) {
startRefresh(getString(R.string.toastSending))
val imgMap = mutableMapOf(IMG_ID to newServerTransformation.imageId!!)
newServerTransformation.applyToMap(imgMap)
val imgMap = newServerTransformation.toMap() + mapOf(IMG_ID to newServerTransformation.imageId!!)
postEditImage(imgMap)
} else {
stopRefresh()
Expand Down
Expand Up @@ -25,8 +25,13 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
import android.widget.*
import android.widget.AdapterView
import android.widget.AdapterView.OnItemSelectedListener
import android.widget.ArrayAdapter
import android.widget.EditText
import android.widget.Spinner
import android.widget.TableRow
import android.widget.Toast
import androidx.annotation.StringRes
import androidx.core.net.toFile
import androidx.core.view.isVisible
Expand All @@ -51,15 +56,52 @@ import openfoodfacts.github.scrachx.openfood.features.product.edit.ProductEditAc
import openfoodfacts.github.scrachx.openfood.features.product.edit.ProductEditFragment
import openfoodfacts.github.scrachx.openfood.features.shared.views.CustomValidatingEditTextView
import openfoodfacts.github.scrachx.openfood.images.ProductImage
import openfoodfacts.github.scrachx.openfood.models.*
import openfoodfacts.github.scrachx.openfood.models.MeasurementUnit.*
import openfoodfacts.github.scrachx.openfood.models.Nutriment.*
import openfoodfacts.github.scrachx.openfood.models.MeasurementUnit
import openfoodfacts.github.scrachx.openfood.models.MeasurementUnit.UNIT_DV
import openfoodfacts.github.scrachx.openfood.models.MeasurementUnit.UNIT_GRAM
import openfoodfacts.github.scrachx.openfood.models.MeasurementUnit.UNIT_IU
import openfoodfacts.github.scrachx.openfood.models.MeasurementUnit.UNIT_LITER
import openfoodfacts.github.scrachx.openfood.models.MeasurementUnit.UNIT_MICROGRAM
import openfoodfacts.github.scrachx.openfood.models.MeasurementUnit.UNIT_MILLIGRAM
import openfoodfacts.github.scrachx.openfood.models.MeasurementUnit.UNIT_MILLILITRE
import openfoodfacts.github.scrachx.openfood.models.Modifier
import openfoodfacts.github.scrachx.openfood.models.Nutriment
import openfoodfacts.github.scrachx.openfood.models.Nutriment.PH
import openfoodfacts.github.scrachx.openfood.models.Nutriment.STARCH
import openfoodfacts.github.scrachx.openfood.models.Nutriment.VITAMIN_A
import openfoodfacts.github.scrachx.openfood.models.Nutriment.VITAMIN_D
import openfoodfacts.github.scrachx.openfood.models.Nutriment.VITAMIN_E
import openfoodfacts.github.scrachx.openfood.models.Product
import openfoodfacts.github.scrachx.openfood.models.ProductImageField
import openfoodfacts.github.scrachx.openfood.models.ProductNutriments
import openfoodfacts.github.scrachx.openfood.models.entities.OfflineSavedProduct
import openfoodfacts.github.scrachx.openfood.network.ApiFields
import openfoodfacts.github.scrachx.openfood.network.ApiFields.Defaults.NUTRITION_DATA_PER_100G
import openfoodfacts.github.scrachx.openfood.network.ApiFields.Defaults.NUTRITION_DATA_PER_SERVING
import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository
import openfoodfacts.github.scrachx.openfood.utils.*
import openfoodfacts.github.scrachx.openfood.utils.FileDownloader
import openfoodfacts.github.scrachx.openfood.utils.LOCALE_FILE_SCHEME
import openfoodfacts.github.scrachx.openfood.utils.LocaleManager
import openfoodfacts.github.scrachx.openfood.utils.Measurement
import openfoodfacts.github.scrachx.openfood.utils.PhotoReceiverHandler
import openfoodfacts.github.scrachx.openfood.utils.ValueState
import openfoodfacts.github.scrachx.openfood.utils.dpsToPixel
import openfoodfacts.github.scrachx.openfood.utils.getContent
import openfoodfacts.github.scrachx.openfood.utils.getFloatValue
import openfoodfacts.github.scrachx.openfood.utils.getFloatValueOr
import openfoodfacts.github.scrachx.openfood.utils.getRoundNumber
import openfoodfacts.github.scrachx.openfood.utils.getViewsByType
import openfoodfacts.github.scrachx.openfood.utils.grams
import openfoodfacts.github.scrachx.openfood.utils.hasUnit
import openfoodfacts.github.scrachx.openfood.utils.isBlank
import openfoodfacts.github.scrachx.openfood.utils.isNotEmpty
import openfoodfacts.github.scrachx.openfood.utils.isValueDifferent
import openfoodfacts.github.scrachx.openfood.utils.measure
import openfoodfacts.github.scrachx.openfood.utils.modifier
import openfoodfacts.github.scrachx.openfood.utils.parseServing
import openfoodfacts.github.scrachx.openfood.utils.saltToSodium
import openfoodfacts.github.scrachx.openfood.utils.sodiumToSalt
import openfoodfacts.github.scrachx.openfood.utils.toPx
import java.io.File
import java.text.Collator
import java.util.*
Expand Down Expand Up @@ -910,7 +952,7 @@ class ProductEditNutritionFactsFragment : ProductEditFragment() {

val maxPhValue = 14f
// Coerce the value
if (value > maxPhValue || value == maxPhValue && this.isModifierEqualsToGreaterThan()) {
if (value > maxPhValue || value == maxPhValue && this.modSpinner!!.modifier == Modifier.GREATER_THAN) {
setText(maxPhValue.toString())
modSpinner?.setSelection(0)
}
Expand Down
@@ -1,48 +1,23 @@
package openfoodfacts.github.scrachx.openfood.images

import android.graphics.Rect
import org.apache.commons.lang3.builder.ToStringBuilder

class ImageTransformation(
var rotationInDegree: Int = 0,
var cropRectangle: Rect? = null
data class ImageTransformation(
val rotationInDegree: Int = 0,
val cropRectangle: Rect? = null,
var imageUrl: String? = null,
var imageId: String? = null,
) {
var imageUrl: String? = null
var imageId: String? = null
fun isUrlEmpty() = imageUrl.isNullOrBlank()

override fun toString() = ToStringBuilder(this)
.append(rotationInDegree)
.append(cropRectangle)
.append(imageUrl)
.toString()
fun toMap(): Map<String, String> = buildMap {
this[ANGLE] = rotationInDegree.toString()


override fun hashCode(): Int {
var result = rotationInDegree
result = 31 * result + if (cropRectangle != null) cropRectangle.hashCode() else 0
result = 31 * result + if (imageUrl != null) imageUrl.hashCode() else 0
return result
}

fun isEmpty() = imageUrl.isNullOrBlank()
fun isNotEmpty(): Boolean = !isEmpty()

override fun equals(other: Any?): Boolean {
if (this === other) {
return true
}
if (other == null || javaClass != other.javaClass) {
return false
if (cropRectangle != null) {
this[LEFT] = cropRectangle.left.toString()
this[RIGHT] = cropRectangle.right.toString()
this[TOP] = cropRectangle.top.toString()
this[BOTTOM] = cropRectangle.bottom.toString()
}
val that = other as ImageTransformation
if (rotationInDegree != that.rotationInDegree) {
return false
}
if (if (cropRectangle != null) cropRectangle != that.cropRectangle else that.cropRectangle != null) {
return false
}
return if (imageUrl != null) imageUrl == that.imageUrl else that.imageUrl == null
}

}

0 comments on commit 1785cff

Please sign in to comment.