summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorsten Grote <t@grobox.de>2020-07-17 13:30:48 -0300
committerTorsten Grote <t@grobox.de>2020-07-17 13:30:48 -0300
commit1c8da5aea284a0299840721afc86dae75b16ba78 (patch)
tree1072ff33cf405e81b8c1730167f5e345946275fb
parent9400d765f07f57adb775518c5b66d8001893a7c4 (diff)
downloadtaler-android-1c8da5aea284a0299840721afc86dae75b16ba78.tar.gz
taler-android-1c8da5aea284a0299840721afc86dae75b16ba78.tar.bz2
taler-android-1c8da5aea284a0299840721afc86dae75b16ba78.zip
[wallet] show list of known exchanges in settings
-rw-r--r--.idea/dictionaries/user.xml1
-rw-r--r--build.gradle4
-rw-r--r--wallet/build.gradle4
-rw-r--r--wallet/src/main/java/net/taler/wallet/MainActivity.kt1
-rw-r--r--wallet/src/main/java/net/taler/wallet/MainViewModel.kt2
-rw-r--r--wallet/src/main/java/net/taler/wallet/exchanges/ExchangeAdapter.kt66
-rw-r--r--wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListFragment.kt68
-rw-r--r--wallet/src/main/java/net/taler/wallet/exchanges/ExchangeManager.kt65
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt4
-rw-r--r--wallet/src/main/res/layout/fragment_exchange_list.xml52
-rw-r--r--wallet/src/main/res/layout/list_item_exchange.xml50
-rw-r--r--wallet/src/main/res/navigation/nav_graph.xml8
-rw-r--r--wallet/src/main/res/values/strings.xml6
-rw-r--r--wallet/src/main/res/xml/settings_main.xml7
14 files changed, 333 insertions, 5 deletions
diff --git a/.idea/dictionaries/user.xml b/.idea/dictionaries/user.xml
index 1bcab636..0028bad2 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 4f08021b..3067d221 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 192b4543..aa5fbad3 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 786e40ed..a0484462 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 c69c31c0..46f5021f 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 00000000..f53ce46b
--- /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 00000000..9d0c4936
--- /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 00000000..fe8ac763
--- /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 882b29b3..d8204b63 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 00000000..e08901e3
--- /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 00000000..4c646fee
--- /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 51dcaba4..70195974 100644
--- a/wallet/src/main/res/navigation/nav_graph.xml
+++ b/wallet/src/main/res/navigation/nav_graph.xml
@@ -59,11 +59,19 @@
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"
android:label="@string/nav_settings_backup"/>
diff --git a/wallet/src/main/res/values/strings.xml b/wallet/src/main/res/values/strings.xml
index fec59480..79a36300 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 4defc08b..4c2f149c 100644
--- a/wallet/src/main/res/xml/settings_main.xml
+++ b/wallet/src/main/res/xml/settings_main.xml
@@ -18,6 +18,13 @@
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"
app:isPreferenceVisible="false"