From aa4472c62acd909cea65dd26102b5d7188c7aacd Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Fri, 17 Jul 2020 14:46:09 -0300 Subject: [wallet] Allow to add an exchange manually by providing its base URL --- .../wallet/exchanges/AddExchangeDialogFragment.kt | 49 ++++++++++++++++++++++ .../taler/wallet/exchanges/ExchangeListFragment.kt | 33 +++++++++++---- .../net/taler/wallet/exchanges/ExchangeManager.kt | 15 +++++-- .../net/taler/wallet/settings/SettingsFragment.kt | 2 +- 4 files changed, 87 insertions(+), 12 deletions(-) create mode 100644 wallet/src/main/java/net/taler/wallet/exchanges/AddExchangeDialogFragment.kt (limited to 'wallet/src/main/java/net') diff --git a/wallet/src/main/java/net/taler/wallet/exchanges/AddExchangeDialogFragment.kt b/wallet/src/main/java/net/taler/wallet/exchanges/AddExchangeDialogFragment.kt new file mode 100644 index 0000000..5ea763a --- /dev/null +++ b/wallet/src/main/java/net/taler/wallet/exchanges/AddExchangeDialogFragment.kt @@ -0,0 +1,49 @@ +/* + * 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 + */ + +package net.taler.wallet.exchanges + +import android.app.Dialog +import android.os.Bundle +import android.widget.TextView +import androidx.appcompat.app.AlertDialog +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.activityViewModels +import net.taler.wallet.MainViewModel +import net.taler.wallet.R + + +class AddExchangeDialogFragment : DialogFragment() { + + private val model: MainViewModel by activityViewModels() + private val exchangeManager by lazy { model.exchangeManager } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + return AlertDialog.Builder(requireContext(), R.style.DialogTheme) + .setIcon(R.drawable.ic_account_balance) + .setTitle(R.string.exchange_list_add) + .setView(R.layout.dialog_exchange_add) + .setPositiveButton(R.string.ok) { dialog, _ -> + val urlView: TextView = (dialog as AlertDialog).findViewById(R.id.urlView)!! + exchangeManager.add(urlView.text.toString()) + } + .setNegativeButton(R.string.cancel) { _, _ -> + dismiss() + } + .create() + } + +} diff --git a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListFragment.kt b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListFragment.kt index 9d0c493..c844042 100644 --- a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListFragment.kt @@ -20,12 +20,15 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Toast +import android.widget.Toast.LENGTH_LONG 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.EventObserver import net.taler.common.fadeIn import net.taler.common.fadeOut import net.taler.wallet.MainViewModel @@ -49,20 +52,34 @@ class ExchangeListFragment : Fragment() { adapter = exchangeAdapter addItemDecoration(DividerItemDecoration(context, LinearLayoutManager.VERTICAL)) } + addExchangeFab.setOnClickListener { + AddExchangeDialogFragment().show(parentFragmentManager, "ADD_EXCHANGE") + } 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() - } + onExchangeUpdate(exchanges) + }) + exchangeManager.addError.observe(viewLifecycleOwner, EventObserver { error -> + if (error) onAddExchangeFailed() }) } + private fun onExchangeUpdate(exchanges: List) { + exchangeAdapter.update(exchanges) + if (exchanges.isEmpty()) { + emptyState.fadeIn() + list.fadeOut() + } else { + emptyState.fadeOut() + list.fadeIn() + } + } + + private fun onAddExchangeFailed() { + Toast.makeText(requireContext(), R.string.exchange_add_error, LENGTH_LONG).show() + } + } diff --git a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeManager.kt b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeManager.kt index fe8ac76..4b93c40 100644 --- a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeManager.kt +++ b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeManager.kt @@ -21,6 +21,8 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.kotlin.readValue +import net.taler.common.Event +import net.taler.common.toEvent import net.taler.wallet.TAG import net.taler.wallet.backend.WalletBackendApi import org.json.JSONObject @@ -36,13 +38,20 @@ class ExchangeManager( private val mExchanges = MutableLiveData>() val exchanges: LiveData> get() = list() + private val mAddError = MutableLiveData>() + val addError: LiveData> = mAddError + fun add(exchangeUrl: String) { + mProgress.value = true val args = JSONObject().apply { put("exchangeBaseUrl", exchangeUrl) } walletBackendApi.sendRequest("addExchange", args) { isError, result -> + mProgress.value = false if (isError) { - Log.e(TAG, "add Error: $result") + Log.e(TAG, "$result") + mAddError.value = true.toEvent() } else { - Log.e(TAG, "add Success: $result") + Log.d(TAG, "Exchange $exchangeUrl added") + list() } } } @@ -54,7 +63,7 @@ class ExchangeManager( throw AssertionError("Wallet core failed to return exchanges!") } else { val exchanges: List = mapper.readValue(result.getString("exchanges")) - Log.e(TAG, "list Success: $exchanges") + Log.d(TAG, "Exchange list: $exchanges") mProgress.value = false mExchanges.value = exchanges } diff --git a/wallet/src/main/java/net/taler/wallet/settings/SettingsFragment.kt b/wallet/src/main/java/net/taler/wallet/settings/SettingsFragment.kt index 31295d6..d9b1def 100644 --- a/wallet/src/main/java/net/taler/wallet/settings/SettingsFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/settings/SettingsFragment.kt @@ -110,7 +110,7 @@ class SettingsFragment : PreferenceFragmentCompat() { } private fun showResetDialog() { - AlertDialog.Builder(requireContext()) + AlertDialog.Builder(requireContext(), R.style.DialogTheme) .setMessage("Do you really want to reset the wallet and lose all coins and purchases?") .setPositiveButton("Reset") { _, _ -> model.dangerouslyReset() -- cgit v1.2.3