gnunet-svn
[Top][All Lists]
Advanced

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

[taler-taler-android] 01/04: [wallet] show list of known exchanges in se


From: gnunet
Subject: [taler-taler-android] 01/04: [wallet] show list of known exchanges in settings
Date: Fri, 17 Jul 2020 21:55:38 +0200

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

torsten-grote pushed a commit to branch master
in repository taler-android.

commit 1c8da5aea284a0299840721afc86dae75b16ba78
Author: Torsten Grote <t@grobox.de>
AuthorDate: Fri Jul 17 13:30:48 2020 -0300

    [wallet] show list of known exchanges in settings
---
 .idea/dictionaries/user.xml                        |  1 +
 build.gradle                                       |  4 +-
 wallet/build.gradle                                |  4 +-
 .../src/main/java/net/taler/wallet/MainActivity.kt |  1 +
 .../main/java/net/taler/wallet/MainViewModel.kt    |  2 +
 .../net/taler/wallet/exchanges/ExchangeAdapter.kt  | 66 +++++++++++++++++++++
 .../taler/wallet/exchanges/ExchangeListFragment.kt | 68 ++++++++++++++++++++++
 .../net/taler/wallet/exchanges/ExchangeManager.kt  | 65 +++++++++++++++++++++
 .../wallet/transactions/TransactionManager.kt      |  4 +-
 .../src/main/res/layout/fragment_exchange_list.xml | 52 +++++++++++++++++
 wallet/src/main/res/layout/list_item_exchange.xml  | 50 ++++++++++++++++
 wallet/src/main/res/navigation/nav_graph.xml       |  8 +++
 wallet/src/main/res/values/strings.xml             |  6 ++
 wallet/src/main/res/xml/settings_main.xml          |  7 +++
 14 files changed, 333 insertions(+), 5 deletions(-)

diff --git a/.idea/dictionaries/user.xml b/.idea/dictionaries/user.xml
index 1bcab63..0028bad 100644
--- a/.idea/dictionaries/user.xml
+++ b/.idea/dictionaries/user.xml
@@ -7,6 +7,7 @@
       <w>anastasis</w>
       <w>apdu</w>
       <w>markwon</w>
+      <w>payto</w>
       <w>servicedesc</w>
       <w>snackbar</w>
       <w>ssid</w>
