summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorsten Grote <t@grobox.de>2020-03-04 12:52:27 -0300
committerTorsten Grote <t@grobox.de>2020-03-04 12:52:27 -0300
commitb87319c0a437e7a72f52384e689c8e2971060cff (patch)
treeaec11a182a4ed2e18ec0d866e2c13fb0694f039e
parentbfa76fdc0a5047f7d2531edb9d8fc2ec269cd3bc (diff)
downloadmerchant-terminal-android-b87319c0a437e7a72f52384e689c8e2971060cff.tar.gz
merchant-terminal-android-b87319c0a437e7a72f52384e689c8e2971060cff.tar.bz2
merchant-terminal-android-b87319c0a437e7a72f52384e689c8e2971060cff.zip
Fix navigation and use official passwordless sample config
-rw-r--r--app/src/main/java/net/taler/merchantpos/MainActivity.kt18
-rw-r--r--app/src/main/java/net/taler/merchantpos/MainViewModel.kt6
-rw-r--r--app/src/main/java/net/taler/merchantpos/MerchantHistory.kt3
-rw-r--r--app/src/main/java/net/taler/merchantpos/Utils.kt4
-rw-r--r--app/src/main/java/net/taler/merchantpos/config/ConfigFetcherFragment.kt8
-rw-r--r--app/src/main/java/net/taler/merchantpos/config/ConfigManager.kt20
-rw-r--r--app/src/main/java/net/taler/merchantpos/config/MerchantConfigFragment.kt4
-rw-r--r--app/src/main/java/net/taler/merchantpos/order/OrderFragment.kt12
-rw-r--r--app/src/main/java/net/taler/merchantpos/order/OrderManager.kt8
-rw-r--r--app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt5
-rw-r--r--app/src/main/res/navigation/nav_graph.xml57
-rw-r--r--build.gradle4
12 files changed, 80 insertions, 69 deletions
diff --git a/app/src/main/java/net/taler/merchantpos/MainActivity.kt b/app/src/main/java/net/taler/merchantpos/MainActivity.kt
index 1fb4653..496f551 100644
--- a/app/src/main/java/net/taler/merchantpos/MainActivity.kt
+++ b/app/src/main/java/net/taler/merchantpos/MainActivity.kt
@@ -46,22 +46,17 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener {
nav_view.setupWithNavController(nav)
nav_view.setNavigationItemSelectedListener(this)
- if (savedInstanceState == null) {
- nav_view.menu.getItem(0).isChecked = true
- }
setSupportActionBar(toolbar)
- val appBarConfiguration = AppBarConfiguration(
- setOf(R.id.order, R.id.merchantSettings, R.id.merchantHistory), drawer_layout
- )
+ val appBarConfiguration = AppBarConfiguration(nav.graph, drawer_layout)
toolbar.setupWithNavController(nav, appBarConfiguration)
}
override fun onStart() {
super.onStart()
- if (model.configManager.needsConfig()) {
+ if (!model.configManager.config.isValid() && nav.currentDestination?.id != R.id.nav_settings) {
nav.navigate(R.id.action_global_merchantSettings)
- } else if (model.configManager.merchantConfig == null) {
+ } else if (model.configManager.merchantConfig == null && nav.currentDestination?.id != R.id.configFetcher) {
nav.navigate(R.id.action_global_configFetcher)
}
}
@@ -78,7 +73,6 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener {
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
- // Handle navigation view item clicks here.
when (item.itemId) {
R.id.nav_order -> nav.navigate(R.id.action_global_order)
R.id.nav_history -> nav.navigate(R.id.action_global_merchantHistory)
@@ -89,18 +83,20 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener {
}
override fun onBackPressed() {
+ val currentDestination = nav.currentDestination?.id
if (drawer_layout.isDrawerOpen(START)) {
drawer_layout.closeDrawer(START)
- } else if (nav.currentDestination?.id == R.id.merchantSettings && model.configManager.needsConfig()) {
+ } else if (currentDestination == R.id.nav_settings && !model.configManager.config.isValid()) {
// we are in the configuration screen and need a config to continue
val intent = Intent(ACTION_MAIN).apply {
addCategory(CATEGORY_HOME)
flags = FLAG_ACTIVITY_NEW_TASK
}
startActivity(intent)
- } else if (nav.currentDestination?.id == R.id.order) {
+ } else if (currentDestination == R.id.nav_order) {
if (reallyExit) super.onBackPressed()
else {
+ // this closes the app and causes orders to be lost, so let's confirm first
reallyExit = true
Toast.makeText(this, R.string.toast_back_to_exit, LENGTH_SHORT).show()
Handler().postDelayed({ reallyExit = false }, 3000)
diff --git a/app/src/main/java/net/taler/merchantpos/MainViewModel.kt b/app/src/main/java/net/taler/merchantpos/MainViewModel.kt
index f4f792b..3aa9f9f 100644
--- a/app/src/main/java/net/taler/merchantpos/MainViewModel.kt
+++ b/app/src/main/java/net/taler/merchantpos/MainViewModel.kt
@@ -24,12 +24,6 @@ class MainViewModel(app: Application) : AndroidViewModel(app) {
}
val paymentManager = PaymentManager(configManager, queue, mapper)
- init {
- if (configManager.merchantConfig == null && configManager.config.isValid()) {
- configManager.fetchConfig(configManager.config, false)
- }
- }
-
override fun onCleared() {
queue.cancelAll { !it.isCanceled }
}
diff --git a/app/src/main/java/net/taler/merchantpos/MerchantHistory.kt b/app/src/main/java/net/taler/merchantpos/MerchantHistory.kt
index 27f8a98..8fb8fb3 100644
--- a/app/src/main/java/net/taler/merchantpos/MerchantHistory.kt
+++ b/app/src/main/java/net/taler/merchantpos/MerchantHistory.kt
@@ -25,6 +25,7 @@ import com.google.android.material.snackbar.Snackbar
import com.google.android.material.snackbar.Snackbar.LENGTH_SHORT
import kotlinx.android.synthetic.main.fragment_merchant_history.*
import net.taler.merchantpos.HistoryItemAdapter.HistoryItemViewHolder
+import net.taler.merchantpos.MerchantHistoryDirections.Companion.actionGlobalMerchantSettings
import net.taler.merchantpos.config.MerchantRequest
import org.json.JSONObject
import java.time.Instant
@@ -84,7 +85,7 @@ class MerchantHistory : Fragment() {
override fun onStart() {
super.onStart()
if (model.configManager.merchantConfig?.instance == null) {
- findNavController().navigate(R.id.action_global_merchantSettings)
+ actionGlobalMerchantSettings().navigate(findNavController())
} else {
fetchHistory()
}
diff --git a/app/src/main/java/net/taler/merchantpos/Utils.kt b/app/src/main/java/net/taler/merchantpos/Utils.kt
index 948120e..98d1751 100644
--- a/app/src/main/java/net/taler/merchantpos/Utils.kt
+++ b/app/src/main/java/net/taler/merchantpos/Utils.kt
@@ -7,6 +7,8 @@ import androidx.annotation.StringRes
import androidx.lifecycle.LiveData
import androidx.lifecycle.MediatorLiveData
import androidx.lifecycle.Observer
+import androidx.navigation.NavController
+import androidx.navigation.NavDirections
import com.google.android.material.snackbar.BaseTransientBottomBar.ANIMATION_MODE_FADE
import com.google.android.material.snackbar.BaseTransientBottomBar.Duration
import com.google.android.material.snackbar.Snackbar.make
@@ -77,6 +79,8 @@ fun topSnackbar(view: View, @StringRes resId: Int, @Duration duration: Int) {
topSnackbar(view, view.resources.getText(resId), duration)
}
+fun NavDirections.navigate(nav: NavController) = nav.navigate(this)
+
class CombinedLiveData<T, K, S>(
source1: LiveData<T>,
source2: LiveData<K>,
diff --git a/app/src/main/java/net/taler/merchantpos/config/ConfigFetcherFragment.kt b/app/src/main/java/net/taler/merchantpos/config/ConfigFetcherFragment.kt
index e233c13..ccadb8b 100644
--- a/app/src/main/java/net/taler/merchantpos/config/ConfigFetcherFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/config/ConfigFetcherFragment.kt
@@ -12,7 +12,9 @@ import com.google.android.material.snackbar.Snackbar
import com.google.android.material.snackbar.Snackbar.LENGTH_SHORT
import net.taler.merchantpos.MainViewModel
import net.taler.merchantpos.R
+import net.taler.merchantpos.config.ConfigFetcherFragmentDirections.Companion.actionConfigFetcherToMerchantSettings
import net.taler.merchantpos.config.ConfigFetcherFragmentDirections.Companion.actionConfigFetcherToOrder
+import net.taler.merchantpos.navigate
class ConfigFetcherFragment : Fragment() {
@@ -28,12 +30,12 @@ class ConfigFetcherFragment : Fragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
-
+ configManager.fetchConfig(configManager.config, false)
configManager.configUpdateResult.observe(viewLifecycleOwner, Observer { result ->
when {
result == null -> return@Observer
result.error -> onNetworkError(result.authError)
- else -> actionConfigFetcherToOrder().let { findNavController().navigate(it) }
+ else -> actionConfigFetcherToOrder().navigate(findNavController())
}
})
}
@@ -41,7 +43,7 @@ class ConfigFetcherFragment : Fragment() {
private fun onNetworkError(authError: Boolean) {
val res = if (authError) R.string.config_auth_error else R.string.config_error
Snackbar.make(view!!, res, LENGTH_SHORT).show()
- findNavController().navigate(R.id.action_configFetcher_to_merchantSettings)
+ actionConfigFetcherToMerchantSettings().navigate(findNavController())
}
}
diff --git a/app/src/main/java/net/taler/merchantpos/config/ConfigManager.kt b/app/src/main/java/net/taler/merchantpos/config/ConfigManager.kt
index 1016465..f8d5629 100644
--- a/app/src/main/java/net/taler/merchantpos/config/ConfigManager.kt
+++ b/app/src/main/java/net/taler/merchantpos/config/ConfigManager.kt
@@ -27,9 +27,9 @@ private const val SETTINGS_CONFIG_URL = "configUrl"
private const val SETTINGS_USERNAME = "username"
private const val SETTINGS_PASSWORD = "password"
-internal const val CONFIG_URL_DEMO = "https://grobox.de/taler/pos.json"
-internal const val CONFIG_USERNAME_DEMO = "torsten"
-internal const val CONFIG_PASSWORD_DEMO = "test"
+internal const val CONFIG_URL_DEMO = "https://docs.taler.net/_static/sample-pos-config.json"
+internal const val CONFIG_USERNAME_DEMO = ""
+internal const val CONFIG_PASSWORD_DEMO = ""
private val TAG = ConfigManager::class.java.simpleName
@@ -51,9 +51,9 @@ class ConfigManager(
private val configurationReceivers = ArrayList<ConfigurationReceiver>()
var config = Config(
- configUrl = prefs.getString(SETTINGS_CONFIG_URL, "")!!,
- username = prefs.getString(SETTINGS_USERNAME, "")!!,
- password = prefs.getString(SETTINGS_PASSWORD, "")!!
+ configUrl = prefs.getString(SETTINGS_CONFIG_URL, CONFIG_URL_DEMO)!!,
+ username = prefs.getString(SETTINGS_USERNAME, CONFIG_USERNAME_DEMO)!!,
+ password = prefs.getString(SETTINGS_PASSWORD, CONFIG_PASSWORD_DEMO)!!
)
var merchantConfig: MerchantConfig? = null
private set
@@ -65,14 +65,6 @@ class ConfigManager(
configurationReceivers.add(receiver)
}
- /**
- * Returns true if the user needs to provide more configuration
- * and false if the configuration is sufficient to continue.
- */
- fun needsConfig(): Boolean {
- return !config.isValid() || (!config.hasPassword() && merchantConfig == null)
- }
-
@UiThread
fun fetchConfig(config: Config, save: Boolean, savePassword: Boolean = false) {
mConfigUpdateResult.value = null
diff --git a/app/src/main/java/net/taler/merchantpos/config/MerchantConfigFragment.kt b/app/src/main/java/net/taler/merchantpos/config/MerchantConfigFragment.kt
index bd99754..8bbc70d 100644
--- a/app/src/main/java/net/taler/merchantpos/config/MerchantConfigFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/config/MerchantConfigFragment.kt
@@ -17,6 +17,8 @@ import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.fragment_merchant_config.*
import net.taler.merchantpos.MainViewModel
import net.taler.merchantpos.R
+import net.taler.merchantpos.config.MerchantConfigFragmentDirections.Companion.actionSettingsToOrder
+import net.taler.merchantpos.navigate
import net.taler.merchantpos.topSnackbar
/**
@@ -101,7 +103,7 @@ class MerchantConfigFragment : Fragment() {
onResultReceived()
updateView()
topSnackbar(view!!, getString(R.string.config_changed, currency), LENGTH_LONG)
- findNavController().navigate(R.id.order)
+ actionSettingsToOrder().navigate(findNavController())
}
private fun onNetworkError(authError: Boolean) {
diff --git a/app/src/main/java/net/taler/merchantpos/order/OrderFragment.kt b/app/src/main/java/net/taler/merchantpos/order/OrderFragment.kt
index 42d060d..a2d4169 100644
--- a/app/src/main/java/net/taler/merchantpos/order/OrderFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/OrderFragment.kt
@@ -12,6 +12,10 @@ import androidx.transition.TransitionManager.beginDelayedTransition
import kotlinx.android.synthetic.main.fragment_order.*
import net.taler.merchantpos.MainViewModel
import net.taler.merchantpos.R
+import net.taler.merchantpos.navigate
+import net.taler.merchantpos.order.OrderFragmentDirections.Companion.actionGlobalConfigFetcher
+import net.taler.merchantpos.order.OrderFragmentDirections.Companion.actionOrderToMerchantSettings
+import net.taler.merchantpos.order.OrderFragmentDirections.Companion.actionOrderToProcessPayment
import net.taler.merchantpos.order.RestartState.ENABLED
import net.taler.merchantpos.order.RestartState.UNDO
@@ -44,8 +48,10 @@ class OrderFragment : Fragment() {
override fun onStart() {
super.onStart()
- if (viewModel.configManager.needsConfig() || viewModel.configManager.merchantConfig?.currency == null) {
- findNavController().navigate(R.id.action_global_merchantSettings)
+ if (!viewModel.configManager.config.isValid()) {
+ actionOrderToMerchantSettings().navigate(findNavController())
+ } else if (viewModel.configManager.merchantConfig?.currency == null) {
+ actionGlobalConfigFetcher().navigate(findNavController())
}
}
@@ -86,7 +92,7 @@ class OrderFragment : Fragment() {
completeButton.setOnClickListener {
val order = liveOrder.order.value ?: return@setOnClickListener
paymentManager.createPayment(order)
- findNavController().navigate(R.id.action_order_to_processPayment)
+ actionOrderToProcessPayment().navigate(findNavController())
}
}
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 21738bb..ab561e2 100644
--- a/app/src/main/java/net/taler/merchantpos/order/OrderManager.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/OrderManager.kt
@@ -81,9 +81,11 @@ class OrderManager(private val mapper: ObjectMapper) : ConfigurationReceiver {
mCategories.postValue(categories)
mProducts.postValue(productsByCategory[categories[0]])
// Initialize first empty order, note this won't work when updating config mid-flight
- val id = orderCounter++
- orders[id] = MutableLiveOrder(id, productsByCategory)
- mCurrentOrderId.postValue(id)
+ if (orders.isEmpty()) {
+ val id = orderCounter++
+ orders[id] = MutableLiveOrder(id, productsByCategory)
+ mCurrentOrderId.postValue(id)
+ }
true
} else {
false
diff --git a/app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt b/app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
index 8eb7e97..8589de6 100644
--- a/app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
@@ -17,6 +17,7 @@ import net.taler.merchantpos.QrCodeManager.makeQrCode
import net.taler.merchantpos.R
import net.taler.merchantpos.fadeIn
import net.taler.merchantpos.fadeOut
+import net.taler.merchantpos.navigate
import net.taler.merchantpos.payment.ProcessPaymentFragmentDirections.Companion.actionProcessPaymentToPaymentSuccess
import net.taler.merchantpos.topSnackbar
@@ -52,9 +53,7 @@ class ProcessPaymentFragment : Fragment() {
}
if (payment.paid) {
model.orderManager.onOrderPaid(payment.order.id)
- actionProcessPaymentToPaymentSuccess().let {
- findNavController().navigate(it)
- }
+ actionProcessPaymentToPaymentSuccess().navigate(findNavController())
return
}
payIntroView.fadeIn()
diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml
index 59a3f29..1c384db 100644
--- a/app/src/main/res/navigation/nav_graph.xml
+++ b/app/src/main/res/navigation/nav_graph.xml
@@ -3,26 +3,27 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
- app:startDestination="@id/order"
+ app:startDestination="@+id/nav_order"
tools:ignore="UnusedNavigation">
<fragment
- android:id="@+id/order"
+ android:id="@+id/nav_order"
android:name="net.taler.merchantpos.order.OrderFragment"
android:label=""
tools:layout="@layout/fragment_order">
<action
- android:id="@+id/action_order_to_processPayment"
- app:destination="@id/processPayment" />
- <action
- android:id="@+id/action_order_to_merchantHistory"
- app:destination="@id/merchantHistory" />
- <action
android:id="@+id/action_order_to_merchantSettings"
- app:destination="@id/merchantSettings" />
+ app:destination="@+id/nav_settings"
+ app:launchSingleTop="true"
+ app:popUpTo="@+id/nav_graph"
+ app:popUpToInclusive="true" />
<action
android:id="@+id/action_order_self"
- app:destination="@id/order" />
+ app:destination="@+id/nav_order"
+ app:popUpTo="@+id/nav_graph" />
+ <action
+ android:id="@+id/action_order_to_processPayment"
+ app:destination="@+id/processPayment" />
</fragment>
<fragment
@@ -32,21 +33,28 @@
tools:layout="@layout/fragment_process_payment">
<action
android:id="@+id/action_processPayment_to_paymentSuccess"
- app:destination="@id/paymentSuccess"
- app:popUpTo="@id/order" />
+ app:destination="@+id/paymentSuccess"
+ app:popUpTo="@id/nav_order" />
</fragment>
<fragment
- android:id="@+id/merchantHistory"
+ android:id="@+id/nav_history"
android:name="net.taler.merchantpos.MerchantHistory"
android:label="@string/history_label"
tools:layout="@layout/fragment_merchant_history" />
<fragment
- android:id="@+id/merchantSettings"
+ android:id="@+id/nav_settings"
android:name="net.taler.merchantpos.config.MerchantConfigFragment"
android:label="@string/config_label"
- tools:layout="@layout/fragment_merchant_config" />
+ tools:layout="@layout/fragment_merchant_config">
+ <action
+ android:id="@+id/action_settings_to_order"
+ app:destination="@+id/nav_order"
+ app:launchSingleTop="true"
+ app:popUpTo="@+id/nav_graph"
+ app:popUpToInclusive="true" />
+ </fragment>
<fragment
android:id="@+id/configFetcher"
@@ -55,11 +63,13 @@
tools:layout="@layout/fragment_config_fetcher">
<action
android:id="@+id/action_configFetcher_to_merchantSettings"
- app:destination="@id/merchantSettings"
+ app:destination="@+id/nav_settings"
+ app:launchSingleTop="true"
+ app:popUpTo="@+id/nav_graph"
app:popUpToInclusive="true" />
<action
android:id="@+id/action_configFetcher_to_order"
- app:destination="@id/order"
+ app:destination="@+id/nav_order"
app:launchSingleTop="true"
app:popUpTo="@+id/nav_graph"
app:popUpToInclusive="true" />
@@ -73,15 +83,20 @@
<action
android:id="@+id/action_global_order"
- app:destination="@id/order" />
+ app:destination="@+id/nav_order"
+ app:launchSingleTop="true"
+ app:popUpTo="@+id/nav_graph" />
<action
android:id="@+id/action_global_merchantHistory"
- app:destination="@id/merchantHistory" />
+ app:destination="@+id/nav_history"
+ app:launchSingleTop="true" />
<action
android:id="@+id/action_global_merchantSettings"
- app:destination="@id/merchantSettings" />
+ app:destination="@+id/nav_settings"
+ app:launchSingleTop="true" />
<action
android:id="@+id/action_global_configFetcher"
- app:destination="@id/configFetcher" />
+ app:destination="@+id/configFetcher"
+ app:launchSingleTop="true" />
</navigation>
diff --git a/build.gradle b/build.gradle
index d0a284a..f286dfe 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,10 +1,9 @@
buildscript {
- ext.kotlin_version = '1.3.61'
+ ext.kotlin_version = '1.3.70'
ext.nav_version = "2.2.1"
repositories {
google()
jcenter()
-
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.1'
@@ -17,7 +16,6 @@ allprojects {
repositories {
google()
jcenter()
-
}
}