gnunet-svn
[Top][All Lists]
Advanced

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

[taler-cashier-terminal-android] branch master updated (42a5f0e -> b5c2b


From: gnunet
Subject: [taler-cashier-terminal-android] branch master updated (42a5f0e -> b5c2b27)
Date: Mon, 24 Feb 2020 19:38:04 +0100

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

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

    from 42a5f0e  Fix a few lint warnings
     new 2251966  Add CI file for automatic nightly repo
     new b5c2b27  Improve UI and balance error handling

The 2 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 +++
 app/src/main/AndroidManifest.xml                   |   1 -
 app/src/main/java/net/taler/cashier/Amount.kt      |   7 +-
 .../main/java/net/taler/cashier/BalanceFragment.kt |  27 +-
 .../main/java/net/taler/cashier/MainViewModel.kt   |  11 +-
 .../net/taler/cashier/withdraw/WithdrawManager.kt  |   5 +-
 .../main/res/layout-w550dp/fragment_balance.xml    | 372 +++++++++++----------
 app/src/main/res/layout/fragment_balance.xml       | 365 ++++++++++----------
 .../colors.xml}                                    |   9 +-
 app/src/main/res/values/colors.xml                 |   1 +
 app/src/main/res/values/strings.xml                |   1 +
 app/src/main/res/values/styles.xml                 |   2 +-
 12 files changed, 465 insertions(+), 375 deletions(-)
 create mode 100644 .gitlab-ci.yml
 copy app/src/main/res/{xml/backup_descriptor.xml => values-night/colors.xml} 
(86%)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..edd6100
--- /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">Cashier 
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.cashier.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/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f434144..bf1d766 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -4,7 +4,6 @@
     package="net.taler.cashier">
 
     <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
     <uses-permission android:name="android.permission.NFC" />
 
     <application
diff --git a/app/src/main/java/net/taler/cashier/Amount.kt 
b/app/src/main/java/net/taler/cashier/Amount.kt
index 97b60b6..2c237c8 100644
--- a/app/src/main/java/net/taler/cashier/Amount.kt
+++ b/app/src/main/java/net/taler/cashier/Amount.kt
@@ -34,9 +34,12 @@ data class Amount(val currency: String, val amount: String) {
             var amount = groups[3].toDoubleOrNull() ?: return null
             if (groups[1] == "-") amount *= -1
             val currency = groups[2]
-            return Amount(currency, String.format("%.2f", amount))
+            val amountStr = amount.toString()
+            // only display as many digits as required to precisely render the 
balance
+            return Amount(currency, amountStr.removeSuffix(".0"))
         }
-
     }
 
+    override fun toString() = "$amount $currency"
+
 }
diff --git a/app/src/main/java/net/taler/cashier/BalanceFragment.kt 
b/app/src/main/java/net/taler/cashier/BalanceFragment.kt
index 98783c8..6cb42e3 100644
--- a/app/src/main/java/net/taler/cashier/BalanceFragment.kt
+++ b/app/src/main/java/net/taler/cashier/BalanceFragment.kt
@@ -16,6 +16,7 @@
 
 package net.taler.cashier
 
+import android.annotation.SuppressLint
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.Menu
@@ -52,12 +53,7 @@ class BalanceFragment : Fragment() {
             onLastTransaction(lastTransaction)
         })
         viewModel.balance.observe(viewLifecycleOwner, Observer { balance ->
-            balanceView.text = balance
-            val fadeIn =
-                listOf(introView, button5, button10, button20, button50, 
amountView, currencyView)
-            for (v in fadeIn) v.fadeIn()
-            fab.show()
-            progressBar.fadeOut()
+            onBalanceUpdated(balance)
         })
         button5.setOnClickListener { onAmountButtonPressed(5) }
         button10.setOnClickListener { onAmountButtonPressed(10) }