diff --git a/build.gradle b/build.gradle
index 4f08021..3067d22 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,6 +1,6 @@
 buildscript {
     ext.kotlin_version = '1.3.72'
-    ext.nav_version = "2.2.2"
+    ext.nav_version = "2.3.0"
     ext.lifecycle_version = "2.2.0"
     // check https://android-rebuilds.beuc.net/ for availability of free build 
tools
     ext.build_tools_version = "29.0.2"
@@ -9,7 +9,7 @@ buildscript {
         jcenter()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:4.0.0'
+        classpath 'com.android.tools.build:gradle:4.0.1'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
         classpath 
"androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
     }
diff --git a/wallet/build.gradle b/wallet/build.gradle
index 192b454..aa5fbad 100644
--- a/wallet/build.gradle
+++ b/wallet/build.gradle
@@ -23,7 +23,7 @@ plugins {
     id "de.undercouch.download"
 }
 
-def walletCoreVersion = "v0.7.1-dev.6"
+def walletCoreVersion = "v0.7.1-dev.9"
 
 android {
     compileSdkVersion 29
@@ -35,7 +35,7 @@ android {
         minSdkVersion 24
         targetSdkVersion 29
         versionCode 6
-        versionName "0.7.1.dev.6"
+        versionName "0.7.1.dev.9"
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         buildConfigField "String", "WALLET_CORE_VERSION", 
"\"$walletCoreVersion\""
     }
diff --git a/wallet/src/main/java/net/taler/wallet/MainActivity.kt 
b/wallet/src/main/java/net/taler/wallet/MainActivity.kt
index 786e40e..a048446 100644
--- a/wallet/src/main/java/net/taler/wallet/MainActivity.kt
+++ b/wallet/src/main/java/net/taler/wallet/MainActivity.kt
@@ -222,6 +222,7 @@ class MainActivity : AppCompatActivity(), 
OnNavigationItemSelectedListener,
     ): Boolean {
         when (pref.key) {
             "pref_backup" -> 
nav.navigate(R.id.action_nav_settings_to_nav_settings_backup)
+            "pref_exchanges" -> 
nav.navigate(R.id.action_nav_settings_to_nav_settings_exchanges)
         }
         return true
     }
diff --git a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt 
b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
index c69c31c..46f5021 100644
--- a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
+++ b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
@@ -33,6 +33,7 @@ import net.taler.common.assertUiThread
 import net.taler.common.toEvent
 import net.taler.wallet.backend.WalletBackendApi
 import net.taler.wallet.balances.BalanceItem
+import net.taler.wallet.exchanges.ExchangeManager
 import net.taler.wallet.history.DevHistoryManager
 import net.taler.wallet.payment.PaymentManager
 import net.taler.wallet.pending.PendingOperationsManager
@@ -102,6 +103,7 @@ class MainViewModel(val app: Application) : 
AndroidViewModel(app) {
     val transactionManager: TransactionManager =
         TransactionManager(walletBackendApi, viewModelScope, mapper)
     val refundManager = RefundManager(walletBackendApi)
+    val exchangeManager: ExchangeManager = ExchangeManager(walletBackendApi, 
mapper)
 
     private val mTransactionsEvent = MutableLiveData<Event<String>>()
     val transactionsEvent: LiveData<Event<String>> = mTransactionsEvent
diff --git a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeAdapter.kt 
b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeAdapter.kt
new file mode 100644
index 0000000..f53ce46
--- /dev/null
+++ b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeAdapter.kt
@@ -0,0 +1,66 @@
+/*
+ * 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/>
+ */
+
+package net.taler.wallet.exchanges
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import net.taler.wallet.R
+import net.taler.wallet.cleanExchange
+import net.taler.wallet.exchanges.ExchangeAdapter.ExchangeItemViewHolder
+
+data class ExchangeItem(
+    val exchangeBaseUrl: String,
+    val currency: String,
+    val paytoUris: List<String>
+)
+
+internal class ExchangeAdapter : 
RecyclerView.Adapter<ExchangeItemViewHolder>() {
+
+    private val items = ArrayList<ExchangeItem>()
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): 
ExchangeItemViewHolder {
+        val view = LayoutInflater.from(parent.context)
+            .inflate(R.layout.list_item_exchange, parent, false)
+        return ExchangeItemViewHolder(view)
+    }
+
+    override fun getItemCount() = items.size
+
+    override fun onBindViewHolder(holder: ExchangeItemViewHolder, position: 
Int) {
+        holder.bind(items[position])
+    }
+
+    fun update(newItems: List<ExchangeItem>) {
+        items.clear()
+        items.addAll(newItems)
+        notifyDataSetChanged()
+    }
+
+    internal inner class ExchangeItemViewHolder(v: View) : 
RecyclerView.ViewHolder(v) {
+        private val context = v.context
+        private val urlView: TextView = v.findViewById(R.id.urlView)
+        private val currencyView: TextView = v.findViewById(R.id.currencyView)
+        fun bind(item: ExchangeItem) {
+            urlView.text = cleanExchange(item.exchangeBaseUrl)
+            currencyView.text = 
context.getString(R.string.exchange_list_currency, item.currency)
+        }
+    }
+
+}
diff --git 
a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListFragment.kt 
b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListFragment.kt
new file mode 100644
index 0000000..9d0c493
--- /dev/null
+++ b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListFragment.kt
@@ -0,0 +1,68 @@
+/*
+ * 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/>
+ */
+
+package net.taler.wallet.exchanges
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.activityViewModels
+import androidx.lifecycle.Observer
+import androidx.recyclerview.widget.DividerItemDecoration
+import androidx.recyclerview.widget.LinearLayoutManager
+import kotlinx.android.synthetic.main.fragment_exchange_list.*
+import net.taler.common.fadeIn
+import net.taler.common.fadeOut
+import net.taler.wallet.MainViewModel
+import net.taler.wallet.R
+
+class ExchangeListFragment : Fragment() {
+
+    private val model: MainViewModel by activityViewModels()
+    private val exchangeManager by lazy { model.exchangeManager }
+    private val exchangeAdapter by lazy { ExchangeAdapter() }
+
+    override fun onCreateView(
+        inflater: LayoutInflater, container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        return inflater.inflate(R.layout.fragment_exchange_list, container, 
false)
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        list.apply {
+            adapter = exchangeAdapter
+            addItemDecoration(DividerItemDecoration(context, 
LinearLayoutManager.VERTICAL))
+        }
+
+        exchangeManager.progress.observe(viewLifecycleOwner, Observer { show ->
+            if (show) progressBar.fadeIn() else progressBar.fadeOut()
+        })
+        exchangeManager.exchanges.observe(viewLifecycleOwner, Observer { 
exchanges ->
+            exchangeAdapter.update(exchanges)
+            if (exchanges.isEmpty()) {
+                emptyState.fadeIn()
+                list.fadeOut()
+            } else {
+                emptyState.fadeOut()
+                list.fadeIn()
+            }
+        })
+    }
+
+}
diff --git a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeManager.kt 
b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeManager.kt
new file mode 100644
index 0000000..fe8ac76
--- /dev/null
+++ b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeManager.kt
@@ -0,0 +1,65 @@
+/*
+ * 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/>
+ */
+
+package net.taler.wallet.exchanges
+
+import android.util.Log
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.fasterxml.jackson.module.kotlin.readValue
+import net.taler.wallet.TAG
+import net.taler.wallet.backend.WalletBackendApi
+import org.json.JSONObject
+
+class ExchangeManager(
+    private val walletBackendApi: WalletBackendApi,
+    private val mapper: ObjectMapper
+) {
+
+    private val mProgress = MutableLiveData<Boolean>()
+    val progress: LiveData<Boolean> = mProgress
+
+    private val mExchanges = MutableLiveData<List<ExchangeItem>>()
+    val exchanges: LiveData<List<ExchangeItem>> get() = list()
+
+    fun add(exchangeUrl: String) {
+        val args = JSONObject().apply { put("exchangeBaseUrl", exchangeUrl) }
+        walletBackendApi.sendRequest("addExchange", args) { isError, result ->
+            if (isError) {
+                Log.e(TAG, "add Error: $result")
+            } else {
+                Log.e(TAG, "add Success: $result")
+            }
+        }
+    }
+
+    private fun list(): LiveData<List<ExchangeItem>> {
+        mProgress.value = true
+        walletBackendApi.sendRequest("listExchanges", JSONObject()) { isError, 
result ->
+            if (isError) {
+                throw AssertionError("Wallet core failed to return exchanges!")
+            } else {
+                val exchanges: List<ExchangeItem> = 
mapper.readValue(result.getString("exchanges"))
+                Log.e(TAG, "list Success: $exchanges")
+                mProgress.value = false
+                mExchanges.value = exchanges
+            }
+        }
+        return mExchanges
+    }
+
+}
diff --git 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt
index 882b29b..d8204b6 100644
--- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt
+++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt
@@ -28,7 +28,8 @@ import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
 import net.taler.wallet.backend.WalletBackendApi
 import org.json.JSONObject
-import java.util.*
+import java.util.HashMap
+import java.util.LinkedList
 
 sealed class TransactionsResult {
     object Error : TransactionsResult()
@@ -72,6 +73,7 @@ class TransactionManager(
         walletBackendApi.sendRequest("getTransactions", request) { isError, 
result ->
             if (isError) {
                 liveData.postValue(TransactionsResult.Error)
+                mProgress.postValue(false)
             } else {
                 val currencyToUpdate = if (searchQuery == null) currency else 
null
                 scope.launch(Dispatchers.Default) {
diff --git a/wallet/src/main/res/layout/fragment_exchange_list.xml 
b/wallet/src/main/res/layout/fragment_exchange_list.xml
new file mode 100644
index 0000000..e08901e
--- /dev/null
+++ b/wallet/src/main/res/layout/fragment_exchange_list.xml
@@ -0,0 +1,52 @@
+<?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/>
+  -->
+
+<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">
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scrollbars="vertical"
+        android:visibility="invisible"
+        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+        tools:listitem="@layout/list_item_history"
+        tools:visibility="visible" />
+
+    <TextView
+        android:id="@+id/emptyState"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:gravity="center"
+        android:text="@string/exchange_list_empty"
+        android:visibility="invisible"
+        tools:visibility="visible" />
+
+    <ProgressBar
+        android:id="@+id/progressBar"
+        style="?android:progressBarStyleLarge"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:visibility="invisible"
+        tools:visibility="visible" />
+
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/wallet/src/main/res/layout/list_item_exchange.xml 
b/wallet/src/main/res/layout/list_item_exchange.xml
new file mode 100644
index 0000000..4c646fe
--- /dev/null
+++ b/wallet/src/main/res/layout/list_item_exchange.xml
@@ -0,0 +1,50 @@
+<?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/>
+  -->
+
+<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="wrap_content"
+    android:background="@drawable/selectable_background"
+    android:foreground="?attr/selectableItemBackground"
+    android:padding="16dp">
+
+    <TextView
+        android:id="@+id/urlView"
+        style="@style/TransactionTitle"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="8dp"
+        android:textSize="18sp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="exchange.test.taler.net" />
+
+    <TextView
+        android:id="@+id/currencyView"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="8dp"
+        android:layout_marginEnd="8dp"
+        android:textSize="14sp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="@+id/urlView"
+        app:layout_constraintTop_toBottomOf="@+id/urlView"
+        tools:text="@string/exchange_list_currency" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/wallet/src/main/res/navigation/nav_graph.xml 
b/wallet/src/main/res/navigation/nav_graph.xml
index 51dcaba..7019597 100644
--- a/wallet/src/main/res/navigation/nav_graph.xml
+++ b/wallet/src/main/res/navigation/nav_graph.xml
@@ -58,11 +58,19 @@
         android:id="@+id/nav_settings"
         android:name="net.taler.wallet.settings.SettingsFragment"
         android:label="@string/menu_settings">
+        <action
+            android:id="@+id/action_nav_settings_to_nav_settings_exchanges"
+            app:destination="@id/nav_settings_exchanges" />
         <action
             android:id="@+id/action_nav_settings_to_nav_settings_backup"
             app:destination="@id/nav_settings_backup" />
     </fragment>
 
+    <fragment
+        android:id="@+id/nav_settings_exchanges"
+        android:name="net.taler.wallet.exchanges.ExchangeListFragment"
+        android:label="@string/exchange_list_title"/>
+
     <fragment
         android:id="@+id/nav_settings_backup"
         android:name="net.taler.wallet.settings.BackupSettingsFragment"
diff --git a/wallet/src/main/res/values/strings.xml 
b/wallet/src/main/res/values/strings.xml
index fec5948..79a3630 100644
--- a/wallet/src/main/res/values/strings.xml
+++ b/wallet/src/main/res/values/strings.xml
@@ -112,6 +112,12 @@ GNU Taler is immune against many types of fraud, such as 
phishing of credit card
     <string name="withdraw_error_title">Withdrawal Error</string>
     <string name="withdraw_error_message">Withdrawing is currently not 
possible. Please try again later!</string>
 
+    <string name="exchange_settings_title">Exchanges</string>
+    <string name="exchange_settings_summary">Manage list of exchanges known to 
this wallet</string>
+    <string name="exchange_list_title">Exchanges</string>
+    <string name="exchange_list_empty">No exchanges known\n\nAdd one manually 
or withdraw digital cash!</string>
+    <string name="exchange_list_currency">Currency: %s</string>
+
     <string name="exchange_fee_withdrawal_fee_label">Withdrawal Fee:</string>
     <string name="exchange_fee_overhead_label">Rounding Loss:</string>
     <string name="exchange_fee_coin_expiration_label">Earliest Coin 
Expiry:</string>
diff --git a/wallet/src/main/res/xml/settings_main.xml 
b/wallet/src/main/res/xml/settings_main.xml
index 4defc08..4c2f149 100644
--- a/wallet/src/main/res/xml/settings_main.xml
+++ b/wallet/src/main/res/xml/settings_main.xml
@@ -17,6 +17,13 @@
 <PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto";
     xmlns:tools="http://schemas.android.com/tools";>
 
+    <Preference
+        app:fragment="net.taler.wallet.exchanges.ExchangeListFragment"
+        app:icon="@drawable/ic_account_balance"
+        app:key="pref_exchanges"
+        app:summary="@string/exchange_settings_summary"
+        app:title="@string/exchange_settings_title" />
+
     <Preference
         app:fragment="net.taler.wallet.settings.BackupSettingsFragment"
         app:icon="@drawable/ic_baseline_backup"

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

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