From b87319c0a437e7a72f52384e689c8e2971060cff Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Wed, 4 Mar 2020 12:52:27 -0300 Subject: Fix navigation and use official passwordless sample config --- .../java/net/taler/merchantpos/MainActivity.kt | 18 +++---- .../java/net/taler/merchantpos/MainViewModel.kt | 6 --- .../java/net/taler/merchantpos/MerchantHistory.kt | 3 +- app/src/main/java/net/taler/merchantpos/Utils.kt | 4 ++ .../merchantpos/config/ConfigFetcherFragment.kt | 8 +-- .../net/taler/merchantpos/config/ConfigManager.kt | 20 +++----- .../merchantpos/config/MerchantConfigFragment.kt | 4 +- .../net/taler/merchantpos/order/OrderFragment.kt | 12 +++-- .../net/taler/merchantpos/order/OrderManager.kt | 8 +-- .../merchantpos/payment/ProcessPaymentFragment.kt | 5 +- app/src/main/res/navigation/nav_graph.xml | 57 ++++++++++++++-------- build.gradle | 4 +- 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( source1: LiveData, source2: LiveData, 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() 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"> - - + app:destination="@+id/nav_settings" + app:launchSingleTop="true" + app:popUpTo="@+id/nav_graph" + app:popUpToInclusive="true" /> + app:destination="@+id/nav_order" + app:popUpTo="@+id/nav_graph" /> + + app:destination="@+id/paymentSuccess" + app:popUpTo="@id/nav_order" /> + tools:layout="@layout/fragment_merchant_config"> + + @@ -73,15 +83,20 @@ + app:destination="@+id/nav_order" + app:launchSingleTop="true" + app:popUpTo="@+id/nav_graph" /> + app:destination="@+id/nav_history" + app:launchSingleTop="true" /> + app:destination="@+id/nav_settings" + app:launchSingleTop="true" /> + app:destination="@+id/configFetcher" + app:launchSingleTop="true" /> 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() - } } -- cgit v1.2.3