@@ -76,7 +72,7 @@ class BalanceFragment : Fragment() {
         viewModel.currency.observe(viewLifecycleOwner, Observer { currency ->
             currencyView.text = currency
         })
-        fab.setOnClickListener { onAmountConfirmed(getAmountFromView()) }
+        confirmWithdrawalButton.setOnClickListener { 
onAmountConfirmed(getAmountFromView()) }
     }
 
     override fun onStart() {
@@ -113,6 +109,23 @@ class BalanceFragment : Fragment() {
         else -> super.onOptionsItemSelected(item)
     }
 
+    private fun onBalanceUpdated(amount: Amount?) {
+        if (amount == null) {
+            balanceView.text = getString(R.string.balance_error)
+        } else {
+            @SuppressLint("SetTextI18n")
+            balanceView.text = "${amount.amount} ${amount.currency}"
+            listOf(
+                introView,
+                button5, button10, button20, button50,
+                amountView,
+                currencyView,
+                confirmWithdrawalButton
+            ).forEach { it.fadeIn() }
+        }
+        progressBar.fadeOut()
+    }
+
     private fun onAmountButtonPressed(amount: Int) {
         amountView.editText!!.setText(amount.toString())
         amountView.error = null
diff --git a/app/src/main/java/net/taler/cashier/MainViewModel.kt 
b/app/src/main/java/net/taler/cashier/MainViewModel.kt
index 05b2c0c..6f3a0c9 100644
--- a/app/src/main/java/net/taler/cashier/MainViewModel.kt
+++ b/app/src/main/java/net/taler/cashier/MainViewModel.kt
@@ -44,7 +44,7 @@ private const val PREF_KEY_USERNAME = "username"
 private const val PREF_KEY_PASSWORD = "password"
 private const val PREF_KEY_CURRENCY = "currency"
 
-class MainViewModel(private val app: Application) : AndroidViewModel(app) {
+class MainViewModel(app: Application) : AndroidViewModel(app) {
 
     val configDestination = 
ConfigFragmentDirections.actionGlobalConfigFragment()
 
@@ -67,8 +67,8 @@ class MainViewModel(private val app: Application) : 
AndroidViewModel(app) {
     private val mConfigResult = MutableLiveData<ConfigResult>()
     val configResult: LiveData<ConfigResult> = mConfigResult
 
-    private val mBalance = MutableLiveData<String>()
-    val balance: LiveData<String> = mBalance
+    private val mBalance = MutableLiveData<Amount>()
+    val balance: LiveData<Amount> = mBalance
 
     internal val withdrawManager = WithdrawManager(app, this)
 
@@ -123,12 +123,11 @@ class MainViewModel(private val app: Application) : 
AndroidViewModel(app) {
         val result = when (val response = makeJsonGetRequest(url, config)) {
             is HttpJsonResult.Success -> {
                 val balance = response.json.getString("balance")
-                val amount = fromStringSigned(balance)!!
-                "${amount.amount} ${amount.currency}"
+                fromStringSigned(balance)
             }
             is HttpJsonResult.Error -> {
                 // show last known value or error string in case of an error
-                mBalance.value ?: app.getString(R.string.balance_error)
+                mBalance.value
             }
         }
         mBalance.postValue(result)
diff --git a/app/src/main/java/net/taler/cashier/withdraw/WithdrawManager.kt 
b/app/src/main/java/net/taler/cashier/withdraw/WithdrawManager.kt
index 5c5d6dd..d92b74a 100644
--- a/app/src/main/java/net/taler/cashier/withdraw/WithdrawManager.kt
+++ b/app/src/main/java/net/taler/cashier/withdraw/WithdrawManager.kt
@@ -71,9 +71,8 @@ class WithdrawManager(
 
     @UiThread
     fun hasSufficientBalance(amount: Int): Boolean {
-        val balanceStr = viewModel.balance.value?.split(' ')?.get(0)
-        if (balanceStr == app.getString(R.string.balance_error)) return false
-        val balanceDouble = balanceStr?.toDouble() ?: 0.0
+        val balanceStr = viewModel.balance.value?.amount ?: return false
+        val balanceDouble = balanceStr.toDouble()
         return amount <= balanceDouble
     }
 
diff --git a/app/src/main/res/layout-w550dp/fragment_balance.xml 
b/app/src/main/res/layout-w550dp/fragment_balance.xml
index fe014c1..4ed92b4 100644
--- a/app/src/main/res/layout-w550dp/fragment_balance.xml
+++ b/app/src/main/res/layout-w550dp/fragment_balance.xml
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="utf-8"?><!--
   ~ This file is part of GNU Taler
   ~ (C) 2020 Taler Systems S.A.
   ~
@@ -15,197 +14,208 @@
   ~ GNU Taler; see the file COPYING.  If not, see 
<http://www.gnu.org/licenses/>
   -->
 
-<androidx.coordinatorlayout.widget.CoordinatorLayout 
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:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".BalanceFragment">
 
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
+    <TextView
+        android:id="@+id/lastTransactionView"
+        style="@style/Widget.MaterialComponents.Snackbar.FullWidth"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:background="?attr/colorPrimaryDark"
+        android:drawableStart="@drawable/ic_check_circle"
+        android:drawablePadding="8dp"
+        android:drawableTint="?attr/colorOnPrimarySurface"
+        android:gravity="center_vertical"
+        android:padding="8dp"
+        android:textColor="?attr/colorOnPrimarySurface"
+        android:visibility="gone"
+        app:layout_constraintEnd_toStartOf="@+id/guideline"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="@string/transaction_last_success"
+        tools:visibility="visible" />
 
-        <TextView
-            android:id="@+id/lastTransactionView"
-            style="@style/Widget.MaterialComponents.Snackbar.FullWidth"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:background="?attr/colorPrimaryDark"
-            android:drawableStart="@drawable/ic_check_circle"
-            android:drawablePadding="8dp"
-            android:drawableTint="?attr/colorOnPrimarySurface"
-            android:gravity="center_vertical"
-            android:padding="8dp"
-            android:textColor="?attr/colorOnPrimarySurface"
-            android:visibility="gone"
-            app:layout_constraintEnd_toStartOf="@+id/guideline"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:text="@string/transaction_last_success"
-            tools:visibility="visible" />
-
-        <TextView
-            android:id="@+id/balanceLabel"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="32dp"
-            android:layout_marginTop="32dp"
-            android:layout_marginEnd="32dp"
-            android:text="@string/balance_current_label"
-            android:textAppearance="@style/TextAppearance.AppCompat.Medium"
-            app:layout_constraintBottom_toTopOf="@+id/balanceView"
-            app:layout_constraintEnd_toStartOf="@+id/guideline"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/lastTransactionView"
-            app:layout_constraintVertical_bias="0.0"
-            app:layout_constraintVertical_chainStyle="packed" />
-
-        <TextView
-            android:id="@+id/balanceView"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_margin="32dp"
-            android:textAppearance="@style/TextAppearance.AppCompat.Headline"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toStartOf="@+id/guideline"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/balanceLabel"
-            tools:text="100 KUDOS" />
-
-        <ProgressBar
-            android:id="@+id/progressBar"
-            style="?android:attr/progressBarStyle"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            app:layout_constraintBottom_toBottomOf="@+id/balanceView"
-            app:layout_constraintEnd_toEndOf="@+id/balanceView"
-            app:layout_constraintStart_toStartOf="@+id/balanceView"
-            app:layout_constraintTop_toTopOf="@+id/balanceView" />
-
-        <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.5" />
+    <View
+        android:id="@+id/balanceBackground"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:background="@color/background"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="@+id/guideline"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/lastTransactionView" />
+
+    <TextView
+        android:id="@+id/balanceLabel"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="32dp"
+        android:layout_marginTop="32dp"
+        android:layout_marginEnd="32dp"
+        android:text="@string/balance_current_label"
+        android:textAppearance="@style/TextAppearance.AppCompat.Medium"
+        app:layout_constraintBottom_toTopOf="@+id/balanceView"
+        app:layout_constraintEnd_toStartOf="@+id/guideline"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/lastTransactionView"
+        app:layout_constraintVertical_bias="0.0"
+        app:layout_constraintVertical_chainStyle="packed" />
+
+    <TextView
+        android:id="@+id/balanceView"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/default_margin"
+        android:textAppearance="@style/TextAppearance.AppCompat.Headline"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@+id/guideline"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/balanceLabel"
+        tools:text="100 KUDOS" />
+
+    <ProgressBar
+        android:id="@+id/progressBar"
+        style="?android:attr/progressBarStyle"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:layout_constraintBottom_toBottomOf="@+id/balanceView"
+        app:layout_constraintEnd_toEndOf="@+id/balanceView"
+        app:layout_constraintStart_toStartOf="@+id/balanceView"
+        app:layout_constraintTop_toTopOf="@+id/balanceView" />
 
-        <TextView
-            android:id="@+id/introView"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_margin="32dp"
-            android:text="@string/withdraw_into"
-            android:textAlignment="center"
-            android:textAppearance="@style/TextAppearance.AppCompat.Medium"
-            android:visibility="invisible"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="@+id/guideline"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:visibility="visible" />
-
-        <Button
-            android:id="@+id/button5"
-            style="@style/AmountButton"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="5"
-            android:visibility="invisible"
-            app:layout_constraintEnd_toStartOf="@+id/button10"
-            app:layout_constraintHorizontal_chainStyle="packed"
-            app:layout_constraintStart_toStartOf="@+id/guideline"
-            app:layout_constraintTop_toBottomOf="@+id/introView"
-            tools:ignore="HardcodedText"
-            tools:visibility="visible" />
-
-        <Button
-            android:id="@+id/button10"
-            style="@style/AmountButton"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="10"
-            android:visibility="invisible"
-            app:layout_constraintEnd_toStartOf="@+id/button20"
-            app:layout_constraintStart_toEndOf="@+id/button5"
-            app:layout_constraintTop_toBottomOf="@+id/introView"
-            tools:ignore="HardcodedText"
-            tools:visibility="visible" />
-
-        <Button
-            android:id="@+id/button20"
-            style="@style/AmountButton"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="20"
-            android:visibility="invisible"
-            app:layout_constraintEnd_toStartOf="@+id/button50"
-            app:layout_constraintStart_toEndOf="@+id/button10"
-            app:layout_constraintTop_toBottomOf="@+id/introView"
-            tools:ignore="HardcodedText"
-            tools:visibility="visible" />
-
-        <Button
-            android:id="@+id/button50"
-            style="@style/AmountButton"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="50"
-            android:visibility="invisible"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toEndOf="@+id/button20"
-            app:layout_constraintTop_toBottomOf="@+id/introView"
-            tools:ignore="HardcodedText"
-            tools:visibility="visible" />
-
-        <com.google.android.material.textfield.TextInputLayout
-            android:id="@+id/amountView"
-            
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_margin="32dp"
-            android:hint="@string/withdraw_input_amount"
-            android:visibility="invisible"
-            app:endIconDrawable="@drawable/ic_clear"
-            app:endIconMode="clear_text"
-            app:endIconTint="?attr/colorControlNormal"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="@+id/guideline"
-            app:layout_constraintTop_toBottomOf="@+id/button5"
-            tools:visibility="visible">
-
-            <com.google.android.material.textfield.TextInputEditText
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:ems="6"
-                android:imeOptions="actionGo"
-                android:inputType="number"
-                android:maxLength="4" />
-
-        </com.google.android.material.textfield.TextInputLayout>
-
-        <TextView
-            android:id="@+id/currencyView"
-            android:layout_width="0dp"
+    <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.5" />
+
+    <TextView
+        android:id="@+id/introView"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_margin="32dp"
+        android:text="@string/withdraw_into"
+        android:textAlignment="center"
+        android:textAppearance="@style/TextAppearance.AppCompat.Medium"
+        android:visibility="invisible"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="@+id/guideline"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:visibility="visible" />
+
+    <Button
+        android:id="@+id/button5"
+        style="@style/AmountButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="5"
+        android:visibility="invisible"
+        app:layout_constraintEnd_toStartOf="@+id/button10"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintStart_toStartOf="@+id/guideline"
+        app:layout_constraintTop_toBottomOf="@+id/introView"
+        tools:ignore="HardcodedText"
+        tools:visibility="visible" />
+
+    <Button
+        android:id="@+id/button10"
+        style="@style/AmountButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="10"
+        android:visibility="invisible"
+        app:layout_constraintEnd_toStartOf="@+id/button20"
+        app:layout_constraintStart_toEndOf="@+id/button5"
+        app:layout_constraintTop_toBottomOf="@+id/introView"
+        tools:ignore="HardcodedText"
+        tools:visibility="visible" />
+
+    <Button
+        android:id="@+id/button20"
+        style="@style/AmountButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="20"
+        android:visibility="invisible"
+        app:layout_constraintEnd_toStartOf="@+id/button50"
+        app:layout_constraintStart_toEndOf="@+id/button10"
+        app:layout_constraintTop_toBottomOf="@+id/introView"
+        tools:ignore="HardcodedText"
+        tools:visibility="visible" />
+
+    <Button
+        android:id="@+id/button50"
+        style="@style/AmountButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="50"
+        android:visibility="invisible"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/button20"
+        app:layout_constraintTop_toBottomOf="@+id/introView"
+        tools:ignore="HardcodedText"
+        tools:visibility="visible" />
+
+    <com.google.android.material.textfield.TextInputLayout
+        android:id="@+id/amountView"
+        
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_margin="32dp"
+        android:hint="@string/withdraw_input_amount"
+        android:visibility="invisible"
+        app:endIconDrawable="@drawable/ic_clear"
+        app:endIconMode="clear_text"
+        app:endIconTint="?attr/colorControlNormal"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="@+id/guideline"
+        app:layout_constraintTop_toBottomOf="@+id/button5"
+        tools:visibility="visible">
+
+        <com.google.android.material.textfield.TextInputEditText
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_margin="16dp"
-            android:visibility="invisible"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toEndOf="@+id/amountView"
-            app:layout_constraintTop_toTopOf="@+id/amountView"
-            tools:text="TESTKUDOS"
-            tools:visibility="visible" />
-
-    </androidx.constraintlayout.widget.ConstraintLayout>
-
-    <com.google.android.material.floatingactionbutton.FloatingActionButton
-        android:id="@+id/fab"
+            android:ems="6"
+            android:imeOptions="actionGo"
+            android:inputType="number"
+            android:maxLength="4" />
+
+    </com.google.android.material.textfield.TextInputLayout>
+
+    <TextView
+        android:id="@+id/currencyView"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_margin="16dp"
+        android:visibility="invisible"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/amountView"
+        app:layout_constraintTop_toTopOf="@+id/amountView"
+        tools:text="TESTKUDOS"
+        tools:visibility="visible" />
+
+    <com.google.android.material.button.MaterialButton
+        android:id="@+id/confirmWithdrawalButton"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_gravity="bottom|end"
         android:layout_margin="@dimen/default_margin"
+        android:backgroundTint="@color/green"
+        android:drawableLeft="@drawable/ic_withdraw"
+        android:drawableTint="?attr/colorOnPrimarySurface"
+        android:text="@string/withdraw_button_confirm"
         android:visibility="invisible"
-        app:srcCompat="@drawable/ic_withdraw"
-        app:useCompatPadding="true"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="@+id/guideline"
+        app:layout_constraintTop_toBottomOf="@+id/amountView"
+        app:layout_constraintVertical_bias="1.0"
+        tools:ignore="RtlHardcoded"
         tools:visibility="visible" />
 
-</androidx.coordinatorlayout.widget.CoordinatorLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/app/src/main/res/layout/fragment_balance.xml 
b/app/src/main/res/layout/fragment_balance.xml
index b4367f3..3ab6423 100644
--- a/app/src/main/res/layout/fragment_balance.xml
+++ b/app/src/main/res/layout/fragment_balance.xml
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="utf-8"?><!--
   ~ This file is part of GNU Taler
   ~ (C) 2020 Taler Systems S.A.
   ~
@@ -15,185 +14,211 @@
   ~ GNU Taler; see the file COPYING.  If not, see 
<http://www.gnu.org/licenses/>
   -->
 
-<androidx.coordinatorlayout.widget.CoordinatorLayout 
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:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".BalanceFragment">
 
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
+    <TextView
+        android:id="@+id/lastTransactionView"
+        style="@style/Widget.MaterialComponents.Snackbar.FullWidth"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:background="?attr/colorPrimaryDark"
+        android:drawableStart="@drawable/ic_check_circle"
+        android:drawablePadding="8dp"
+        android:drawableTint="?attr/colorOnPrimarySurface"
+        android:gravity="center_vertical"
+        android:padding="8dp"
+        android:textColor="?attr/colorOnPrimarySurface"
+        android:visibility="gone"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="@string/transaction_last_success"
+        tools:visibility="visible" />
 
-        <TextView
-            android:id="@+id/lastTransactionView"
-            style="@style/Widget.MaterialComponents.Snackbar.FullWidth"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:background="?attr/colorPrimaryDark"
-            android:drawableStart="@drawable/ic_check_circle"
-            android:drawablePadding="8dp"
-            android:drawableTint="?attr/colorOnPrimarySurface"
-            android:gravity="center_vertical"
-            android:padding="8dp"
-            android:textColor="?attr/colorOnPrimarySurface"
-            android:visibility="gone"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:text="@string/transaction_last_success"
-            tools:visibility="visible" />
-
-        <TextView
-            android:id="@+id/balanceLabel"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_margin="32dp"
-            android:text="@string/balance_current_label"
-            android:textAppearance="@style/TextAppearance.AppCompat.Medium"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/lastTransactionView" />
-
-        <TextView
-            android:id="@+id/balanceView"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_margin="32dp"
-            android:textAppearance="@style/TextAppearance.AppCompat.Headline"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/balanceLabel"
-            tools:text="100 KUDOS" />
-
-        <ProgressBar
-            android:id="@+id/progressBar"
-            style="?android:attr/progressBarStyle"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            app:layout_constraintBottom_toBottomOf="@+id/balanceView"
-            app:layout_constraintEnd_toEndOf="@+id/balanceView"
-            app:layout_constraintStart_toStartOf="@+id/balanceView"
-            app:layout_constraintTop_toTopOf="@+id/balanceView" />
-
-        <TextView
-            android:id="@+id/introView"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_margin="32dp"
-            android:text="@string/withdraw_into"
-            android:textAlignment="center"
-            android:textAppearance="@style/TextAppearance.AppCompat.Medium"
-            android:visibility="invisible"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/progressBar"
-            tools:visibility="visible" />
-
-        <Button
-            android:id="@+id/button5"
-            style="@style/AmountButton"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="5"
-            android:visibility="invisible"
-            app:layout_constraintEnd_toStartOf="@+id/button10"
-            app:layout_constraintHorizontal_chainStyle="packed"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/introView"
-            tools:ignore="HardcodedText"
-            tools:visibility="visible" />
-
-        <Button
-            android:id="@+id/button10"
-            style="@style/AmountButton"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="10"
-            android:visibility="invisible"
-            app:layout_constraintEnd_toStartOf="@+id/button20"
-            app:layout_constraintStart_toEndOf="@+id/button5"
-            app:layout_constraintTop_toBottomOf="@+id/introView"
-            tools:ignore="HardcodedText"
-            tools:visibility="visible" />
-
-        <Button
-            android:id="@+id/button20"
-            style="@style/AmountButton"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="20"
-            android:visibility="invisible"
-            app:layout_constraintEnd_toStartOf="@+id/button50"
-            app:layout_constraintStart_toEndOf="@+id/button10"
-            app:layout_constraintTop_toBottomOf="@+id/introView"
-            tools:ignore="HardcodedText"
-            tools:visibility="visible" />
-
-        <Button
-            android:id="@+id/button50"
-            style="@style/AmountButton"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="50"
-            android:visibility="invisible"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toEndOf="@+id/button20"
-            app:layout_constraintTop_toBottomOf="@+id/introView"
-            tools:ignore="HardcodedText"
-            tools:visibility="visible" />
-
-        <com.google.android.material.textfield.TextInputLayout
-            android:id="@+id/amountView"
-            
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_margin="32dp"
-            android:hint="@string/withdraw_input_amount"
-            android:visibility="invisible"
-            app:endIconDrawable="@drawable/ic_clear"
-            app:endIconMode="clear_text"
-            app:endIconTint="?attr/colorControlNormal"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/button5"
-            tools:visibility="visible">
-
-            <com.google.android.material.textfield.TextInputEditText
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:ems="6"
-                android:imeOptions="actionGo"
-                android:inputType="number"
-                android:maxLength="4" />
-
-        </com.google.android.material.textfield.TextInputLayout>
-
-        <TextView
-            android:id="@+id/currencyView"
-            android:layout_width="0dp"
+    <View
+        android:id="@+id/balanceBackground"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:background="@color/background"
+        app:layout_constraintBottom_toBottomOf="@+id/balanceView"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/lastTransactionView" />
+
+    <TextView
+        android:id="@+id/balanceLabel"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/default_margin"
+        android:text="@string/balance_current_label"
+        android:textAppearance="@style/TextAppearance.AppCompat.Medium"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/lastTransactionView" />
+
+    <TextView
+        android:id="@+id/balanceView"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingStart="@dimen/default_margin"
+        android:paddingTop="8dp"
+        android:paddingEnd="@dimen/default_margin"
+        android:paddingBottom="@dimen/default_margin"
+        android:textAppearance="@style/TextAppearance.AppCompat.Headline"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/balanceLabel"
+        tools:text="100 KUDOS" />
+
+    <ProgressBar
+        android:id="@+id/progressBar"
+        style="?android:attr/progressBarStyle"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:layout_constraintBottom_toBottomOf="@+id/balanceView"
+        app:layout_constraintEnd_toEndOf="@+id/balanceView"
+        app:layout_constraintStart_toStartOf="@+id/balanceView"
+        app:layout_constraintTop_toTopOf="@+id/balanceView" />
+
+    <TextView
+        android:id="@+id/introView"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/default_margin"
+        android:layout_marginTop="32dp"
+        android:layout_marginEnd="@dimen/default_margin"
+        android:text="@string/withdraw_into"
+        android:textAlignment="center"
+        android:textAppearance="@style/TextAppearance.AppCompat.Medium"
+        android:visibility="invisible"
+        app:layout_constraintBottom_toTopOf="@+id/button5"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/balanceBackground"
+        app:layout_constraintVertical_bias="0.25"
+        app:layout_constraintVertical_chainStyle="packed"
+        tools:visibility="visible" />
+
+    <Button
+        android:id="@+id/button5"
+        style="@style/AmountButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="5"
+        android:visibility="invisible"
+        app:layout_constraintBottom_toTopOf="@+id/amountView"
+        app:layout_constraintEnd_toStartOf="@+id/button10"
+        app:layout_constraintHorizontal_bias="0.5"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/introView"
+        tools:ignore="HardcodedText"
+        tools:visibility="visible" />
+
+    <Button
+        android:id="@+id/button10"
+        style="@style/AmountButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="10"
+        android:visibility="invisible"
+        app:layout_constraintEnd_toStartOf="@+id/button20"
+        app:layout_constraintStart_toEndOf="@+id/button5"
+        app:layout_constraintTop_toBottomOf="@+id/introView"
+        tools:ignore="HardcodedText"
+        tools:visibility="visible" />
+
+    <Button
+        android:id="@+id/button20"
+        style="@style/AmountButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="20"
+        android:visibility="invisible"
+        app:layout_constraintEnd_toStartOf="@+id/button50"
+        app:layout_constraintStart_toEndOf="@+id/button10"
+        app:layout_constraintTop_toBottomOf="@+id/introView"
+        tools:ignore="HardcodedText"
+        tools:visibility="visible" />
+
+    <Button
+        android:id="@+id/button50"
+        style="@style/AmountButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="50"
+        android:visibility="invisible"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/button20"
+        app:layout_constraintTop_toBottomOf="@+id/introView"
+        tools:ignore="HardcodedText"
+        tools:visibility="visible" />
+
+    <com.google.android.material.textfield.TextInputLayout
+        android:id="@+id/amountView"
+        
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/default_margin"
+        android:layout_marginTop="@dimen/default_margin"
+        android:hint="@string/withdraw_input_amount"
+        android:visibility="invisible"
+        app:endIconDrawable="@drawable/ic_clear"
+        app:endIconMode="clear_text"
+        app:endIconTint="?attr/colorControlNormal"
+        app:layout_constraintBottom_toTopOf="@+id/confirmWithdrawalButton"
+        app:layout_constraintEnd_toStartOf="@+id/currencyView"
+        app:layout_constraintHorizontal_bias="0.5"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/button5"
+        tools:visibility="visible">
+
+        <com.google.android.material.textfield.TextInputEditText
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_margin="16dp"
-            android:textAppearance="@style/TextAppearance.AppCompat.Medium"
-            android:visibility="invisible"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toEndOf="@+id/amountView"
-            app:layout_constraintTop_toTopOf="@+id/amountView"
-            tools:text="TESTKUDOS"
-            tools:visibility="visible" />
-
-    </androidx.constraintlayout.widget.ConstraintLayout>
-
-    <com.google.android.material.floatingactionbutton.FloatingActionButton
-        android:id="@+id/fab"
+            android:ems="6"
+            android:imeOptions="actionGo"
+            android:inputType="number"
+            android:maxLength="4" />
+
+    </com.google.android.material.textfield.TextInputLayout>
+
+    <TextView
+        android:id="@+id/currencyView"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/default_margin"
+        android:textAppearance="@style/TextAppearance.AppCompat.Medium"
+        android:visibility="invisible"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0.5"
+        app:layout_constraintStart_toEndOf="@+id/amountView"
+        app:layout_constraintTop_toTopOf="@+id/amountView"
+        tools:text="TESTKUDOS"
+        tools:visibility="visible" />
+
+    <com.google.android.material.button.MaterialButton
+        android:id="@+id/confirmWithdrawalButton"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_gravity="bottom|end"
         android:layout_margin="@dimen/default_margin"
+        android:backgroundTint="@color/green"
+        android:drawableLeft="@drawable/ic_withdraw"
+        android:drawableTint="?attr/colorOnPrimarySurface"
+        android:text="@string/withdraw_button_confirm"
         android:visibility="invisible"
-        app:srcCompat="@drawable/ic_withdraw"
-        app:useCompatPadding="true"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0.5"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/amountView"
+        tools:ignore="RtlHardcoded"
         tools:visibility="visible" />
 
-</androidx.coordinatorlayout.widget.CoordinatorLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/app/src/main/res/xml/backup_descriptor.xml 
b/app/src/main/res/values-night/colors.xml
similarity index 86%
copy from app/src/main/res/xml/backup_descriptor.xml
copy to app/src/main/res/values-night/colors.xml
index a298494..55dde58 100644
--- a/app/src/main/res/xml/backup_descriptor.xml
+++ b/app/src/main/res/values-night/colors.xml
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?><!--
+<?xml version="1.0" encoding="utf-8"?>
+<!--
   ~ This file is part of GNU Taler
   ~ (C) 2020 Taler Systems S.A.
   ~
@@ -14,6 +15,6 @@
   ~ GNU Taler; see the file COPYING.  If not, see 
<http://www.gnu.org/licenses/>
   -->
 
-<full-backup-content>
-
-</full-backup-content>
+<resources>
+    <color name="background">#222222</color>
+</resources>
diff --git a/app/src/main/res/values/colors.xml 
b/app/src/main/res/values/colors.xml
index f69adcd..61338da 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -4,6 +4,7 @@
     <color name="colorPrimaryDark">#6A1B9A</color>
     <color name="colorAccent">#D81B60</color>
 
+    <color name="background">#F1F1F1</color>
     <color name="green">#388E3C</color>
     <color name="red">#D32F2F</color>
 </resources>
diff --git a/app/src/main/res/values/strings.xml 
b/app/src/main/res/values/strings.xml
index c998151..37c4d92 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -20,6 +20,7 @@
     <string name="withdraw_error_zero">Enter positive amount</string>
     <string name="withdraw_error_insufficient_balance">Insufficient 
balance</string>
     <string name="withdraw_error_fetch">Error communicating with bank</string>
+    <string name="withdraw_button_confirm">Withdraw</string>
 
     <string name="transaction_intro">Scan code\nwith the Taler wallet app\nto 
get</string>
     <string name="transaction_intro_nfc">Scan code or use NFC\nwith the Taler 
wallet app\nto get</string>
diff --git a/app/src/main/res/values/styles.xml 
b/app/src/main/res/values/styles.xml
index 84dfe74..4339684 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -22,7 +22,7 @@
         <item name="android:minWidth">48dp</item>
         <item name="android:layout_marginStart">@dimen/default_margin</item>
         <item name="android:layout_marginEnd">@dimen/default_margin</item>
-        <item name="android:layout_marginTop">32dp</item>
+        <item name="android:layout_marginTop">16dp</item>
     </style>
 
 </resources>

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



reply via email to

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