summaryrefslogtreecommitdiff
path: root/wallet/src/main/java
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 /wallet/src/main/java
parent9400d765f07f57adb775518c5b66d8001893a7c4 (diff)
downloadtaler-android-1c8da5aea284a0299840721afc86dae75b16ba78.tar.gz
taler-android-1c8da5aea284a0299840721afc86dae75b16ba78.tar.bz2
taler-android-1c8da5aea284a0299840721afc86dae75b16ba78.zip
[wallet] show list of known exchanges in settings
Diffstat (limited to 'wallet/src/main/java')
-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
6 files changed, 205 insertions, 1 deletions
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) {