summaryrefslogtreecommitdiff
path: root/merchant-terminal/src/main/java/net/taler
diff options
context:
space:
mode:
Diffstat (limited to 'merchant-terminal/src/main/java/net/taler')
-rw-r--r--merchant-terminal/src/main/java/net/taler/merchantpos/MainActivity.kt4
-rw-r--r--merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigFetcherFragment.kt4
-rw-r--r--merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigFragment.kt10
-rw-r--r--merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigManager.kt5
-rw-r--r--merchant-terminal/src/main/java/net/taler/merchantpos/config/PosConfig.kt4
-rw-r--r--merchant-terminal/src/main/java/net/taler/merchantpos/order/CustomDialogFragment.kt13
-rw-r--r--merchant-terminal/src/main/java/net/taler/merchantpos/order/LiveOrder.kt4
-rw-r--r--merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderManager.kt4
-rw-r--r--merchant-terminal/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt8
-rw-r--r--merchant-terminal/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt4
10 files changed, 36 insertions, 24 deletions
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/MainActivity.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/MainActivity.kt
index 5609429..4a46b27 100644
--- a/merchant-terminal/src/main/java/net/taler/merchantpos/MainActivity.kt
+++ b/merchant-terminal/src/main/java/net/taler/merchantpos/MainActivity.kt
@@ -75,8 +75,8 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener {
override fun onStart() {
super.onStart()
- if (!model.configManager.config.isValid() && nav.currentDestination?.id != R.id.nav_settings) {
- nav.navigate(R.id.action_global_merchantSettings)
+ if (!model.configManager.config.isValid()) {
+ if (nav.currentDestination?.id != R.id.nav_settings) nav.navigate(R.id.action_global_merchantSettings)
} else if (model.configManager.merchantConfig == null && nav.currentDestination?.id != R.id.configFetcher) {
nav.navigate(R.id.action_global_configFetcher)
}
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigFetcherFragment.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigFetcherFragment.kt
index 5564447..9e82a5a 100644
--- a/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigFetcherFragment.kt
+++ b/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigFetcherFragment.kt
@@ -45,9 +45,7 @@ class ConfigFetcherFragment : Fragment() {
return ui.root
}
- @Deprecated("Deprecated in Java")
- override fun onActivityCreated(savedInstanceState: Bundle?) {
- super.onActivityCreated(savedInstanceState)
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
configManager.fetchConfig(configManager.config, false)
configManager.configUpdateResult.observe(viewLifecycleOwner) { result ->
when (result) {
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigFragment.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigFragment.kt
index 3ee5148..9a5b7a7 100644
--- a/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigFragment.kt
+++ b/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigFragment.kt
@@ -49,7 +49,7 @@ class ConfigFragment : Fragment() {
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
- ): View? {
+ ): View {
ui = FragmentMerchantConfigBinding.inflate(inflater, container, false)
return ui.root
}
@@ -74,11 +74,11 @@ class ConfigFragment : Fragment() {
password = ui.passwordView.editText!!.text.toString()
)
configManager.fetchConfig(config, true, ui.savePasswordCheckBox.isChecked)
- configManager.configUpdateResult.observe(viewLifecycleOwner, { result ->
+ configManager.configUpdateResult.observe(viewLifecycleOwner) { result ->
if (onConfigUpdate(result)) {
configManager.configUpdateResult.removeObservers(viewLifecycleOwner)
}
- })
+ }
}
ui.forgetPasswordButton.setOnClickListener {
configManager.forgetPassword()
@@ -93,8 +93,8 @@ class ConfigFragment : Fragment() {
super.onStart()
// focus password if this is the only empty field
if (ui.passwordView.editText!!.text.isBlank()
- && !ui.configUrlView.editText!!.text.isBlank()
- && !ui.usernameView.editText!!.text.isBlank()
+ && ui.configUrlView.editText!!.text.isNotBlank()
+ && ui.usernameView.editText!!.text.isNotBlank()
) {
ui.passwordView.requestFocus()
}
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigManager.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigManager.kt
index 8986fc0..70c7b18 100644
--- a/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigManager.kt
+++ b/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigManager.kt
@@ -40,6 +40,7 @@ import net.taler.common.getIncompatibleStringOrNull
import net.taler.merchantlib.ConfigResponse
import net.taler.merchantlib.MerchantApi
import net.taler.merchantlib.MerchantConfig
+import net.taler.merchantpos.BuildConfig
import net.taler.merchantpos.R
private const val SETTINGS_NAME = "taler-merchant-terminal"
@@ -52,7 +53,7 @@ internal const val CONFIG_URL_DEMO = "https://docs.taler.net/_static/sample-pos-
internal const val CONFIG_USERNAME_DEMO = ""
internal const val CONFIG_PASSWORD_DEMO = ""
-private val VERSION = Version(3, 0, 1)
+private val VERSION = Version.parse(BuildConfig.BACKEND_API_VERSION)!!
private val TAG = ConfigManager::class.java.simpleName
@@ -74,7 +75,7 @@ class ConfigManager(
private val configurationReceivers = ArrayList<ConfigurationReceiver>()
var config = Config(
- configUrl = prefs.getString(SETTINGS_CONFIG_URL, CONFIG_URL_DEMO)!!,
+ configUrl = prefs.getString(SETTINGS_CONFIG_URL, "")!!,
username = prefs.getString(SETTINGS_USERNAME, CONFIG_USERNAME_DEMO)!!,
password = prefs.getString(SETTINGS_PASSWORD, CONFIG_PASSWORD_DEMO)!!
)
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/config/PosConfig.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/config/PosConfig.kt
index 1f1ab74..556f05f 100644
--- a/merchant-terminal/src/main/java/net/taler/merchantpos/config/PosConfig.kt
+++ b/merchant-terminal/src/main/java/net/taler/merchantpos/config/PosConfig.kt
@@ -31,8 +31,8 @@ data class Config(
val username: String,
val password: String
) {
- fun isValid() = !configUrl.isBlank()
- fun hasPassword() = !password.isBlank()
+ fun isValid() = configUrl.isNotBlank()
+ fun hasPassword() = password.isNotBlank()
}
@Serializable
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/order/CustomDialogFragment.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/order/CustomDialogFragment.kt
index bf14aae..45aaf06 100644
--- a/merchant-terminal/src/main/java/net/taler/merchantpos/order/CustomDialogFragment.kt
+++ b/merchant-terminal/src/main/java/net/taler/merchantpos/order/CustomDialogFragment.kt
@@ -20,10 +20,14 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import android.widget.Toast
+import android.widget.Toast.LENGTH_LONG
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.activityViewModels
import net.taler.common.Amount
+import net.taler.common.AmountParserException
import net.taler.merchantpos.MainViewModel
+import net.taler.merchantpos.R
import net.taler.merchantpos.config.ConfigProduct
import net.taler.merchantpos.databinding.FragmentCustomDialogBinding
@@ -52,9 +56,16 @@ class CustomDialogFragment : DialogFragment() {
ui.addButton.setOnClickListener {
val currentOrderId =
viewModel.orderManager.currentOrderId.value ?: return@setOnClickListener
+ val amount = try {
+ Amount.fromString(currency, ui.amountLayout.editText!!.text.toString())
+ } catch (e: AmountParserException) {
+ Toast.makeText(requireContext(), R.string.refund_error_invalid_amount, LENGTH_LONG)
+ .show()
+ return@setOnClickListener
+ }
val product = ConfigProduct(
description = ui.productNameLayout.editText!!.text.toString(),
- price = Amount.fromString(currency, ui.amountLayout.editText!!.text.toString()),
+ price = amount,
categories = listOf(Int.MIN_VALUE),
)
viewModel.orderManager.addProduct(currentOrderId, product)
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/order/LiveOrder.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/order/LiveOrder.kt
index ad9af74..c11b5c7 100644
--- a/merchant-terminal/src/main/java/net/taler/merchantpos/order/LiveOrder.kt
+++ b/merchant-terminal/src/main/java/net/taler/merchantpos/order/LiveOrder.kt
@@ -19,7 +19,7 @@ package net.taler.merchantpos.order
import androidx.annotation.UiThread
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.Transformations
+import androidx.lifecycle.map
import net.taler.common.Amount
import net.taler.common.CombinedLiveData
import net.taler.merchantpos.config.Category
@@ -52,7 +52,7 @@ internal class MutableLiveOrder(
get() = productsByCategory.keys.map { it.id to it }.toMap()
override val order: MutableLiveData<Order?> =
MutableLiveData(Order(id, currency, availableCategories))
- override val orderTotal: LiveData<Amount> = Transformations.map(order) { it?.total }
+ override val orderTotal: LiveData<Amount> = order.map { it?.total ?: Amount.zero(currency) }
override val restartState = MutableLiveData(DISABLED)
private val selectedOrderLine = MutableLiveData<ConfigProduct?>()
override val selectedProductKey: String?
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderManager.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderManager.kt
index 96d2e83..2efdf4c 100644
--- a/merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderManager.kt
+++ b/merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderManager.kt
@@ -21,7 +21,7 @@ import android.util.Log
import androidx.annotation.UiThread
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.Transformations.map
+import androidx.lifecycle.map
import net.taler.merchantpos.R
import net.taler.merchantpos.config.Category
import net.taler.merchantpos.config.ConfigProduct
@@ -150,7 +150,7 @@ class OrderManager(private val context: Context) : ConfigurationReceiver {
return currentOrderId != orders.keys.first()
}
- fun hasNextOrder(currentOrderId: Int) = map(order(currentOrderId).restartState) { state ->
+ fun hasNextOrder(currentOrderId: Int) = order(currentOrderId).restartState.map { state ->
state == ENABLED || currentOrderId != orders.keys.last()
}
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt
index 02f66fa..efcb158 100644
--- a/merchant-terminal/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt
+++ b/merchant-terminal/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt
@@ -36,10 +36,9 @@ import net.taler.merchantpos.R
import net.taler.merchantpos.config.ConfigManager
import net.taler.merchantpos.order.Order
import java.util.concurrent.TimeUnit.HOURS
-import java.util.concurrent.TimeUnit.MINUTES
import java.util.concurrent.TimeUnit.SECONDS
-private val TIMEOUT = MINUTES.toMillis(2)
+private const val TIMEOUT = Long.MAX_VALUE
private val CHECK_INTERVAL = SECONDS.toMillis(1)
class PaymentManager(
@@ -85,7 +84,10 @@ class PaymentManager(
private fun checkPayment(orderId: String) = scope.launch {
val merchantConfig = configManager.merchantConfig!!
- api.checkOrder(merchantConfig, orderId).handle(::onNetworkError) { response ->
+ api.checkOrder(merchantConfig, orderId).handle({ error ->
+ // don't call onNetworkError() to not cancel payment, just keep trying
+ Log.d(TAG, "Network error: $error")
+ }) { response ->
assertUiThread()
if (!isActive) return@handle // don't continue if job was cancelled
val currentValue = requireNotNull(mPayment.value)
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
index 201c9cf..443ca91 100644
--- a/merchant-terminal/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
+++ b/merchant-terminal/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
@@ -55,9 +55,9 @@ class ProcessPaymentFragment : Fragment() {
val introRes =
if (hasNfc(requireContext())) R.string.payment_intro_nfc else R.string.payment_intro
ui.payIntroView.setText(introRes)
- paymentManager.payment.observe(viewLifecycleOwner, { payment ->
+ paymentManager.payment.observe(viewLifecycleOwner) { payment ->
onPaymentStateChanged(payment)
- })
+ }
ui.cancelPaymentButton.setOnClickListener {
onPaymentCancel()
}