gnunet-svn
[Top][All Lists]
Advanced

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

[taler-taler-android] 01/02: [wallet] Deposit to bitcoin address if curr


From: gnunet
Subject: [taler-taler-android] 01/02: [wallet] Deposit to bitcoin address if currency is BITCOINBTC
Date: Fri, 06 Jan 2023 17:24:07 +0100

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 ab1f17d3877c065120bedcef30044fe51b8145e3
Author: Torsten Grote <t@grobox.de>
AuthorDate: Fri Jan 6 13:17:33 2023 -0300

    [wallet] Deposit to bitcoin address if currency is BITCOINBTC
    
    #0007494
---
 .../net/taler/wallet/accounts/KnownBankAccounts.kt |  20 +-
 .../net/taler/wallet/deposit/DepositFragment.kt    | 201 +--------------------
 .../net/taler/wallet/deposit/DepositManager.kt     |  17 +-
 .../wallet/deposit/MakeBitcoinDepositComposable.kt | 158 ++++++++++++++++
 ...DepositFragment.kt => MakeDepositComposable.kt} |  93 +---------
 wallet/src/main/res/values/strings.xml             |   2 +
 6 files changed, 207 insertions(+), 284 deletions(-)

diff --git 
a/wallet/src/main/java/net/taler/wallet/accounts/KnownBankAccounts.kt 
b/wallet/src/main/java/net/taler/wallet/accounts/KnownBankAccounts.kt
index 35dd45a..de8676c 100644
--- a/wallet/src/main/java/net/taler/wallet/accounts/KnownBankAccounts.kt
+++ b/wallet/src/main/java/net/taler/wallet/accounts/KnownBankAccounts.kt
@@ -90,8 +90,24 @@ class PaytoUriBitcoin(
     @SerialName("segwitAddrs")
     val segwitAddresses: List<String>,
     override val targetPath: String,
-    override val params: Map<String, String>,
+    override val params: Map<String, String> = emptyMap(),
 ) : PaytoUri(
     isKnown = true,
     targetType = "bitcoin",
-)
+) {
+    val paytoUri: String
+        get() = Uri.Builder()
+            .scheme("payto")
+            .authority(targetType)
+            .apply {
+                segwitAddresses.forEach { address ->
+                    appendPath(address)
+                }
+            }
+            .apply {
+                params.forEach { (key, value) ->
+                    appendQueryParameter(key, value)
+                }
+            }
+            .build().toString()
+}
diff --git a/wallet/src/main/java/net/taler/wallet/deposit/DepositFragment.kt 
b/wallet/src/main/java/net/taler/wallet/deposit/DepositFragment.kt
index 5d209ac..c4b302f 100644
--- a/wallet/src/main/java/net/taler/wallet/deposit/DepositFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/deposit/DepositFragment.kt
@@ -20,41 +20,14 @@ import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
-import androidx.compose.animation.AnimatedVisibility
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.rememberScrollState
-import androidx.compose.foundation.verticalScroll
-import androidx.compose.material.Button
-import androidx.compose.material.OutlinedTextField
-import androidx.compose.material.Surface
-import androidx.compose.material.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.saveable.rememberSaveable
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusRequester
-import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.ComposeView
-import androidx.compose.ui.platform.LocalFocusManager
-import androidx.compose.ui.res.colorResource
-import androidx.compose.ui.res.stringResource
-import androidx.compose.ui.tooling.preview.Preview
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.sp
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.activityViewModels
 import androidx.lifecycle.lifecycleScope
 import androidx.navigation.fragment.findNavController
 import net.taler.common.Amount
 import net.taler.common.showError
+import net.taler.wallet.CURRENCY_BTC
 import net.taler.wallet.MainViewModel
 import net.taler.wallet.R
 import net.taler.wallet.compose.TalerSurface
