gnunet-svn
[Top][All Lists]
Advanced

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

[taler-merchant-terminal-android] branch master updated (a78fac0 -> 4aa8


From: gnunet
Subject: [taler-merchant-terminal-android] branch master updated (a78fac0 -> 4aa8591)
Date: Tue, 25 Feb 2020 17:07:39 +0100

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

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

    from a78fac0  Fix lint and make all strings translatable
     new e02adae  Add CI file for automatic nightly repo
     new 76301ac  Improve config fragment: remove currency and move fetch 
button up
     new 662f4c2  Redo payment fragment and upgrade gradle/kotlin
     new bde9555  Show snackbars at the top of the order, not at the bottom
     new 7f76cdb  Redesign payment successful screen
     new b15056e  Improve display of order total
     new ae9faac  Make fragment titles translatable
     new 4aa8591  Scroll to last added product and select it

The 8 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .gitlab-ci.yml                                     |  39 ++++++
 .idea/codeStyles/Project.xml                       |   3 -
 .idea/gradle.xml                                   |   3 +
 app/build.gradle                                   |   1 -
 .../java/net/taler/merchantpos/MainActivity.kt     |   2 +-
 .../java/net/taler/merchantpos/MerchantHistory.kt  |   2 +-
 app/src/main/java/net/taler/merchantpos/Utils.kt   |  37 ++++++
 .../net/taler/merchantpos/config/ConfigManager.kt  |   1 +
 .../merchantpos/config/MerchantConfigFragment.kt   |  20 +--
 .../net/taler/merchantpos/order/OrderFragment.kt   |  14 +-
 .../net/taler/merchantpos/order/OrderManager.kt    |   4 +
 .../taler/merchantpos/order/OrderStateFragment.kt  |  38 ++++--
 .../merchantpos/payment/PaymentSuccessFragment.kt  |   6 +-
 .../merchantpos/payment/ProcessPaymentFragment.kt  |  29 ++--
 app/src/main/res/drawable/ic_check_circle.xml      |  10 ++
 app/src/main/res/layout/app_bar_main.xml           |  24 +++-
 app/src/main/res/layout/content_main.xml           |  24 ----
 ...t_settings.xml => fragment_merchant_config.xml} |  34 ++---
 app/src/main/res/layout/fragment_order.xml         |  16 +--
 app/src/main/res/layout/fragment_order_state.xml   |  19 ++-
 .../main/res/layout/fragment_payment_success.xml   |  47 +++++--
 .../main/res/layout/fragment_process_payment.xml   | 146 ++++++++++++---------
 app/src/main/res/navigation/nav_graph.xml          |  14 +-
 app/src/main/res/values-night/colors.xml           |   1 +
 app/src/main/res/values/colors.xml                 |   6 +-
 app/src/main/res/values/strings.xml                |  16 ++-
 build.gradle                                       |   8 +-
 gradle/wrapper/gradle-wrapper.properties           |   4 +-
 28 files changed, 355 insertions(+), 213 deletions(-)
 create mode 100644 .gitlab-ci.yml
 create mode 100644 app/src/main/res/drawable/ic_check_circle.xml
 delete mode 100644 app/src/main/res/layout/content_main.xml
 rename app/src/main/res/layout/{fragment_merchant_settings.xml => 
fragment_merchant_config.xml} (84%)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..05106b6
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,39 @@
+image: registry.gitlab.com/fdroid/ci-images-client:latest
+
+cache:
+  paths:
+    - .gradle/wrapper
+    - .gradle/caches
+
+stages:
+  - test
+  - deploy
+
+test:
+  stage: test
+  script: ./gradlew lint assembleRelease
+
+deploy_nightly:
+  stage: deploy
+  only:
+    - master
+  script:
+    # Ensure that key exists
+    - test -z "$DEBUG_KEYSTORE" && exit 0
+    # Rename nightly app
+    - sed -i
+      's,<string name="app_name">.*</string>,<string name="app_name">Merchant 
PoS Nightly</string>,'
+      app/src/main/res/values*/strings.xml
+    # Set time-based version code
+    - export versionCode=$(date '+%s')
+    - sed -i "s,^\(\s*versionCode\) *[0-9].*,\1 $versionCode," app/build.gradle
+    # Set nightly application ID
+    - sed -i "s,^\(\s*applicationId\) \"*[a-z\.].*\",\1 
\"net.taler.merchantpos.nightly\"," app/build.gradle
+    # Build the APK
+    - ./gradlew assembleDebug
+    - CI_PROJECT_URL="https://gitlab.com/gnu-taler/fdroid-repo"; 
CI_PROJECT_PATH="gnu-taler/fdroid-repo" fdroid nightly -v
+
+after_script:
+  # this file changes every time but should not be cached
+  - rm -f $GRADLE_USER_HOME/caches/modules-2/modules-2.lock
+  - rm -fr $GRADLE_USER_HOME/caches/*/plugin-resolution/
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index a705caf..fad1c60 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -1,8 +1,5 @@
 <component name="ProjectCodeStyleConfiguration">
   <code_scheme name="Project" version="173">
-    <AndroidXmlCodeStyleSettings>
-      <option name="ARRANGEMENT_SETTINGS_MIGRATED_TO_191" value="true" />
-    </AndroidXmlCodeStyleSettings>
     <JetCodeStyleSettings>
       <option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="2147483647" />
       <option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" 
value="2147483647" />
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 7ac24c7..674414f 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -1,8 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
+  <component name="GradleMigrationSettings" migrationVersion="1" />
   <component name="GradleSettings">
     <option name="linkedExternalProjectsSettings">
       <GradleProjectSettings>
+        <option name="delegatedBuild" value="false" />
+        <option name="testRunner" value="PLATFORM" />
         <option name="distributionType" value="DEFAULT_WRAPPED" />
         <option name="externalProjectPath" value="$PROJECT_DIR$" />
         <option name="modules">
diff --git a/app/build.gradle b/app/build.gradle
index 38ddaa9..2a9d620 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -2,7 +2,6 @@ apply plugin: 'com.android.application'
 
 apply plugin: 'kotlin-android'
 apply plugin: 'kotlin-kapt'
-
 apply plugin: 'kotlin-android-extensions'
 
 android {
diff --git a/app/src/main/java/net/taler/merchantpos/MainActivity.kt 
b/app/src/main/java/net/taler/merchantpos/MainActivity.kt
index 4206b51..36c1211 100644
--- a/app/src/main/java/net/taler/merchantpos/MainActivity.kt
+++ b/app/src/main/java/net/taler/merchantpos/MainActivity.kt
@@ -53,7 +53,7 @@ class MainActivity : AppCompatActivity(), 
OnNavigationItemSelectedListener {
         )
 
         val navHostFragment =
-            supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as 
NavHostFragment
+            supportFragmentManager.findFragmentById(R.id.navHostFragment) as 
NavHostFragment
         nav = navHostFragment.navController
         toolbar.setupWithNavController(nav, appBarConfiguration)
     }
diff --git a/app/src/main/java/net/taler/merchantpos/MerchantHistory.kt 
b/app/src/main/java/net/taler/merchantpos/MerchantHistory.kt
index c21a8a7..27f8a98 100644
--- a/app/src/main/java/net/taler/merchantpos/MerchantHistory.kt
+++ b/app/src/main/java/net/taler/merchantpos/MerchantHistory.kt
@@ -120,7 +120,7 @@ class MerchantHistory : Fragment() {
 
     private fun onNetworkError() {
         this.isLoading.value = false
-        Snackbar.make(view!!, "Network Error", LENGTH_SHORT).show()
+        Snackbar.make(view!!, R.string.error_network, LENGTH_SHORT).show()
     }
 
 }
diff --git a/app/src/main/java/net/taler/merchantpos/Utils.kt 
b/app/src/main/java/net/taler/merchantpos/Utils.kt
index 9b0075a..948120e 100644
--- a/app/src/main/java/net/taler/merchantpos/Utils.kt
+++ b/app/src/main/java/net/taler/merchantpos/Utils.kt
@@ -1,8 +1,15 @@
 package net.taler.merchantpos
 
+import android.view.View
+import android.view.View.INVISIBLE
+import android.view.View.VISIBLE
+import androidx.annotation.StringRes
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.MediatorLiveData
 import androidx.lifecycle.Observer
+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
 
 object Utils {
 
@@ -40,6 +47,36 @@ object Utils {
 
 }
 
+fun View.fadeIn(endAction: () -> Unit = {}) {
+    if (visibility == VISIBLE) return
+    alpha = 0f
+    visibility = VISIBLE
+    animate().alpha(1f).withEndAction {
+        if (context != null) endAction.invoke()
+    }.start()
+}
+
+fun View.fadeOut(endAction: () -> Unit = {}) {
+    if (visibility == INVISIBLE) return
+    animate().alpha(0f).withEndAction {
+        if (context == null) return@withEndAction
+        visibility = INVISIBLE
+        alpha = 1f
+        endAction.invoke()
+    }.start()
+}
+
+fun topSnackbar(view: View, text: CharSequence, @Duration duration: Int) {
+    make(view, text, duration)
+        .setAnimationMode(ANIMATION_MODE_FADE)
+        .setAnchorView(R.id.navHostFragment)
+        .show()
+}
+
+fun topSnackbar(view: View, @StringRes resId: Int, @Duration duration: Int) {
+    topSnackbar(view, view.resources.getText(resId), duration)
+}
+
 class CombinedLiveData<T, K, S>(
     source1: LiveData<T>,
     source2: LiveData<K>,
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 6c230d1..753f5b9 100644
--- a/app/src/main/java/net/taler/merchantpos/config/ConfigManager.kt
+++ b/app/src/main/java/net/taler/merchantpos/config/ConfigManager.kt
@@ -52,6 +52,7 @@ class ConfigManager(
         password = prefs.getString(SETTINGS_PASSWORD, "")!!
     )
     var merchantConfig: MerchantConfig? = null
+        private set
 
     private val mConfigUpdateResult = MutableLiveData<ConfigUpdateResult>()
     val configUpdateResult: LiveData<ConfigUpdateResult> = mConfigUpdateResult
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 abee7e3..c6e60d3 100644
--- a/app/src/main/java/net/taler/merchantpos/config/MerchantConfigFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/config/MerchantConfigFragment.kt
@@ -11,11 +11,12 @@ import androidx.fragment.app.Fragment
 import androidx.fragment.app.activityViewModels
 import androidx.lifecycle.Observer
 import androidx.navigation.fragment.findNavController
+import com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_LONG
 import com.google.android.material.snackbar.Snackbar
-import com.google.android.material.snackbar.Snackbar.LENGTH_SHORT
-import kotlinx.android.synthetic.main.fragment_merchant_settings.*
+import kotlinx.android.synthetic.main.fragment_merchant_config.*
 import net.taler.merchantpos.MainViewModel
 import net.taler.merchantpos.R
+import net.taler.merchantpos.topSnackbar
 
 /**
  * Fragment that displays merchant settings.
@@ -30,7 +31,7 @@ class MerchantConfigFragment : Fragment() {
         container: ViewGroup?,
         savedInstanceState: Bundle?
     ): View? {
-        return inflater.inflate(R.layout.fragment_merchant_settings, 
container, false)
+        return inflater.inflate(R.layout.fragment_merchant_config, container, 
false)
     }
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -58,7 +59,6 @@ class MerchantConfigFragment : Fragment() {
             configManager.forgetPassword()
             passwordView.editText!!.text = null
             forgetPasswordButton.visibility = GONE
-            currencyView.visibility = GONE
         }
         updateView()
     }
@@ -80,14 +80,6 @@ class MerchantConfigFragment : Fragment() {
         passwordView.editText!!.setText(configManager.config.password)
 
         forgetPasswordButton.visibility = if 
(configManager.config.hasPassword()) VISIBLE else GONE
-
-        val currency = configManager.merchantConfig?.currency
-        if (currency == null) {
-            currencyView.visibility = GONE
-        } else {
-            currencyView.text = getString(R.string.config_currency, currency)
-            currencyView.visibility = VISIBLE
-        }
     }
 
     private fun checkInput(): Boolean {
@@ -102,14 +94,14 @@ class MerchantConfigFragment : Fragment() {
     private fun onConfigReceived(currency: String) {
         onResultReceived()
         updateView()
-        Snackbar.make(view!!, "Changed to new $currency merchant", 
LENGTH_SHORT).show()
+        topSnackbar(view!!, getString(R.string.config_changed, currency), 
LENGTH_LONG)
         findNavController().navigate(R.id.order)
     }
 
     private fun onNetworkError(authError: Boolean) {
         onResultReceived()
         val res = if (authError) R.string.config_auth_error else 
R.string.config_error
-        Snackbar.make(view!!, res, LENGTH_SHORT).show()
+        Snackbar.make(view!!, res, LENGTH_LONG).show()
     }
 
     private fun onResultReceived() {
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 6696afe..90d882f 100644
--- a/app/src/main/java/net/taler/merchantpos/order/OrderFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/OrderFragment.kt
@@ -7,8 +7,6 @@ import android.view.ViewGroup
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.activityViewModels
 import androidx.lifecycle.Observer
-import androidx.navigation.NavController
-import androidx.navigation.Navigation.findNavController
 import androidx.navigation.fragment.findNavController
 import androidx.transition.TransitionManager.beginDelayedTransition
 import kotlinx.android.synthetic.main.fragment_order.*
@@ -55,14 +53,16 @@ class OrderFragment : Fragment() {
 
     override fun onActivityCreated(savedInstanceState: Bundle?) {
         super.onActivityCreated(savedInstanceState)
-        val nav: NavController = findNavController(requireActivity(), 
R.id.nav_host_fragment)
-        reconfigureButton.setOnClickListener { 
nav.navigate(R.id.action_order_to_merchantSettings) }
-        historyButton.setOnClickListener { 
nav.navigate(R.id.action_order_to_merchantHistory) }
-        logoutButton.setOnClickListener { 
nav.navigate(R.id.action_order_to_merchantSettings) }
+        reconfigureButton.setOnClickListener {
+            findNavController().navigate(R.id.action_order_to_merchantSettings)
+        }
+        historyButton.setOnClickListener {
+            findNavController().navigate(R.id.action_order_to_merchantHistory)
+        }
         completeButton.setOnClickListener {
             val order = orderManager.order.value ?: return@setOnClickListener
             paymentManager.createPayment(order)
-            nav.navigate(R.id.action_order_to_processPayment)
+            findNavController().navigate(R.id.action_order_to_processPayment)
         }
     }
 
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 d7db048..60f1e4a 100644
--- a/app/src/main/java/net/taler/merchantpos/order/OrderManager.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/OrderManager.kt
@@ -43,6 +43,9 @@ class OrderManager(private val mapper: ObjectMapper) : 
ConfigurationReceiver {
 
     private val mSelectedOrderLine = MutableLiveData<ConfigProduct>()
 
+    internal var lastAddedProduct: ConfigProduct? = null
+        private set
+
     internal val modifyOrderAllowed =
         CombinedLiveData(restartState, mSelectedOrderLine) { restartState, 
selectedOrderLine ->
             restartState != DISABLED && selectedOrderLine != null
@@ -113,6 +116,7 @@ class OrderManager(private val mapper: ObjectMapper) : 
ConfigurationReceiver {
 
     @UiThread
     internal fun addProduct(product: ConfigProduct) {
+        lastAddedProduct = product
         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 3988f17..f016795 100644
--- a/app/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt
@@ -23,6 +23,8 @@ import androidx.recyclerview.widget.RecyclerView.ViewHolder
 import kotlinx.android.synthetic.main.fragment_order_state.*
 import net.taler.merchantpos.MainViewModel
 import net.taler.merchantpos.R
+import net.taler.merchantpos.fadeIn
+import net.taler.merchantpos.fadeOut
 import net.taler.merchantpos.order.OrderAdapter.OrderLineLookup
 import net.taler.merchantpos.order.OrderAdapter.OrderViewHolder
 
@@ -68,20 +70,16 @@ class OrderStateFragment : Fragment() {
         this.tracker = tracker
 
         orderManager.order.observe(viewLifecycleOwner, Observer { order ->
-            adapter.setItems(order.products) {
-                // workaround for bug: SelectionObserver doesn't update when 
removing selected item
-                if (tracker.hasSelection()) {
-                    val key = tracker.selection.first()
-                    val product = order.products.find { it.id == key }
-                    if (product == null) tracker.clearSelection()
-                }
-            }
+            onOrderChanged(order, tracker)
         })
         orderManager.orderTotal.observe(viewLifecycleOwner, Observer { 
orderTotal ->
             if (orderTotal == 0.0) {
+                totalView.fadeOut()
                 totalView.text = null
             } else {
-                totalView.text = getString(R.string.order_total, orderTotal)
+                val currency = viewModel.configManager.merchantConfig?.currency
+                totalView.text = getString(R.string.order_total, orderTotal, 
currency)
+                totalView.fadeIn()
             }
         })
     }
@@ -91,6 +89,24 @@ class OrderStateFragment : Fragment() {
         tracker?.onSaveInstanceState(outState)
     }
 
+    private fun onOrderChanged(order: Order, tracker: 
SelectionTracker<String>) {
+        adapter.setItems(order.products) {
+            orderManager.lastAddedProduct?.let {
+                val position = adapter.findPosition(it)
+                if (position >= 0) {
+                    orderList.scrollToPosition(position)
+                    orderList.post { this.tracker?.select(it.id) }
+                }
+            }
+            // workaround for bug: SelectionObserver doesn't update when 
removing selected item
+            if (tracker.hasSelection()) {
+                val key = tracker.selection.first()
+                val product = order.products.find { it.id == key }
+                if (product == null) tracker.clearSelection()
+            }
+        }
+    }
+
 }
 
 private class OrderAdapter : Adapter<OrderViewHolder>() {
@@ -132,6 +148,10 @@ private class OrderAdapter : Adapter<OrderViewHolder>() {
         return differ.currentList.find { it.id == key }
     }
 
+    fun findPosition(product: ConfigProduct): Int {
+        return differ.currentList.indexOf(product)
+    }
+
     private inner class OrderViewHolder(private val v: View) : ViewHolder(v) {
         private val quantity: TextView = v.findViewById(R.id.quantity)
         private val name: TextView = v.findViewById(R.id.name)
diff --git 
a/app/src/main/java/net/taler/merchantpos/payment/PaymentSuccessFragment.kt 
b/app/src/main/java/net/taler/merchantpos/payment/PaymentSuccessFragment.kt
index 176b6fc..1e9953f 100644
--- a/app/src/main/java/net/taler/merchantpos/payment/PaymentSuccessFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/payment/PaymentSuccessFragment.kt
@@ -5,7 +5,7 @@ import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import androidx.fragment.app.Fragment
-import androidx.navigation.findNavController
+import androidx.navigation.fragment.findNavController
 import kotlinx.android.synthetic.main.fragment_payment_success.*
 import net.taler.merchantpos.R
 
@@ -20,8 +20,8 @@ class PaymentSuccessFragment : Fragment() {
 
     override fun onActivityCreated(savedInstanceState: Bundle?) {
         super.onActivityCreated(savedInstanceState)
-        button_success_back.setOnClickListener {
-            
requireActivity().findNavController(R.id.nav_host_fragment).navigateUp()
+        paymentButton.setOnClickListener {
+            findNavController().navigateUp()
         }
     }
 }
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 738ec2f..6965e56 100644
--- a/app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
@@ -9,13 +9,15 @@ import androidx.fragment.app.Fragment
 import androidx.fragment.app.activityViewModels
 import androidx.lifecycle.Observer
 import androidx.navigation.fragment.findNavController
-import com.google.android.material.snackbar.Snackbar
-import com.google.android.material.snackbar.Snackbar.LENGTH_SHORT
+import com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_LONG
 import kotlinx.android.synthetic.main.fragment_process_payment.*
 import net.taler.merchantpos.MainViewModel
 import net.taler.merchantpos.NfcManager.Companion.hasNfc
 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.topSnackbar
 
 class ProcessPaymentFragment : Fragment() {
 
@@ -32,18 +34,19 @@ class ProcessPaymentFragment : Fragment() {
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         val introRes =
             if (hasNfc(requireContext())) R.string.payment_intro_nfc else 
R.string.payment_intro
-        textView2.setText(introRes)
+        payIntroView.setText(introRes)
         paymentManager.payment.observe(viewLifecycleOwner, Observer { payment 
->
             onPaymentStateChanged(payment)
         })
-        button_cancel_payment.setOnClickListener {
+        cancelPaymentButton.setOnClickListener {
             onPaymentCancel()
         }
     }
 
     private fun onPaymentStateChanged(payment: Payment) {
         if (payment.error) {
-            Snackbar.make(view!!, "Network Error", LENGTH_SHORT).show()
+            topSnackbar(view!!, R.string.error_network, LENGTH_LONG)
+            findNavController().navigateUp()
             return
         }
         if (payment.paid) {
@@ -51,19 +54,25 @@ class ProcessPaymentFragment : Fragment() {
             model.orderManager.restartOrUndo()
             return
         }
+        payIntroView.fadeIn()
         @SuppressLint("SetTextI18n")
-        text_view_amount.text = "${payment.order.totalAsString} 
${payment.currency}"
-        text_view_order_reference.text = getString(R.string.payment_order_ref, 
payment.orderId)
+        amountView.text = "${payment.order.totalAsString} ${payment.currency}"
+        payment.orderId?.let {
+            orderRefView.text = getString(R.string.payment_order_ref, it)
+            orderRefView.fadeIn()
+        }
         payment.talerPayUri?.let {
             val qrcodeBitmap = makeQrCode(it)
-            qrcode.setImageBitmap(qrcodeBitmap)
+            qrcodeView.setImageBitmap(qrcodeBitmap)
+            qrcodeView.fadeIn()
+            progressBar.fadeOut()
         }
     }
 
     private fun onPaymentCancel() {
         paymentManager.cancelPayment()
-        findNavController().popBackStack()
-        Snackbar.make(view!!, "Payment Canceled", LENGTH_SHORT).show()
+        findNavController().navigateUp()
+        topSnackbar(view!!, R.string.payment_canceled, LENGTH_LONG)
     }
 
 }
diff --git a/app/src/main/res/drawable/ic_check_circle.xml 
b/app/src/main/res/drawable/ic_check_circle.xml
new file mode 100644
index 0000000..61e1b5a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_check_circle.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android";
+        android:width="24dp"
+        android:height="24dp"
+        android:alpha="0.56"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+            android:fillColor="@color/green"
+            android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 
10,-10S17.52,2 12,2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z" />
+</vector>
diff --git a/app/src/main/res/layout/app_bar_main.xml 
b/app/src/main/res/layout/app_bar_main.xml
index 01c4602..a4ddb39 100644
--- a/app/src/main/res/layout/app_bar_main.xml
+++ b/app/src/main/res/layout/app_bar_main.xml
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.coordinatorlayout.widget.CoordinatorLayout
-        xmlns:android="http://schemas.android.com/apk/res/android";
+<androidx.coordinatorlayout.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android";
         xmlns:app="http://schemas.android.com/apk/res-auto";
         xmlns:tools="http://schemas.android.com/tools";
         android:layout_width="match_parent"
@@ -8,8 +7,8 @@
         tools:context=".MainActivity">
 
     <com.google.android.material.appbar.AppBarLayout
-            android:layout_height="wrap_content"
             android:layout_width="match_parent"
+            android:layout_height="wrap_content"
             android:theme="@style/AppTheme.AppBarOverlay">
 
         <androidx.appcompat.widget.Toolbar
@@ -17,11 +16,22 @@
                 android:layout_width="match_parent"
                 android:layout_height="?attr/actionBarSize"
                 android:background="?attr/colorPrimary"
-                app:popupTheme="@style/AppTheme.PopupOverlay"/>
+                app:popupTheme="@style/AppTheme.PopupOverlay" />
 
     </com.google.android.material.appbar.AppBarLayout>
 
-    <include layout="@layout/content_main"/>
-
+    <androidx.fragment.app.FragmentContainerView
+            android:id="@+id/navHostFragment"
+            android:name="androidx.navigation.fragment.NavHostFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            app:defaultNavHost="true"
+            app:layout_insetEdge="top"
+            app:layout_behavior="@string/appbar_scrolling_view_behavior"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:navGraph="@navigation/nav_graph" />
 
-</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/app/src/main/res/layout/content_main.xml 
b/app/src/main/res/layout/content_main.xml
deleted file mode 100644
index a87cf40..0000000
--- a/app/src/main/res/layout/content_main.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout
-        xmlns:android="http://schemas.android.com/apk/res/android";
-        xmlns:tools="http://schemas.android.com/tools";
-        xmlns:app="http://schemas.android.com/apk/res-auto";
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        app:layout_behavior="@string/appbar_scrolling_view_behavior"
-        tools:showIn="@layout/app_bar_main"
-        tools:context=".MainActivity">
-
-    <androidx.fragment.app.FragmentContainerView
-            android:id="@+id/nav_host_fragment"
-            android:name="androidx.navigation.fragment.NavHostFragment"
-            android:layout_width="0dp"
-            android:layout_height="0dp"
-            app:layout_constraintLeft_toLeftOf="parent"
-            app:layout_constraintRight_toRightOf="parent"
-            app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:defaultNavHost="true"
-            app:navGraph="@navigation/nav_graph" />
-
-</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/app/src/main/res/layout/fragment_merchant_settings.xml 
b/app/src/main/res/layout/fragment_merchant_config.xml
similarity index 84%
rename from app/src/main/res/layout/fragment_merchant_settings.xml
rename to app/src/main/res/layout/fragment_merchant_config.xml
index 93874b8..0f0b96f 100644
--- a/app/src/main/res/layout/fragment_merchant_settings.xml
+++ b/app/src/main/res/layout/fragment_merchant_config.xml
@@ -9,7 +9,6 @@
     <androidx.constraintlayout.widget.ConstraintLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_margin="16dp"
             tools:context=".config.MerchantConfigFragment">
 
         <com.google.android.material.textfield.TextInputLayout
@@ -86,27 +85,19 @@
                 android:id="@+id/savePasswordCheckBox"
                 android:layout_width="0dp"
                 android:layout_height="wrap_content"
-                android:layout_margin="16dp"
+                android:layout_marginStart="16dp"
+                android:layout_marginTop="16dp"
+                android:layout_marginBottom="16dp"
                 android:checked="true"
                 android:text="@string/config_save_password"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toBottomOf="@+id/passwordView" />
-
-        <TextView
-                android:id="@+id/currencyView"
-                android:layout_width="0dp"
-                android:layout_height="wrap_content"
-                android:layout_margin="16dp"
-                android:textSize="18sp"
-                android:visibility="gone"
-                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toStartOf="@+id/okButton"
+                app:layout_constraintHorizontal_chainStyle="spread_inside"
                 app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toBottomOf="@+id/savePasswordCheckBox"
-                tools:text="@string/config_currency"
-                tools:visibility="visible" />
+                app:layout_constraintTop_toBottomOf="@+id/passwordView"
+                app:layout_constraintVertical_bias="0.0" />
 
-        <Button
+        <com.google.android.material.button.MaterialButton
                 android:id="@+id/okButton"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
@@ -114,10 +105,9 @@
                 android:text="@string/config_ok"
                 app:layout_constraintBottom_toBottomOf="parent"
                 app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintHorizontal_bias="1.0"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toBottomOf="@+id/currencyView"
-                app:layout_constraintVertical_bias="1.0" />
+                app:layout_constraintStart_toEndOf="@+id/savePasswordCheckBox"
+                app:layout_constraintTop_toBottomOf="@+id/passwordView"
+                app:layout_constraintVertical_bias="0.0" />
 
         <ProgressBar
                 android:id="@+id/progressBar"
diff --git a/app/src/main/res/layout/fragment_order.xml 
b/app/src/main/res/layout/fragment_order.xml
index 136d1e7..3fd4902 100644
--- a/app/src/main/res/layout/fragment_order.xml
+++ b/app/src/main/res/layout/fragment_order.xml
@@ -10,6 +10,7 @@
             android:name="net.taler.merchantpos.order.OrderStateFragment"
             android:layout_width="0dp"
             android:layout_height="0dp"
+            android:layout_marginBottom="8dp"
             app:layout_constraintBottom_toTopOf="@+id/restartButton"
             app:layout_constraintEnd_toStartOf="@+id/guideline1"
             app:layout_constraintStart_toStartOf="parent"
@@ -28,6 +29,7 @@
             android:name="net.taler.merchantpos.order.ProductsFragment"
             android:layout_width="0dp"
             android:layout_height="0dp"
+            android:layout_marginBottom="8dp"
             app:layout_constraintBottom_toTopOf="@+id/restartButton"
             app:layout_constraintEnd_toStartOf="@+id/guideline2"
             app:layout_constraintStart_toStartOf="@+id/guideline1"
@@ -46,6 +48,7 @@
             android:name="net.taler.merchantpos.order.CategoriesFragment"
             android:layout_width="0dp"
             android:layout_height="0dp"
+            android:layout_marginBottom="8dp"
             app:layout_constraintBottom_toTopOf="@+id/restartButton"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="@+id/guideline2"
@@ -104,17 +107,6 @@
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintStart_toEndOf="@+id/reconfigureButton" />
 
-    <Button
-            android:id="@+id/logoutButton"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="16dp"
-            android:backgroundTint="@color/logoutButton"
-            android:text="@string/button_logout"
-            android:visibility="gone"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintStart_toEndOf="@+id/historyButton" />
-
     <Button
             android:id="@+id/completeButton"
             android:layout_width="wrap_content"
@@ -125,6 +117,6 @@
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="1.0"
-            app:layout_constraintStart_toEndOf="@+id/logoutButton" />
+            app:layout_constraintStart_toEndOf="@+id/historyButton" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/app/src/main/res/layout/fragment_order_state.xml 
b/app/src/main/res/layout/fragment_order_state.xml
index 0cd9c75..0fc602a 100644
--- a/app/src/main/res/layout/fragment_order_state.xml
+++ b/app/src/main/res/layout/fragment_order_state.xml
@@ -10,22 +10,27 @@
             android:layout_width="0dp"
             android:layout_height="0dp"
             app:layout_constraintBottom_toTopOf="@+id/totalView"
-            tools:listitem="@layout/list_item_order"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
+            app:layout_constraintTop_toTopOf="parent"
+            tools:listitem="@layout/list_item_order" />
 
     <TextView
             android:id="@+id/totalView"
-            android:layout_width="wrap_content"
+            android:layout_width="0dp"
             android:layout_height="wrap_content"
-            android:layout_margin="8dp"
+            android:background="@color/highlightedBackground"
+            android:elevation="2dp"
+            android:gravity="center_vertical|end"
+            android:padding="8dp"
+            android:textColor="?android:textColorPrimary"
+            android:textSize="16sp"
+            android:visibility="invisible"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintHorizontal_bias="1.0"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toBottomOf="@+id/orderList"
-            app:layout_constraintVertical_bias="1.0"
-            tools:text="Total: 23.75" />
+            tools:text="Total: 23.75 TESTKUDOS"
+            tools:visibility="visible" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/app/src/main/res/layout/fragment_payment_success.xml 
b/app/src/main/res/layout/fragment_payment_success.xml
index d6a27db..4924df4 100644
--- a/app/src/main/res/layout/fragment_payment_success.xml
+++ b/app/src/main/res/layout/fragment_payment_success.xml
@@ -4,30 +4,59 @@
         xmlns:tools="http://schemas.android.com/tools";
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_margin="16dp"
         tools:context=".payment.PaymentSuccessFragment">
 
+    <ImageView
+            android:id="@+id/paymentIcon"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:layout_margin="16dp"
+            android:src="@drawable/ic_check_circle"
+            app:layout_constraintBottom_toTopOf="@+id/paymentLabel"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_bias="0.5"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintVertical_chainStyle="spread_inside"
+            tools:ignore="ContentDescription" />
+
     <TextView
-            android:id="@+id/textView3"
+            android:id="@+id/paymentLabel"
             android:layout_width="0dp"
             android:layout_height="0dp"
-            android:gravity="center"
+            android:layout_margin="16dp"
+            android:gravity="center_horizontal|top"
             android:text="@string/payment_received"
-            android:textColor="@android:color/holo_green_dark"
+            android:textColor="@color/green"
             app:autoSizeMaxTextSize="42sp"
             app:autoSizeTextType="uniform"
-            app:layout_constraintBottom_toTopOf="@+id/button_success_back"
+            app:layout_constraintBottom_toTopOf="@+id/paymentButton"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
+            app:layout_constraintTop_toBottomOf="@+id/paymentIcon" />
+
+    <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/guidelineLeft"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            app:layout_constraintGuide_percent="0.25" />
+
+    <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/guidelineRight"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            app:layout_constraintGuide_percent="0.75" />
 
     <Button
-            android:id="@+id/button_success_back"
+            android:id="@+id/paymentButton"
             android:layout_width="0dp"
             android:layout_height="wrap_content"
+            android:layout_margin="16dp"
             android:text="@string/payment_back_button"
             app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent" />
+            app:layout_constraintEnd_toStartOf="@+id/guidelineRight"
+            app:layout_constraintStart_toStartOf="@+id/guidelineLeft" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/app/src/main/res/layout/fragment_process_payment.xml 
b/app/src/main/res/layout/fragment_process_payment.xml
index 879773c..c36090d 100644
--- a/app/src/main/res/layout/fragment_process_payment.xml
+++ b/app/src/main/res/layout/fragment_process_payment.xml
@@ -1,76 +1,94 @@
 <?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android";
+<androidx.constraintlayout.widget.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android";
         xmlns:app="http://schemas.android.com/apk/res-auto";
         xmlns:tools="http://schemas.android.com/tools";
-        android:id="@+id/frameLayout2"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_margin="15dp"
         tools:context=".payment.ProcessPaymentFragment">
 
-    <androidx.constraintlayout.widget.ConstraintLayout
-            android:id="@+id/constraintLayout"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent">
+    <ImageView
+            android:id="@+id/qrcodeView"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:layout_margin="32dp"
+            android:visibility="invisible"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toStartOf="@+id/guideline"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            tools:ignore="ContentDescription"
+            tools:src="@tools:sample/avatars"
+            tools:visibility="visible" />
 
-        <Button
-                android:id="@+id/button_cancel_payment"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/payment_cancel"
-                app:layout_constraintBottom_toBottomOf="parent"
-                app:layout_constraintEnd_toEndOf="parent" />
+    <ProgressBar
+            android:id="@+id/progressBar"
+            style="?android:attr/progressBarStyleLarge"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            app:layout_constraintBottom_toBottomOf="@+id/qrcodeView"
+            app:layout_constraintEnd_toEndOf="@+id/qrcodeView"
+            app:layout_constraintStart_toStartOf="@+id/qrcodeView"
+            app:layout_constraintTop_toTopOf="@+id/qrcodeView" />
 
-        <ImageView
-                android:id="@+id/qrcode"
-                android:layout_width="269dp"
-                android:layout_height="275dp"
-                android:layout_marginTop="32dp"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="parent"
-                tools:ignore="ContentDescription"
-                tools:src="@tools:sample/backgrounds/scenic[16]" />
+    <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/guideline"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            app:layout_constraintGuide_percent="0.54" />
 
-        <TextView
-                android:id="@+id/textView2"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="15dp"
-                android:layout_marginBottom="15dp"
-                android:text="@string/payment_intro_nfc"
-                android:textAlignment="center"
-                android:textSize="24sp"
-                app:layout_constraintBottom_toTopOf="@+id/text_view_amount"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toBottomOf="@+id/qrcode" />
+    <TextView
+            android:id="@+id/payIntroView"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_margin="16dp"
+            android:text="@string/payment_intro_nfc"
+            android:textAlignment="center"
+            android:textSize="24sp"
+            android:visibility="invisible"
+            app:layout_constraintBottom_toTopOf="@+id/amountView"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="@+id/guideline"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintVertical_chainStyle="spread"
+            tools:visibility="visible" />
 
-        <TextView
-                android:id="@+id/text_view_amount"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="39dp"
-                android:textSize="30sp"
-                
app:layout_constraintBottom_toTopOf="@+id/text_view_order_reference"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toBottomOf="@+id/textView2"
-                tools:text="10.49 Eur" />
+    <TextView
+            android:id="@+id/amountView"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_margin="16dp"
+            android:textAppearance="@style/TextAppearance.AppCompat.Headline"
+            app:layout_constraintBottom_toTopOf="@+id/orderRefView"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="@+id/guideline"
+            app:layout_constraintTop_toBottomOf="@+id/payIntroView"
+            tools:text="10.49 TESTKUDOS" />
 
-        <TextView
-                android:id="@+id/text_view_order_reference"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginStart="8dp"
-                android:layout_marginTop="8dp"
-                android:layout_marginEnd="8dp"
-                android:layout_marginBottom="8dp"
-                android:textAlignment="center"
-                app:layout_constraintBottom_toTopOf="@id/button_cancel_payment"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toBottomOf="@+id/text_view_amount"
-                tools:text="@string/payment_order_ref" />
-    </androidx.constraintlayout.widget.ConstraintLayout>
-</FrameLayout>
\ No newline at end of file
+    <TextView
+            android:id="@+id/orderRefView"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_margin="16dp"
+            android:textAlignment="center"
+            android:visibility="invisible"
+            app:layout_constraintBottom_toTopOf="@id/cancelPaymentButton"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="@+id/guideline"
+            app:layout_constraintTop_toBottomOf="@+id/amountView"
+            tools:text="@string/payment_order_ref"
+            tools:visibility="visible" />
+
+    <Button
+            android:id="@+id/cancelPaymentButton"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_margin="16dp"
+            android:backgroundTint="@color/red"
+            android:text="@string/payment_cancel"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_bias="0.0"
+            app:layout_constraintStart_toStartOf="@+id/guideline" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/app/src/main/res/navigation/nav_graph.xml 
b/app/src/main/res/navigation/nav_graph.xml
index 227cd3a..35c2bf2 100644
--- a/app/src/main/res/navigation/nav_graph.xml
+++ b/app/src/main/res/navigation/nav_graph.xml
@@ -9,7 +9,7 @@
     <fragment
             android:id="@+id/order"
             android:name="net.taler.merchantpos.order.OrderFragment"
-            android:label="Order"
+            android:label="@string/order_label"
             tools:layout="@layout/fragment_order">
         <action
                 android:id="@+id/action_order_to_processPayment"
@@ -25,7 +25,7 @@
     <fragment
             android:id="@+id/processPayment"
             android:name="net.taler.merchantpos.payment.ProcessPaymentFragment"
-            android:label="Payment Prompt"
+            android:label="@string/payment_process_label"
             tools:layout="@layout/fragment_process_payment">
         <action
                 android:id="@+id/action_processPayment_to_paymentSuccess"
@@ -36,19 +36,19 @@
     <fragment
             android:id="@+id/merchantHistory"
             android:name="net.taler.merchantpos.MerchantHistory"
-            android:label="Payment History"
+            android:label="@string/history_label"
             tools:layout="@layout/fragment_merchant_history" />
 
     <fragment
             android:id="@+id/merchantSettings"
             android:name="net.taler.merchantpos.config.MerchantConfigFragment"
-            android:label="Merchant Settings"
-            tools:layout="@layout/fragment_merchant_settings" />
+            android:label="@string/config_label"
+            tools:layout="@layout/fragment_merchant_config" />
 
     <fragment
             android:id="@+id/configFetcher"
             android:name="net.taler.merchantpos.config.ConfigFetcherFragment"
-            android:label="Fetching Configuration"
+            android:label="@string/config_fetching_label"
             tools:layout="@layout/fragment_config_fetcher">
         <action
                 android:id="@+id/action_configFetcher_to_merchantSettings"
@@ -64,7 +64,7 @@
     <fragment
             android:id="@+id/paymentSuccess"
             android:name="net.taler.merchantpos.payment.PaymentSuccessFragment"
-            android:label="Payment Received"
+            android:label="@string/payment_received"
             tools:layout="@layout/fragment_payment_success" />
 
     <action
diff --git a/app/src/main/res/values-night/colors.xml 
b/app/src/main/res/values-night/colors.xml
index 47721b4..10bdbb9 100644
--- a/app/src/main/res/values-night/colors.xml
+++ b/app/src/main/res/values-night/colors.xml
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
+    <color name="highlightedBackground">#2E2E2E</color>
     <color name="selectedBackground">#363636</color>
 </resources>
diff --git a/app/src/main/res/values/colors.xml 
b/app/src/main/res/values/colors.xml
index 3ed8874..bf0c849 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -4,7 +4,11 @@
     <color name="colorPrimaryDark">#5D4037</color>
     <color name="colorAccent">#FFEB3B</color>
 
+    <color name="highlightedBackground">#E4E4E4</color>
     <color name="selectedBackground">#DADADA</color>
     <color name="bottomButtons">#9E9D24</color>
-    <color name="logoutButton">#C62828</color>
+
+    <color name="green">#388E3C</color>
+    <color name="red">#C62828</color>
+
 </resources>
diff --git a/app/src/main/res/values/strings.xml 
b/app/src/main/res/values/strings.xml
index fe4a61b..d313f03 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -7,7 +7,9 @@
     <string name="menu_history">History</string>
     <string name="menu_settings">Settings</string>
 
-    <string name="order_total">Total: %1$.2f</string>
+    <string name="order_label">Order</string>
+    <!-- The first placeholder is the amount and the second the currency -->
+    <string name="order_total">Total: %1$.2f %2$s</string>
     <string name="order_restart">Restart</string>
     <string name="order_undo">Undo</string>
     <string name="button_reconfigure">Reconfigure</string>
@@ -15,6 +17,7 @@
     <string name="button_logout">Logout</string>
     <string name="button_complete">Complete</string>
 
+    <string name="config_label">Merchant Settings</string>
     <string name="config_url">Configuration URL</string>
     <string name="config_username">Username</string>
     <string name="config_password">Password</string>
@@ -26,15 +29,22 @@
     <string name="config_fetching">Fetching Configuration…</string>
     <string name="config_save_password">Remember Password</string>
     <string name="config_forget_password">Forget</string>
+    <string name="config_changed">Changed to new merchant using %s</string>
+    <string name="config_fetching_label">Fetching Configuration</string>
 
     <string name="payment_intro_nfc">Please scan QR Code or use NFC to 
pay</string>
     <string name="payment_intro">Please scan QR Code to pay</string>
     <string name="payment_cancel">Cancel Payment</string>
-    <string name="payment_received">Payment Received</string>
-    <string name="payment_back_button">Go Back</string>
+    <string name="payment_received">Payment received</string>
+    <string name="payment_back_button">Continue</string>
     <string name="payment_order_ref">Order Reference: %s</string>
+    <string name="payment_process_label">Customer Payment Required</string>
+    <string name="payment_canceled">Payment Canceled</string>
 
+    <string name="history_label">Payment History</string>
     <string name="history_received_at">Received at</string>
     <string name="history_ref_no">Ref. No:</string>
 
+    <string name="error_network">Network Error</string>
+
 </resources>
diff --git a/build.gradle b/build.gradle
index dfab280..82723c0 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,17 +1,13 @@
-// Top-level build file where you can add configuration options common to all 
sub-projects/modules.
-
 buildscript {
-    ext.kotlin_version = '1.3.41'
+    ext.kotlin_version = '1.3.61'
     repositories {
         google()
         jcenter()
         
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:3.5.3'
+        classpath 'com.android.tools.build:gradle:3.6.0'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
-        // NOTE: Do not place your application dependencies here; they belong
-        // in the individual module build.gradle files
     }
 }
 
diff --git a/gradle/wrapper/gradle-wrapper.properties 
b/gradle/wrapper/gradle-wrapper.properties
index 344e98a..ef25684 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Tue Aug 20 23:27:29 CEST 2019
+#Tue Feb 25 09:57:57 BRT 2020
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip

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



reply via email to

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