[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-cashier-terminal-android] 02/04: Show the users current balance o
From: |
gnunet |
Subject: |
[taler-cashier-terminal-android] 02/04: Show the users current balance on the main screen |
Date: |
Wed, 05 Feb 2020 18:30:18 +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 d4c7542164b3cd2ee34df407e10877a17170437e
Author: Torsten Grote <address@hidden>
AuthorDate: Wed Feb 5 12:19:02 2020 -0300
Show the users current balance on the main screen
Note that this is not yet using the final API
---
app/src/main/java/net/taler/cashier/Amount.kt | 13 ++++++
.../main/java/net/taler/cashier/BalanceFragment.kt | 18 ++++++++
app/src/main/java/net/taler/cashier/HttpHelper.kt | 33 +++++++++++++++
.../main/java/net/taler/cashier/MainViewModel.kt | 48 +++++++++++-----------
app/src/main/res/layout/fragment_balance.xml | 47 +++++++++++++++++----
app/src/main/res/values/strings.xml | 3 ++
6 files changed, 132 insertions(+), 30 deletions(-)
diff --git a/app/src/main/java/net/taler/cashier/Amount.kt
b/app/src/main/java/net/taler/cashier/Amount.kt
new file mode 100644
index 0000000..c1307e9
--- /dev/null
+++ b/app/src/main/java/net/taler/cashier/Amount.kt
@@ -0,0 +1,13 @@
+package net.taler.cashier
+
+data class Amount(val currency: String, val amount: String) {
+
+ companion object {
+
+ fun fromString(strAmount: String): Amount {
+ val components = strAmount.split(":")
+ return Amount(components[0], components[1])
+ }
+ }
+
+}
diff --git a/app/src/main/java/net/taler/cashier/BalanceFragment.kt
b/app/src/main/java/net/taler/cashier/BalanceFragment.kt
index 1f01ac9..6c5b454 100644
--- a/app/src/main/java/net/taler/cashier/BalanceFragment.kt
+++ b/app/src/main/java/net/taler/cashier/BalanceFragment.kt
@@ -3,11 +3,19 @@ package net.taler.cashier
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
+import android.view.View.INVISIBLE
import android.view.ViewGroup
import androidx.fragment.app.Fragment
+import androidx.fragment.app.activityViewModels
+import androidx.lifecycle.Observer
+import com.google.android.material.snackbar.Snackbar
+import com.google.android.material.snackbar.Snackbar.LENGTH_LONG
+import kotlinx.android.synthetic.main.fragment_balance.*
class BalanceFragment : Fragment() {
+ private val viewModel: MainViewModel by activityViewModels()
+
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
@@ -15,4 +23,14 @@ class BalanceFragment : Fragment() {
return inflater.inflate(R.layout.fragment_balance, container, false)
}
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ viewModel.balance.observe(viewLifecycleOwner, Observer { balance ->
+ balanceView.text = balance
+ progressBar.visibility = INVISIBLE
+ })
+ fab.setOnClickListener {
+ Snackbar.make(fab, "Withdrawals are not yet implemented!",
LENGTH_LONG).show()
+ }
+ }
+
}
diff --git a/app/src/main/java/net/taler/cashier/HttpHelper.kt
b/app/src/main/java/net/taler/cashier/HttpHelper.kt
new file mode 100644
index 0000000..3eb589d
--- /dev/null
+++ b/app/src/main/java/net/taler/cashier/HttpHelper.kt
@@ -0,0 +1,33 @@
+package net.taler.cashier
+
+import androidx.annotation.WorkerThread
+import okhttp3.Credentials
+import okhttp3.OkHttpClient
+import okhttp3.Request
+import okhttp3.Response
+
+object HttpHelper {
+
+ @WorkerThread
+ fun makeJsonGetRequest(url: String, config: Config): Response {
+ val request = Request.Builder()
+ .addHeader("Accept", "application/json")
+ .url(url)
+ .get()
+ .build()
+ return getHttpClient(config.username, config.password)
+ .newCall(request)
+ .execute()
+ }
+
+ private fun getHttpClient(username: String, password: String) =
+ OkHttpClient.Builder().authenticator { _, response ->
+ val credential = Credentials.basic(username, password)
+ response
+ .request()
+ .newBuilder()
+ .header("Authorization", credential)
+ .build()
+ }.build()
+
+}
diff --git a/app/src/main/java/net/taler/cashier/MainViewModel.kt
b/app/src/main/java/net/taler/cashier/MainViewModel.kt
index f972fe6..da4a164 100644
--- a/app/src/main/java/net/taler/cashier/MainViewModel.kt
+++ b/app/src/main/java/net/taler/cashier/MainViewModel.kt
@@ -6,15 +6,11 @@ import android.content.Context.MODE_PRIVATE
import android.util.Log
import androidx.annotation.UiThread
import androidx.annotation.WorkerThread
-import androidx.lifecycle.AndroidViewModel
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.viewModelScope
+import androidx.lifecycle.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
-import okhttp3.Credentials
-import okhttp3.OkHttpClient
-import okhttp3.Request
+import net.taler.cashier.HttpHelper.makeJsonGetRequest
+import org.json.JSONObject
private val TAG = MainViewModel::class.java.simpleName
@@ -52,14 +48,8 @@ class MainViewModel(app: Application) :
AndroidViewModel(app) {
// TODO use to-be-done final URL
val url = "${config.bankUrl}/history?delta=50&direction=both"
Log.d(TAG, "Checking config: $url")
- val request = Request.Builder()
- .addHeader("Accept", "application/json")
- .url(url)
- .get()
- .build()
-
val response = try {
- getHttpClient(config.username,
config.password).newCall(request).execute()
+ makeJsonGetRequest(url, config)
} catch (e: Exception) {
Log.e(TAG, "Error fetching $url", e)
mConfigResult.postValue(ConfigResult(false))
@@ -88,15 +78,27 @@ class MainViewModel(app: Application) :
AndroidViewModel(app) {
.commit()
}
- private fun getHttpClient(username: String, password: String) =
- OkHttpClient.Builder().authenticator { _, response ->
- val credential = Credentials.basic(username, password)
- response
- .request()
- .newBuilder()
- .header("Authorization", credential)
- .build()
- }.build()
+ val balance = liveData(Dispatchers.IO) {
+ val url = "${config.bankUrl}/history?delta=50&direction=both"
+ val response = try {
+ makeJsonGetRequest(url, config)
+ } catch (e: Exception) {
+ Log.e(TAG, "Error fetching $url", e)
+ emit(app.getString(R.string.balance_error))
+ return@liveData
+ }
+ val result = if (response.code() == 200 && response.body() != null) {
+ // TODO get real amount here once API is available
+ val json = JSONObject(response.body()!!.string())
+ val amountStr =
json.getJSONArray("data").getJSONObject(0).getString("amount")
+ val amount = Amount.fromString(amountStr)
+ "${amount.amount} ${amount.currency}"
+ } else {
+ Log.e(TAG, "Error fetching $url - Response: ${response.code()}")
+ app.getString(R.string.balance_error)
+ }
+ emit(result)
+ }
}
diff --git a/app/src/main/res/layout/fragment_balance.xml
b/app/src/main/res/layout/fragment_balance.xml
index e9f5670..348deb6 100644
--- a/app/src/main/res/layout/fragment_balance.xml
+++ b/app/src/main/res/layout/fragment_balance.xml
@@ -1,16 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout 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"
android:layout_height="match_parent"
tools:context=".BalanceFragment">
- <!-- TODO: Update blank fragment layout -->
- <TextView
+ <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:text="TEST" />
+ android:layout_height="match_parent">
+
+ <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_toTopOf="parent" />
+
+ <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" />
+
+ </androidx.constraintlayout.widget.ConstraintLayout>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
@@ -19,6 +51,7 @@
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/default_margin"
android:tint="@color/design_default_color_surface"
- app:srcCompat="@drawable/ic_withdraw" />
+ app:srcCompat="@drawable/ic_withdraw"
+ app:useCompatPadding="true" />
-</FrameLayout>
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/app/src/main/res/values/strings.xml
b/app/src/main/res/values/strings.xml
index 456eed1..ebfc0ff 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -9,4 +9,7 @@
<string name="config_username_error">Please enter your username</string>
<string name="config_error">Error retrieving configuration</string>
+ <string name="balance_current_label">Current Balance:</string>
+ <string name="balance_error">ERROR</string>
+
</resources>
--
To stop receiving notification emails like this one, please contact
address@hidden.