@@ -83,7 +56,14 @@ class DepositFragment : Fragment() {
             setContent {
                 TalerSurface {
                     val state = 
depositManager.depositState.collectAsStateLifecycleAware()
-                    MakeDepositComposable(
+                    if (amount.currency == CURRENCY_BTC) 
MakeBitcoinDepositComposable(
+                        state = state.value,
+                        amount = amount,
+                        bitcoinAddress = null,
+                        onMakeDeposit = { amount, bitcoinAddress ->
+                            depositManager.onDepositButtonClicked(amount, 
bitcoinAddress)
+                        },
+                    ) else MakeDepositComposable(
                         state = state.value,
                         amount = amount,
                         presetName = receiverName,
@@ -129,166 +109,3 @@ class DepositFragment : Fragment() {
         depositManager.onDepositButtonClicked(amount, receiverName, iban, bic)
     }
 }
-
-@Composable
-private fun MakeDepositComposable(
-    state: DepositState,
-    amount: Amount,
-    presetName: String? = null,
-    presetIban: String? = null,
-    onMakeDeposit: (Amount, String, String, String) -> Unit,
-) {
-    val scrollState = rememberScrollState()
-    Column(
-        modifier = Modifier
-            .fillMaxWidth()
-            .verticalScroll(scrollState),
-        horizontalAlignment = Alignment.CenterHorizontally,
-    ) {
-        var name by rememberSaveable { mutableStateOf(presetName ?: "") }
-        var iban by rememberSaveable { mutableStateOf(presetIban ?: "") }
-        var bic by rememberSaveable { mutableStateOf("") }
-        val focusRequester = remember { FocusRequester() }
-        OutlinedTextField(
-            modifier = Modifier
-                .padding(16.dp)
-                .focusRequester(focusRequester),
-            value = name,
-            enabled = !state.showFees,
-            onValueChange = { input ->
-                name = input
-            },
-            isError = name.isBlank(),
-            label = {
-                Text(
-                    stringResource(R.string.send_deposit_name),
-                    color = if (name.isBlank()) {
-                        colorResource(R.color.red)
-                    } else Color.Unspecified,
-                )
-            }
-        )
-        LaunchedEffect(Unit) {
-            focusRequester.requestFocus()
-        }
-        OutlinedTextField(
-            modifier = Modifier
-                .padding(16.dp),
-            value = iban,
-            enabled = !state.showFees,
-            onValueChange = { input ->
-                iban = input
-            },
-            isError = iban.isBlank(),
-            label = {
-                Text(
-                    text = stringResource(R.string.send_deposit_iban),
-                    color = if (iban.isBlank()) {
-                        colorResource(R.color.red)
-                    } else Color.Unspecified,
-                )
-            }
-        )
-        OutlinedTextField(
-            modifier = Modifier
-                .padding(16.dp),
-            value = bic,
-            enabled = !state.showFees,
-            onValueChange = { input ->
-                bic = input
-            },
-            label = {
-                Text(
-                    text = stringResource(R.string.send_deposit_bic),
-                )
-            }
-        )
-        val amountTitle = if (state.effectiveDepositAmount == null) {
-            R.string.amount_chosen
-        } else R.string.send_deposit_amount_effective
-        Text(
-            modifier = Modifier.padding(horizontal = 16.dp),
-            text = stringResource(id = amountTitle),
-        )
-        val shownAmount = if (state.effectiveDepositAmount == null) amount 
else {
-            state.effectiveDepositAmount
-        }
-        Text(
-            modifier = Modifier.padding(16.dp),
-            fontSize = 24.sp,
-            color = colorResource(R.color.green),
-            text = shownAmount.toString(),
-        )
-        AnimatedVisibility(visible = state.showFees) {
-            Column(
-                modifier = Modifier.fillMaxWidth(),
-                horizontalAlignment = Alignment.CenterHorizontally,
-            ) {
-                val totalAmount = state.totalDepositCost ?: amount
-                val effectiveAmount = state.effectiveDepositAmount ?: 
Amount.zero(amount.currency)
-                val fee = totalAmount - effectiveAmount
-                Text(
-                    modifier = Modifier.padding(horizontal = 16.dp),
-                    text = stringResource(id = R.string.withdraw_fees),
-                )
-                Text(
-                    modifier = Modifier.padding(16.dp),
-                    fontSize = 24.sp,
-                    color = colorResource(if (fee.isZero()) R.color.green else 
R.color.red),
-                    text = if (fee.isZero()) {
-                        fee.toString()
-                    } else {
-                        stringResource(R.string.amount_negative, 
fee.toString())
-                    },
-                )
-                Text(
-                    modifier = Modifier.padding(horizontal = 16.dp),
-                    text = stringResource(id = R.string.send_amount),
-                )
-                Text(
-                    modifier = Modifier.padding(16.dp),
-                    fontSize = 24.sp,
-                    color = colorResource(R.color.green),
-                    text = totalAmount.toString(),
-                )
-            }
-        }
-        AnimatedVisibility(visible = state is DepositState.Error) {
-            Text(
-                modifier = Modifier.padding(16.dp),
-                fontSize = 18.sp,
-                color = colorResource(R.color.red),
-                text = (state as? DepositState.Error)?.msg ?: "",
-            )
-        }
-        val focusManager = LocalFocusManager.current
-        Button(
-            modifier = Modifier.padding(16.dp),
-            enabled = iban.isNotBlank(),
-            onClick = {
-                focusManager.clearFocus()
-                onMakeDeposit(amount, name, iban, bic)
-            },
-        ) {
-            Text(text = stringResource(
-                if (state.showFees) R.string.send_deposit_create_button
-                else R.string.send_deposit_check_fees_button
-            ))
-        }
-    }
-}
-
-@Preview
-@Composable
-fun PreviewMakeDepositComposable() {
-    Surface {
-        val state = DepositState.FeesChecked(
-            effectiveDepositAmount = Amount.fromDouble("TESTKUDOS", 42.00),
-            totalDepositCost = Amount.fromDouble("TESTKUDOS", 42.23),
-        )
-        MakeDepositComposable(
-            state = state,
-            amount = Amount.fromDouble("TESTKUDOS", 42.23)) { _, _, _, _ ->
-        }
-    }
-}
diff --git a/wallet/src/main/java/net/taler/wallet/deposit/DepositManager.kt 
b/wallet/src/main/java/net/taler/wallet/deposit/DepositManager.kt
index 81124ec..0f10b5f 100644
--- a/wallet/src/main/java/net/taler/wallet/deposit/DepositManager.kt
+++ b/wallet/src/main/java/net/taler/wallet/deposit/DepositManager.kt
@@ -26,6 +26,7 @@ import kotlinx.coroutines.launch
 import kotlinx.serialization.Serializable
 import net.taler.common.Amount
 import net.taler.wallet.TAG
+import net.taler.wallet.accounts.PaytoUriBitcoin
 import net.taler.wallet.accounts.PaytoUriIban
 import net.taler.wallet.backend.WalletBackendApi
 
@@ -52,16 +53,28 @@ class DepositManager(
             targetPath = "",
             params = mapOf("receiver-name" to receiverName),
         ).paytoUri
+        makeDeposit(amount, paytoUri)
+    }
+
+    @UiThread
+    fun onDepositButtonClicked(amount: Amount, bitcoinAddress: String) {
+        val paytoUri: String = PaytoUriBitcoin(
+            segwitAddresses = listOf(bitcoinAddress),
+            targetPath = bitcoinAddress,
+        ).paytoUri
+        makeDeposit(amount, paytoUri)
+    }
 
+    private fun makeDeposit(amount: Amount, uri: String) {
         if (depositState.value.showFees) makeDeposit(
-            paytoUri = paytoUri,
+            paytoUri = uri,
             amount = amount,
             totalDepositCost = depositState.value.totalDepositCost
                 ?: Amount.zero(amount.currency),
             effectiveDepositAmount = depositState.value.effectiveDepositAmount
                 ?: Amount.zero(amount.currency),
         ) else {
-            prepareDeposit(paytoUri, amount)
+            prepareDeposit(uri, amount)
         }
     }
 
diff --git 
a/wallet/src/main/java/net/taler/wallet/deposit/MakeBitcoinDepositComposable.kt 
b/wallet/src/main/java/net/taler/wallet/deposit/MakeBitcoinDepositComposable.kt
new file mode 100644
index 0000000..1ff3423
--- /dev/null
+++ 
b/wallet/src/main/java/net/taler/wallet/deposit/MakeBitcoinDepositComposable.kt
@@ -0,0 +1,158 @@
+/*
+ * This file is part of GNU Taler
+ * (C) 2023 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.deposit
+
+import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material.Button
+import androidx.compose.material.OutlinedTextField
+import androidx.compose.material.Surface
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment.Companion.CenterHorizontally
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalFocusManager
+import androidx.compose.ui.res.colorResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import net.taler.common.Amount
+import net.taler.wallet.CURRENCY_BTC
+import net.taler.wallet.R
+import net.taler.wallet.transactions.AmountType
+import net.taler.wallet.transactions.TransactionAmountComposable
+
+@Composable
+fun MakeBitcoinDepositComposable(
+    state: DepositState,
+    amount: Amount,
+    bitcoinAddress: String? = null,
+    onMakeDeposit: (Amount, String) -> Unit,
+) {
+    val scrollState = rememberScrollState()
+    Column(
+        modifier = Modifier
+            .fillMaxWidth()
+            .verticalScroll(scrollState),
+        horizontalAlignment = CenterHorizontally,
+    ) {
+        var address by rememberSaveable { mutableStateOf(bitcoinAddress ?: "") 
}
+        val focusRequester = remember { FocusRequester() }
+        OutlinedTextField(
+            modifier = Modifier
+                .padding(16.dp)
+                .focusRequester(focusRequester),
+            value = address,
+            enabled = !state.showFees,
+            onValueChange = { input ->
+                address = input
+            },
+            isError = address.isBlank(),
+            label = {
+                Text(
+                    stringResource(R.string.send_deposit_bitcoin_address),
+                    color = if (address.isBlank()) {
+                        colorResource(R.color.red)
+                    } else Color.Unspecified,
+                )
+            }
+        )
+        LaunchedEffect(Unit) {
+            focusRequester.requestFocus()
+        }
+        val amountTitle = if (state.effectiveDepositAmount == null) {
+            R.string.amount_chosen
+        } else R.string.send_deposit_amount_effective
+        TransactionAmountComposable(
+            label = stringResource(id = amountTitle),
+            amount = state.effectiveDepositAmount ?: amount,
+            amountType = AmountType.Positive,
+        )
+        AnimatedVisibility(visible = state.showFees) {
+            Column(
+                modifier = Modifier.fillMaxWidth(),
+                horizontalAlignment = CenterHorizontally,
+            ) {
+                val totalAmount = state.totalDepositCost ?: amount
+                val effectiveAmount = state.effectiveDepositAmount ?: 
Amount.zero(amount.currency)
+                val fee = totalAmount - effectiveAmount
+                TransactionAmountComposable(
+                    label = stringResource(id = R.string.withdraw_fees),
+                    amount = fee,
+                    amountType = AmountType.Negative,
+                )
+                TransactionAmountComposable(
+                    label = stringResource(id = R.string.send_amount),
+                    amount = totalAmount,
+                    amountType = AmountType.Positive,
+                )
+            }
+        }
+        AnimatedVisibility(visible = state is DepositState.Error) {
+            Text(
+                modifier = Modifier.padding(16.dp),
+                fontSize = 18.sp,
+                color = colorResource(R.color.red),
+                text = (state as? DepositState.Error)?.msg ?: "",
+            )
+        }
+        val focusManager = LocalFocusManager.current
+        Button(
+            modifier = Modifier.padding(16.dp),
+            enabled = address.isNotBlank(),
+            onClick = {
+                focusManager.clearFocus()
+                // TODO validate bitcoin address
+                onMakeDeposit(amount, address)
+            },
+        ) {
+            Text(text = stringResource(
+                if (state.showFees) R.string.send_deposit_bitcoin_create_button
+                else R.string.send_deposit_check_fees_button
+            ))
+        }
+    }
+}
+
+@Preview
+@Composable
+fun PreviewMakeBitcoinDepositComposable() {
+    Surface {
+        val state = DepositState.FeesChecked(
+            effectiveDepositAmount = Amount.fromDouble(CURRENCY_BTC, 42.00),
+            totalDepositCost = Amount.fromDouble(CURRENCY_BTC, 42.23),
+        )
+        MakeBitcoinDepositComposable(
+            state = state,
+            amount = Amount.fromDouble(CURRENCY_BTC, 42.23)) { _, _ ->
+        }
+    }
+}
diff --git a/wallet/src/main/java/net/taler/wallet/deposit/DepositFragment.kt 
b/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt
similarity index 70%
copy from wallet/src/main/java/net/taler/wallet/deposit/DepositFragment.kt
copy to wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt
index 5d209ac..8b5cac1 100644
--- a/wallet/src/main/java/net/taler/wallet/deposit/DepositFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt
@@ -1,6 +1,6 @@
 /*
  * This file is part of GNU Taler
- * (C) 2022 Taler Systems S.A.
+ * (C) 2023 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
@@ -16,10 +16,6 @@
 
 package net.taler.wallet.deposit
 
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
 import androidx.compose.animation.AnimatedVisibility
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxWidth
@@ -37,101 +33,22 @@ import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.runtime.setValue
-import androidx.compose.ui.Alignment
+import androidx.compose.ui.Alignment.Companion.CenterHorizontally
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
 import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.ComposeView
 import androidx.compose.ui.platform.LocalFocusManager
 import androidx.compose.ui.res.colorResource
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.activityViewModels
-import androidx.lifecycle.lifecycleScope
-import androidx.navigation.fragment.findNavController
 import net.taler.common.Amount
-import net.taler.common.showError
-import net.taler.wallet.MainViewModel
 import net.taler.wallet.R
-import net.taler.wallet.compose.TalerSurface
-import net.taler.wallet.compose.collectAsStateLifecycleAware
-
-class DepositFragment : Fragment() {
-    private val model: MainViewModel by activityViewModels()
-    private val depositManager get() = model.depositManager
-
-    override fun onCreateView(
-        inflater: LayoutInflater,
-        container: ViewGroup?,
-        savedInstanceState: Bundle?,
-    ): View {
-        val amount = arguments?.getString("amount")?.let {
-            Amount.fromJSONString(it)
-        } ?: error("no amount passed")
-        val receiverName = arguments?.getString("receiverName")
-        val iban = arguments?.getString("IBAN")
-        val bic = arguments?.getString("BIC") ?: ""
-
-        if (receiverName != null && iban != null) {
-            onDepositButtonClicked(amount, receiverName, iban, bic)
-        }
-        return ComposeView(requireContext()).apply {
-            setContent {
-                TalerSurface {
-                    val state = 
depositManager.depositState.collectAsStateLifecycleAware()
-                    MakeDepositComposable(
-                        state = state.value,
-                        amount = amount,
-                        presetName = receiverName,
-                        presetIban = iban,
-                        onMakeDeposit = 
this@DepositFragment::onDepositButtonClicked,
-                    )
-                }
-            }
-        }
-    }
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        super.onViewCreated(view, savedInstanceState)
-        lifecycleScope.launchWhenStarted {
-            depositManager.depositState.collect { state ->
-                if (state is DepositState.Error) {
-                    showError(state.msg)
-                } else if (state is DepositState.Success) {
-                    
findNavController().navigate(R.id.action_nav_deposit_to_nav_main)
-                }
-            }
-        }
-    }
-
-    override fun onStart() {
-        super.onStart()
-        activity?.setTitle(R.string.send_deposit_title)
-    }
-
-    override fun onDestroy() {
-        super.onDestroy()
-        if (!requireActivity().isChangingConfigurations) {
-            depositManager.resetDepositState()
-        }
-    }
-
-    private fun onDepositButtonClicked(
-        amount: Amount,
-        receiverName: String,
-        iban: String,
-        bic: String,
-    ) {
-        depositManager.onDepositButtonClicked(amount, receiverName, iban, bic)
-    }
-}
 
 @Composable
-private fun MakeDepositComposable(
+fun MakeDepositComposable(
     state: DepositState,
     amount: Amount,
     presetName: String? = null,
@@ -143,7 +60,7 @@ private fun MakeDepositComposable(
         modifier = Modifier
             .fillMaxWidth()
             .verticalScroll(scrollState),
-        horizontalAlignment = Alignment.CenterHorizontally,
+        horizontalAlignment = CenterHorizontally,
     ) {
         var name by rememberSaveable { mutableStateOf(presetName ?: "") }
         var iban by rememberSaveable { mutableStateOf(presetIban ?: "") }
@@ -222,7 +139,7 @@ private fun MakeDepositComposable(
         AnimatedVisibility(visible = state.showFees) {
             Column(
                 modifier = Modifier.fillMaxWidth(),
-                horizontalAlignment = Alignment.CenterHorizontally,
+                horizontalAlignment = CenterHorizontally,
             ) {
                 val totalAmount = state.totalDepositCost ?: amount
                 val effectiveAmount = state.effectiveDepositAmount ?: 
Amount.zero(amount.currency)
diff --git a/wallet/src/main/res/values/strings.xml 
b/wallet/src/main/res/values/strings.xml
index 0595fa0..cb80922 100644
--- a/wallet/src/main/res/values/strings.xml
+++ b/wallet/src/main/res/values/strings.xml
@@ -134,9 +134,11 @@ GNU Taler is immune against many types of fraud, such as 
phishing of credit card
     <string name="send_deposit_iban">IBAN</string>
     <string name="send_deposit_bic">BIC/SWIFT</string>
     <string name="send_deposit_name">Account holder</string>
+    <string name="send_deposit_bitcoin_address">Bitcoin address</string>
     <string name="send_deposit_check_fees_button">Check fees</string>
     <string name="send_deposit_amount_effective">Effective Amount</string>
     <string name="send_deposit_create_button">Make deposit</string>
+    <string name="send_deposit_bitcoin_create_button">Transfer Bitcoin</string>
     <string name="send_peer">To another wallet</string>
     <string name="send_peer_bitcoin">To another Taler wallet</string>
     <string name="send_peer_title">Send money to another wallet</string>

-- 
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]