diff options
Diffstat (limited to 'wallet/src/main/java/net/taler')
4 files changed, 127 insertions, 16 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeAdapter.kt b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeAdapter.kt index f53ce46..189f444 100644 --- a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeAdapter.kt +++ b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeAdapter.kt @@ -19,8 +19,11 @@ package net.taler.wallet.exchanges import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ImageButton import android.widget.TextView +import androidx.appcompat.widget.PopupMenu import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView.Adapter import net.taler.wallet.R import net.taler.wallet.cleanExchange import net.taler.wallet.exchanges.ExchangeAdapter.ExchangeItemViewHolder @@ -29,9 +32,16 @@ data class ExchangeItem( val exchangeBaseUrl: String, val currency: String, val paytoUris: List<String> -) +) { + val name: String get() = cleanExchange(exchangeBaseUrl) +} + +interface ExchangeClickListener { + fun onManualWithdraw(item: ExchangeItem) +} -internal class ExchangeAdapter : RecyclerView.Adapter<ExchangeItemViewHolder>() { +internal class ExchangeAdapter(private val listener: ExchangeClickListener) : + Adapter<ExchangeItemViewHolder>() { private val items = ArrayList<ExchangeItem>() @@ -57,9 +67,26 @@ internal class ExchangeAdapter : RecyclerView.Adapter<ExchangeItemViewHolder>() private val context = v.context private val urlView: TextView = v.findViewById(R.id.urlView) private val currencyView: TextView = v.findViewById(R.id.currencyView) + private val overflowIcon: ImageButton = v.findViewById(R.id.overflowIcon) + fun bind(item: ExchangeItem) { - urlView.text = cleanExchange(item.exchangeBaseUrl) + urlView.text = item.name currencyView.text = context.getString(R.string.exchange_list_currency, item.currency) + overflowIcon.setOnClickListener { openMenu(overflowIcon, item) } + } + + private fun openMenu(anchor: View, item: ExchangeItem) = PopupMenu(context, anchor).apply { + inflate(R.menu.exchange) + setOnMenuItemClickListener { menuItem -> + when (menuItem.itemId) { + R.id.action_manual_withdrawal -> { + listener.onManualWithdraw(item) + true + } + else -> false + } + } + show() } } 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 c844042..c7da205 100644 --- a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListFragment.kt @@ -25,8 +25,9 @@ import android.widget.Toast.LENGTH_LONG import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.lifecycle.Observer +import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager.VERTICAL import kotlinx.android.synthetic.main.fragment_exchange_list.* import net.taler.common.EventObserver import net.taler.common.fadeIn @@ -34,11 +35,11 @@ import net.taler.common.fadeOut import net.taler.wallet.MainViewModel import net.taler.wallet.R -class ExchangeListFragment : Fragment() { +class ExchangeListFragment : Fragment(), ExchangeClickListener { private val model: MainViewModel by activityViewModels() private val exchangeManager by lazy { model.exchangeManager } - private val exchangeAdapter by lazy { ExchangeAdapter() } + private val exchangeAdapter by lazy { ExchangeAdapter(this) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -50,7 +51,7 @@ class ExchangeListFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { list.apply { adapter = exchangeAdapter - addItemDecoration(DividerItemDecoration(context, LinearLayoutManager.VERTICAL)) + addItemDecoration(DividerItemDecoration(context, VERTICAL)) } addExchangeFab.setOnClickListener { AddExchangeDialogFragment().show(parentFragmentManager, "ADD_EXCHANGE") @@ -82,4 +83,9 @@ class ExchangeListFragment : Fragment() { Toast.makeText(requireContext(), R.string.exchange_add_error, LENGTH_LONG).show() } + override fun onManualWithdraw(item: ExchangeItem) { + exchangeManager.withdrawalExchange = item + findNavController().navigate(R.id.action_nav_settings_exchanges_to_nav_exchange_manual_withdrawal) + } + } 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 4b93c40..cdd5590 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,7 @@ 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.Amount import net.taler.common.Event import net.taler.common.toEvent import net.taler.wallet.TAG @@ -41,6 +42,23 @@ class ExchangeManager( private val mAddError = MutableLiveData<Event<Boolean>>() val addError: LiveData<Event<Boolean>> = mAddError + var withdrawalExchange: ExchangeItem? = null + + 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.d(TAG, "Exchange list: $exchanges") + mProgress.value = false + mExchanges.value = exchanges + } + } + return mExchanges + } + fun add(exchangeUrl: String) { mProgress.value = true val args = JSONObject().apply { put("exchangeBaseUrl", exchangeUrl) } @@ -56,19 +74,18 @@ class ExchangeManager( } } - private fun list(): LiveData<List<ExchangeItem>> { - mProgress.value = true - walletBackendApi.sendRequest("listExchanges", JSONObject()) { isError, result -> + fun getWithdrawalDetails(exchangeItem: ExchangeItem, amount: Amount) { + val args = JSONObject().apply { + put("exchangeBaseUrl", exchangeItem.exchangeBaseUrl) + put("amount", amount.toJSONString()) + } + walletBackendApi.sendRequest("getWithdrawalDetailsForAmount", args) { isError, result -> if (isError) { - throw AssertionError("Wallet core failed to return exchanges!") + Log.e(TAG, "$result") } else { - val exchanges: List<ExchangeItem> = mapper.readValue(result.getString("exchanges")) - Log.d(TAG, "Exchange list: $exchanges") - mProgress.value = false - mExchanges.value = exchanges + Log.e(TAG, "$result") } } - return mExchanges } } diff --git a/wallet/src/main/java/net/taler/wallet/exchanges/ManualWithdrawFragment.kt b/wallet/src/main/java/net/taler/wallet/exchanges/ManualWithdrawFragment.kt new file mode 100644 index 0000000..c3f201d --- /dev/null +++ b/wallet/src/main/java/net/taler/wallet/exchanges/ManualWithdrawFragment.kt @@ -0,0 +1,61 @@ +/* + * 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 android.widget.Toast +import android.widget.Toast.LENGTH_SHORT +import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels +import kotlinx.android.synthetic.main.fragment_manual_withdraw.* +import net.taler.common.Amount +import net.taler.common.hideKeyboard +import net.taler.wallet.MainViewModel +import net.taler.wallet.R +import net.taler.wallet.scanQrCode + +class ManualWithdrawFragment : Fragment() { + + private val model: MainViewModel by activityViewModels() + private val exchangeManager by lazy { model.exchangeManager } + private val exchangeItem by lazy { requireNotNull(exchangeManager.withdrawalExchange) } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.fragment_manual_withdraw, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + qrCodeButton.setOnClickListener { scanQrCode(requireActivity()) } + currencyView.text = exchangeItem.currency + paymentOptionsLabel.text = + getString(R.string.withdraw_manual_payment_options, exchangeItem.name) + checkFeesButton.setOnClickListener { + val value = amountView.text.toString().toLong() + val amount = Amount(exchangeItem.currency, value, 0) + amountView.hideKeyboard() + Toast.makeText(view.context, "Not implemented: $amount", LENGTH_SHORT).show() + exchangeManager.getWithdrawalDetails(exchangeItem, amount) + } + } + +} |