diff options
author | Torsten Grote <t@grobox.de> | 2020-03-02 17:23:15 -0300 |
---|---|---|
committer | Torsten Grote <t@grobox.de> | 2020-03-02 17:23:15 -0300 |
commit | cac721adaf3726f01536fed6eed218a8b76925f2 (patch) | |
tree | b155a4eafdcc83641033d1f204cbc756037271a9 /app | |
parent | 05c2d35a1e490bd3c9cb1d8f2de5f3c98d9cdc27 (diff) | |
download | merchant-terminal-android-cac721adaf3726f01536fed6eed218a8b76925f2.tar.gz merchant-terminal-android-cac721adaf3726f01536fed6eed218a8b76925f2.tar.bz2 merchant-terminal-android-cac721adaf3726f01536fed6eed218a8b76925f2.zip |
Use new i18n JSOn format
Diffstat (limited to 'app')
3 files changed, 71 insertions, 38 deletions
diff --git a/app/src/main/java/net/taler/merchantpos/order/Definitions.kt b/app/src/main/java/net/taler/merchantpos/order/Definitions.kt index 065f2d2..1e6e37b 100644 --- a/app/src/main/java/net/taler/merchantpos/order/Definitions.kt +++ b/app/src/main/java/net/taler/merchantpos/order/Definitions.kt @@ -2,6 +2,8 @@ package net.taler.merchantpos.order import androidx.core.os.LocaleListCompat import com.fasterxml.jackson.annotation.JsonIgnore +import com.fasterxml.jackson.annotation.JsonInclude +import com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL import com.fasterxml.jackson.annotation.JsonProperty import net.taler.merchantpos.Amount import java.util.* @@ -11,30 +13,31 @@ import kotlin.collections.HashMap data class Category( val id: Int, - val name: Map<String, String> + val name: String, + @JsonProperty("name_i18n") + val nameI18n: Map<String, String>? ) { - val defaultName: String? get() = name["_"] var selected: Boolean = false - val localizedName: String get() = getLocalizedString(name, defaultName!!) + val localizedName: String get() = getLocalizedString(nameI18n, name) } abstract class Product { abstract val id: String - abstract val description: Map<String, String> + abstract val description: String + abstract val descriptionI18n: Map<String, String>? abstract val price: String abstract val location: String? @get:JsonIgnore - val defaultDescription: String? - get() = description["_"] - @get:JsonIgnore val localizedDescription: String - get() = getLocalizedString(description, defaultDescription!!) + get() = getLocalizedString(descriptionI18n, description) } data class ConfigProduct( @JsonProperty("product_id") override val id: String, - override val description: Map<String, String>, + override val description: String, + @JsonProperty("description_i18n") + override val descriptionI18n: Map<String, String>?, override val price: String, @JsonProperty("delivery_location") override val location: String?, @@ -61,8 +64,10 @@ data class ConfigProduct( data class ContractProduct( @JsonProperty("product_id") override val id: String, - @get:JsonIgnore - override val description: Map<String, String>, + override val description: String, + @JsonInclude(NON_NULL) + @JsonProperty("description_i18n") + override val descriptionI18n: Map<String, String>?, override val price: String, @JsonProperty("delivery_location") override val location: String?, @@ -71,20 +76,16 @@ data class ContractProduct( constructor(product: ConfigProduct) : this( product.id, product.description, + product.descriptionI18n, product.price, product.location, product.quantity ) - - // TODO remove once backend supports i18n - @get:JsonProperty("description") - val tmpDescription: String - get() = localizedDescription } -private fun getLocalizedString(map: Map<String, String>, default: String): String { +private fun getLocalizedString(map: Map<String, String>?, default: String): String { // just return the default, if it is the only element - if (map.size == 1) return default + if (map == null) return default // create a priority list of language ranges from system locales val locales = LocaleListCompat.getDefault() val priorityList = ArrayList<LanguageRange>(locales.size()) @@ -109,19 +110,10 @@ private fun getLocalizedString(map: Map<String, String>, default: String): Strin data class Order(val id: Int, val availableCategories: Map<Int, Category>) { val products = ArrayList<ConfigProduct>() val title: String = id.toString() - val summary: String // TODO also support i18n map here? - get() { - val categories = HashMap<Category, Int>() - products.forEach { product -> - val categoryId = product.categories[0] - val category = availableCategories.getValue(categoryId) - val oldQuantity = categories[category] ?: 0 - categories[category] = oldQuantity + product.quantity - } - return categories.map { (category, quantity) -> + val summary: String + get() = getCategoryQuantities().map { (category: Category, quantity: Int) -> "$quantity x ${category.localizedName}" - }.joinToString() - } + }.joinToString() val total: Double get() { var total = 0.0 @@ -156,4 +148,45 @@ data class Order(val id: Int, val availableCategories: Map<Int, Category>) { } return this } + + private fun getCategoryQuantities(): HashMap<Category, Int> { + val categories = HashMap<Category, Int>() + products.forEach { product -> + val categoryId = product.categories[0] + val category = availableCategories.getValue(categoryId) + val oldQuantity = categories[category] ?: 0 + categories[category] = oldQuantity + product.quantity + } + return categories + } + + /** + * Returns a map of i18n summaries for each locale present in *all* given [Category]s + * or null if there's no locale that fulfills this criteria. + */ + val summaryI18n: Map<String, String>? + get() { + val categoryQuantities = getCategoryQuantities() + // get all available locales + val availableLocales = categoryQuantities.mapNotNull { (category, _) -> + val nameI18n = category.nameI18n + // if one category doesn't have locales, we can return null here already + nameI18n?.keys ?: return null + }.flatten().toHashSet() + // remove all locales not supported by all categories + categoryQuantities.forEach { (category, _) -> + // category.nameI18n should be non-null now + availableLocales.retainAll(category.nameI18n!!.keys) + if (availableLocales.isEmpty()) return null + } + return availableLocales.map { locale -> + Pair( + locale, categoryQuantities.map { (category, quantity) -> + // category.nameI18n should be non-null now + "$quantity x ${category.nameI18n!![locale]}" + }.joinToString() + ) + }.toMap() + } + } diff --git a/app/src/main/java/net/taler/merchantpos/order/OrderManager.kt b/app/src/main/java/net/taler/merchantpos/order/OrderManager.kt index 7fdefbb..21738bb 100644 --- a/app/src/main/java/net/taler/merchantpos/order/OrderManager.kt +++ b/app/src/main/java/net/taler/merchantpos/order/OrderManager.kt @@ -54,10 +54,6 @@ class OrderManager(private val mapper: ObjectMapper) : ConfigurationReceiver { productsByCategory.clear() val seenIds = ArrayList<String>() products.forEach { product -> - if (product.defaultDescription == null) { - Log.e(TAG, "Product $product has no default description \"_\"") - return false - } val productCurrency = fromString(product.price).currency if (productCurrency != currency) { Log.e(TAG, "Product $product has currency $productCurrency, $currency expected") @@ -77,10 +73,6 @@ class OrderManager(private val mapper: ObjectMapper) : ConfigurationReceiver { if (productsByCategory.containsKey(category)) { productsByCategory[category]?.add(product) } else { - if (category.defaultName == null) { - Log.e(TAG, "Category $category has no default description \"_\"") - return false - } productsByCategory[category] = ArrayList<ConfigProduct>().apply { add(product) } } } diff --git a/app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt b/app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt index 8167f86..c5ea6ec 100644 --- a/app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt +++ b/app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt @@ -32,6 +32,10 @@ class PaymentManager( private val mapper: ObjectMapper ) { + companion object { + val TAG = PaymentManager::class.java.simpleName + } + private val mPayment = MutableLiveData<Payment>() val payment: LiveData<Payment> = mPayment @@ -54,6 +58,7 @@ class PaymentManager( val currency = merchantConfig.currency!! val amount = "$currency:${order.totalAsString}" val summary = order.summary + val summaryI18n = order.summaryI18n mPayment.value = Payment(order, summary, currency) @@ -64,6 +69,7 @@ class PaymentManager( put("order", JSONObject().apply { put("amount", amount) put("summary", summary) + if (summaryI18n != null) put("summary_i18n", order.summaryI18n) // fulfillment_url needs to be unique per order put("fulfillment_url", fulfillmentUrl) put("instance", "default") @@ -71,6 +77,8 @@ class PaymentManager( }) } + Log.d(TAG, body.toString(4)) + val req = MerchantRequest(POST, merchantConfig, "order", null, body, Listener { onOrderCreated(it) }, ErrorListener { onNetworkError(it) } |