gnunet-svn
[Top][All Lists]
Advanced

[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.



reply via email to

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