[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-cashier-terminal-android] 02/02: Improve UI and balance error han
From: |
gnunet |
Subject: |
[taler-cashier-terminal-android] 02/02: Improve UI and balance error handling |
Date: |
Mon, 24 Feb 2020 19:38:06 +0100 |
This is an automated email from the git hooks/post-receive script.
torsten-grote pushed a commit to branch master
in repository cashier-terminal-android.
commit b5c2b27bd9c9e440bd73f7011c865374210079ae
Author: Torsten Grote <address@hidden>
AuthorDate: Mon Feb 24 15:21:41 2020 -0300
Improve UI and balance error handling
---
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 ++++++++++----------
app/src/main/res/values-night/colors.xml | 20 ++
app/src/main/res/values/colors.xml | 1 +
app/src/main/res/values/strings.xml | 1 +
app/src/main/res/values/styles.xml | 2 +-
11 files changed, 441 insertions(+), 371 deletions(-)
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/values-night/colors.xml
b/app/src/main/res/values-night/colors.xml
new file mode 100644
index 0000000..55dde58
--- /dev/null
+++ b/app/src/main/res/values-night/colors.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ This file is part of GNU Taler
+ ~ (C) 2020 Taler Systems S.A.
+ ~
+ ~ GNU Taler is free software; you can redistribute it and/or modify it under
the
+ ~ terms of the GNU General Public License as published by the Free Software
+ ~ Foundation; either version 3, or (at your option) any later version.
+ ~
+ ~ GNU Taler is distributed in the hope that it will be useful, but WITHOUT
ANY
+ ~ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR
+ ~ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ ~
+ ~ You should have received a copy of the GNU General Public License along
with
+ ~ GNU Taler; see the file COPYING. If not, see
<http://www.gnu.org/licenses/>
+ -->
+
+<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.