gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-merchant-terminal-android] 15/19: Introduce different product cla


From: gnunet
Subject: [taler-merchant-terminal-android] 15/19: Introduce different product classes for re-use in other taler apps
Date: Fri, 21 Feb 2020 19:00:08 +0100

This is an automated email from the git hooks/post-receive script.

torsten-grote pushed a commit to branch master
in repository merchant-terminal-android.

commit 4734bd6e19efc7cc37d138c8c63850cb36a596ba
Author: Torsten Grote <address@hidden>
AuthorDate: Fri Feb 14 10:49:32 2020 -0300

    Introduce different product classes for re-use in other taler apps
---
 .../net/taler/merchantpos/order/Definitions.kt     | 47 ++++++++++++++++------
 .../net/taler/merchantpos/order/OrderManager.kt    | 14 +++----
 .../taler/merchantpos/order/OrderStateFragment.kt  |  2 +-
 .../taler/merchantpos/order/ProductsFragment.kt    | 10 ++---
 .../taler/merchantpos/payment/PaymentManager.kt    | 14 ++-----
 5 files changed, 52 insertions(+), 35 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 ee17655..57666d7 100644
--- a/app/src/main/java/net/taler/merchantpos/order/Definitions.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/Definitions.kt
@@ -1,6 +1,5 @@
 package net.taler.merchantpos.order
 
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties
 import com.fasterxml.jackson.annotation.JsonProperty
 import net.taler.merchantpos.Amount
 
@@ -11,21 +10,45 @@ data class Category(
     var selected: Boolean = false
 }
 
-@JsonIgnoreProperties("priceAsDouble")
-data class Product(
+interface Product {
+    val id: String
+    val description: String
+    val price: String
+    val location: String?
+}
+
+data class ConfigProduct(
     @JsonProperty("product_id")
-    val id: String,
-    val description: String,
-    val price: String,
-    val categories: List<Int>,
+    override val id: String,
+    override val description: String,
+    override val price: String,
     @JsonProperty("delivery_location")
-    val location: String
-) {
+    override val location: String?,
+    val categories: List<Int>
+) : Product {
     val priceAsDouble by lazy { Amount.fromString(price).amount.toDouble() }
 }
 
+data class ContractProduct(
+    @JsonProperty("product_id")
+    override val id: String,
+    override val description: String,
+    override val price: String,
+    @JsonProperty("delivery_location")
+    override val location: String?,
+    val quantity: Int
+) : Product {
+    constructor(product: ConfigProduct, quantity: Int) : this(
+        product.id,
+        product.description,
+        product.price,
+        product.location,
+        quantity
+    )
+}
+
 data class Order(val availableCategories: Map<Int, Category>) {
-    val products = HashMap<Product, Int>()
+    val products = HashMap<ConfigProduct, Int>()
     val summary: String
         get() {
             val categories = HashMap<Category, Int>()
@@ -51,10 +74,10 @@ data class Order(val availableCategories: Map<Int, 
Category>) {
     val totalAsString: String
         get() = String.format("%.2f", total)
 
-    operator fun plus(product: Product): Order {
+    operator fun plus(product: ConfigProduct): Order {
         products[product] = (products[product] ?: 0) + 1
         return this
     }
 }
 
-typealias OrderLine = Pair<Product, Int>
+typealias OrderLine = Pair<ConfigProduct, Int>
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 55a3be6..124e73a 100644
--- a/app/src/main/java/net/taler/merchantpos/order/OrderManager.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/OrderManager.kt
@@ -22,7 +22,7 @@ class OrderManager(private val mapper: ObjectMapper) : 
ConfigurationReceiver {
         val TAG = OrderManager::class.java.simpleName
     }
 
-    private val productsByCategory = HashMap<Category, ArrayList<Product>>()
+    private val productsByCategory = HashMap<Category, 
ArrayList<ConfigProduct>>()
 
     private val mOrder = MutableLiveData<Order>()
     private val newOrder  // an empty order containing only available 
categories
@@ -30,8 +30,8 @@ class OrderManager(private val mapper: ObjectMapper) : 
ConfigurationReceiver {
     internal val order: LiveData<Order> = mOrder
     internal val orderTotal: LiveData<Double> = map(mOrder) { it.total }
 
-    private val mProducts = MutableLiveData<List<Product>>()
-    internal val products: LiveData<List<Product>> = mProducts
+    private val mProducts = MutableLiveData<List<ConfigProduct>>()
+    internal val products: LiveData<List<ConfigProduct>> = mProducts
 
     private val mCategories = MutableLiveData<List<Category>>()
     internal val categories: LiveData<List<Category>> = mCategories
@@ -55,8 +55,8 @@ class OrderManager(private val mapper: ObjectMapper) : 
ConfigurationReceiver {
 
         // parse products (live data gets updated in setCurrentCategory())
         val productsStr = json.getJSONArray("products").toString()
-        val productsType = object : TypeReference<List<Product>>() {}
-        val products: List<Product> = mapper.readValue(productsStr, 
productsType)
+        val productsType = object : TypeReference<List<ConfigProduct>>() {}
+        val products: List<ConfigProduct> = mapper.readValue(productsStr, 
productsType)
 
         // group products by categories
         productsByCategory.clear()
@@ -75,7 +75,7 @@ class OrderManager(private val mapper: ObjectMapper) : 
ConfigurationReceiver {
                 if (productsByCategory.containsKey(category)) {
                     productsByCategory[category]?.add(product)
                 } else {
-                    productsByCategory[category] = ArrayList<Product>().apply 
{ add(product) }
+                    productsByCategory[category] = 
ArrayList<ConfigProduct>().apply { add(product) }
                 }
             }
         }
@@ -98,7 +98,7 @@ class OrderManager(private val mapper: ObjectMapper) : 
ConfigurationReceiver {
     }
 
     @UiThread
-    internal fun addProduct(product: Product) {
+    internal fun addProduct(product: ConfigProduct) {
         val order = mOrder.value ?: newOrder
         mOrder.value = order + product
         mRestartState.value = ENABLED
diff --git 
a/app/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt 
b/app/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt
index 9948599..6a0aa2b 100644
--- a/app/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt
@@ -65,7 +65,7 @@ private class OrderAdapter : 
RecyclerView.Adapter<OrderViewHolder>() {
         holder.bind(orderLines[position])
     }
 
-    fun setItems(items: HashMap<Product, Int>) {
+    fun setItems(items: HashMap<ConfigProduct, Int>) {
         orderLines.clear()
         items.forEach { t -> orderLines.add(t.toPair()) }
         notifyDataSetChanged()
diff --git a/app/src/main/java/net/taler/merchantpos/order/ProductsFragment.kt 
b/app/src/main/java/net/taler/merchantpos/order/ProductsFragment.kt
index 0fef4bd..d680fff 100644
--- a/app/src/main/java/net/taler/merchantpos/order/ProductsFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/ProductsFragment.kt
@@ -18,7 +18,7 @@ import net.taler.merchantpos.R
 import net.taler.merchantpos.order.ProductAdapter.ProductViewHolder
 
 interface ProductSelectionListener {
-    fun onProductSelected(product: Product)
+    fun onProductSelected(product: ConfigProduct)
 }
 
 class ProductsFragment : Fragment(), ProductSelectionListener {
@@ -51,7 +51,7 @@ class ProductsFragment : Fragment(), ProductSelectionListener 
{
         })
     }
 
-    override fun onProductSelected(product: Product) {
+    override fun onProductSelected(product: ConfigProduct) {
         orderManager.addProduct(product)
     }
 
@@ -61,7 +61,7 @@ private class ProductAdapter(
     private val listener: ProductSelectionListener
 ) : Adapter<ProductViewHolder>() {
 
-    private val products = ArrayList<Product>()
+    private val products = ArrayList<ConfigProduct>()
 
     override fun getItemCount() = products.size
 
@@ -75,7 +75,7 @@ private class ProductAdapter(
         holder.bind(products[position])
     }
 
-    fun setItems(items: List<Product>) {
+    fun setItems(items: List<ConfigProduct>) {
         products.clear()
         products.addAll(items)
         notifyDataSetChanged()
@@ -85,7 +85,7 @@ private class ProductAdapter(
         private val name: TextView = v.findViewById(R.id.name)
         private val price: TextView = v.findViewById(R.id.price)
 
-        fun bind(product: Product) {
+        fun bind(product: ConfigProduct) {
             name.text = product.description
             price.text = product.priceAsDouble.toString()
             v.setOnClickListener { listener.onProductSelected(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 258149e..30b417d 100644
--- a/app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt
+++ b/app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt
@@ -12,9 +12,9 @@ import com.android.volley.Response.ErrorListener
 import com.android.volley.Response.Listener
 import com.android.volley.VolleyError
 import com.fasterxml.jackson.databind.ObjectMapper
-import com.fasterxml.jackson.databind.node.ObjectNode
 import net.taler.merchantpos.config.ConfigManager
 import net.taler.merchantpos.config.MerchantRequest
+import net.taler.merchantpos.order.ContractProduct
 import net.taler.merchantpos.order.Order
 import org.json.JSONArray
 import org.json.JSONObject
@@ -79,15 +79,9 @@ class PaymentManager(
     }
 
     private fun Order.getProductsJson(): JSONArray {
-        val json = JSONArray()
-        products.forEach { (product, quantity) ->
-            val node = mapper.valueToTree<ObjectNode>(product).apply {
-                remove("categories")
-                put("quantity", quantity)
-            }
-            json.put(JSONObject(mapper.writeValueAsString(node)))
-        }
-        return json
+        val contractProducts = products.map { ContractProduct(it.key, 
it.value) }
+        val productsStr = mapper.writeValueAsString(contractProducts)
+        return JSONArray(productsStr)
     }
 
     private fun onOrderCreated(orderResponse: JSONObject) {

-- 
To stop receiving notification emails like this one, please contact
address@hidden.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]