[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-taler-android] branch master updated (88fd7c5 -> d03e2da)
From: |
gnunet |
Subject: |
[taler-taler-android] branch master updated (88fd7c5 -> d03e2da) |
Date: |
Tue, 13 Sep 2022 19:50:26 +0200 |
This is an automated email from the git hooks/post-receive script.
torsten-grote pushed a change to branch master
in repository taler-android.
from 88fd7c5 [cashier] Release v0.2
new ad05344 [wallet] Simplify Bitcoin withdrawal screen
new ac64720 [wallet] Don't crash when there's no subject in the payto://
URI for manual withdrawals
new d03e2da [common] Add test for small bitcoin amounts
The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../src/main/java/net/taler/common/Amount.kt | 1 -
.../src/test/java/net/taler/common/AmountTest.kt | 14 ++-
.../net/taler/wallet/withdraw/WithdrawManager.kt | 11 +-
.../taler/wallet/withdraw/manual/ScreenBitcoin.kt | 112 ++++++---------------
.../net/taler/wallet/withdraw/manual/ScreenIBAN.kt | 14 ++-
wallet/src/main/res/values/strings.xml | 6 +-
6 files changed, 53 insertions(+), 105 deletions(-)
diff --git a/taler-kotlin-android/src/main/java/net/taler/common/Amount.kt
b/taler-kotlin-android/src/main/java/net/taler/common/Amount.kt
index 18fb6cb..4a6e4b3 100644
--- a/taler-kotlin-android/src/main/java/net/taler/common/Amount.kt
+++ b/taler-kotlin-android/src/main/java/net/taler/common/Amount.kt
@@ -56,7 +56,6 @@ public data class Amount(
public companion object {
private const val FRACTIONAL_BASE: Int = 100000000 // 1e8
- public val SEGWIT_MIN = Amount("BTC", 0, 294)
private val REGEX_CURRENCY = Regex("""^[-_*A-Za-z0-9]{1,12}$""")
public val MAX_VALUE: Long = 2.0.pow(52).toLong()
diff --git a/taler-kotlin-android/src/test/java/net/taler/common/AmountTest.kt
b/taler-kotlin-android/src/test/java/net/taler/common/AmountTest.kt
index 3343b52..7072426 100644
--- a/taler-kotlin-android/src/test/java/net/taler/common/AmountTest.kt
+++ b/taler-kotlin-android/src/test/java/net/taler/common/AmountTest.kt
@@ -16,11 +16,11 @@
package net.taler.common
-import kotlin.random.Random
import org.junit.Assert.assertEquals
-import org.junit.Assert.assertTrue
import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
import org.junit.Test
+import kotlin.random.Random
class AmountTest {
@@ -60,6 +60,14 @@ class AmountTest {
assertEquals("1500000000.00000003 EUR", amount.toString())
}
+ @Test
+ fun testToString() {
+ Amount.fromString("BITCOINBTC", "0.00000001").let { amount ->
+ assertEquals("0.00000001 BITCOINBTC", amount.toString())
+ assertEquals("0.00000001", amount.amountStr)
+ }
+ }
+
@Test
fun testFromJSONStringAcceptsMaxValuesRejectsAbove() {
val maxValue = 4503599627370496
@@ -195,7 +203,7 @@ class AmountTest {
}
@Test
- fun testComparision() {
+ fun testComparison() {
assertTrue(Amount.fromJSONString("EUR:0") <=
Amount.fromJSONString("EUR:0"))
assertTrue(Amount.fromJSONString("EUR:0") <=
Amount.fromJSONString("EUR:0.00000001"))
assertTrue(Amount.fromJSONString("EUR:0") <
Amount.fromJSONString("EUR:0.00000001"))
diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt
b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt
index b597237..f21fd8c 100644
--- a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt
+++ b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt
@@ -70,8 +70,7 @@ sealed class WithdrawStatus {
val subject: String,
val amountRaw: Amount,
override val transactionId: String?,
- ) : ManualTransferRequired() {
- }
+ ) : ManualTransferRequired()
data class ManualTransferRequiredBitcoin(
val exchangeBaseUrl: String,
@@ -287,10 +286,10 @@ fun createManualTransferRequired(
uriStr: String,
transactionId: String? = null,
): WithdrawStatus.ManualTransferRequired {
- val uri = Uri.parse(uriStr)
+ val uri = Uri.parse(uriStr.replace("receiver-name=", "receiver_name="))
if ("bitcoin".equals(uri.authority, true)) {
- val msg = uri.getQueryParameter("message")
- val reg = "\\b([A-Z0-9]{52})\\b".toRegex().find(msg.orEmpty())
+ val msg = uri.getQueryParameter("message").orEmpty()
+ val reg = "\\b([A-Z0-9]{52})\\b".toRegex().find(msg)
val reserve = reg?.value ?: uri.getQueryParameter("subject")!!
val segwitAddrs = Bech32.generateFakeSegwitAddress(reserve,
uri.pathSegments.first())
return WithdrawStatus.ManualTransferRequiredBitcoin(
@@ -307,7 +306,7 @@ fun createManualTransferRequired(
exchangeBaseUrl = exchangeBaseUrl,
uri = uri,
iban = uri.lastPathSegment!!,
- subject = uri.getQueryParameter("message")!!,
+ subject = uri.getQueryParameter("subject") ?: "Error: No subject in
URI",
amountRaw = amount,
transactionId = transactionId,
)
diff --git
a/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenBitcoin.kt
b/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenBitcoin.kt
index cc271eb..6820ba0 100644
--- a/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenBitcoin.kt
+++ b/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenBitcoin.kt
@@ -17,9 +17,6 @@
package net.taler.wallet.withdraw.manual
import android.net.Uri
-import androidx.compose.foundation.BorderStroke
-import androidx.compose.foundation.background
-import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
@@ -28,18 +25,14 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.Button
import androidx.compose.material.ButtonDefaults
-import androidx.compose.material.Icon
-import androidx.compose.material.IconButton
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
-import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.filled.ContentCopy
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
-import androidx.compose.ui.Alignment.Companion.CenterVertically
+import androidx.compose.ui.Alignment.Companion.End
import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
@@ -48,7 +41,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.em
import net.taler.common.Amount
import net.taler.wallet.R
-import net.taler.wallet.compose.copyToClipBoard
+import net.taler.wallet.compose.CopyToClipboardButton
import net.taler.wallet.withdraw.WithdrawStatus
@Composable
@@ -59,62 +52,24 @@ fun ScreenBitcoin(
) {
val scrollState = rememberScrollState()
Column(modifier = Modifier
- .padding(all = 16.dp)
.wrapContentWidth(Alignment.CenterHorizontally)
.verticalScroll(scrollState)
+ .padding(all = 16.dp)
) {
Text(
- text = stringResource(R.string.withdraw_manual_ready_title),
+ text = stringResource(R.string.withdraw_manual_bitcoin_title),
style = MaterialTheme.typography.h5,
)
Text(
- text = stringResource(R.string.withdraw_manual_ready_intro,
- status.amountRaw.toString()),
- style = MaterialTheme.typography.body1,
- modifier = Modifier
- .padding(vertical = 8.dp)
- )
- Text(
- text =
stringResource(R.string.withdraw_manual_bitcoin_ready_details_intro),
- style = MaterialTheme.typography.body1,
- modifier = Modifier
- .padding(vertical = 8.dp)
- )
- Text(
- text =
stringResource(R.string.withdraw_manual_bitcoin_ready_details_segwit),
- style = MaterialTheme.typography.body1,
- modifier = Modifier
- .padding(vertical = 8.dp)
- )
- DetailRow(stringResource(R.string.withdraw_manual_ready_subject),
status.subject)
- Text(
- text =
stringResource(R.string.withdraw_manual_bitcoin_ready_details_bitcoincore),
+ text = stringResource(R.string.withdraw_manual_bitcoin_intro),
style = MaterialTheme.typography.body1,
modifier = Modifier
.padding(vertical = 8.dp)
)
BitcoinSegwitAddrs(
- status.amountRaw,
- status.account,
- status.segwitAddrs
- )
- Text(
- text =
stringResource(R.string.withdraw_manual_bitcoin_ready_details_confirm,
- status.amountRaw.withCurrency(Amount.SEGWIT_MIN.currency) +
Amount.SEGWIT_MIN + Amount.SEGWIT_MIN),
- style = MaterialTheme.typography.body1,
- modifier = Modifier
- .padding(vertical = 8.dp)
- )
- Text(
- text = stringResource(R.string.withdraw_manual_ready_warning),
- style = MaterialTheme.typography.body2,
- color = colorResource(R.color.notice_text),
- modifier = Modifier
- .align(Alignment.CenterHorizontally)
- .padding(all = 8.dp)
- .background(colorResource(R.color.notice_background))
- .border(BorderStroke(2.dp,
colorResource(R.color.notice_border)))
- .padding(all = 16.dp)
+ amount = status.amountRaw,
+ addr = status.account,
+ segwitAddresses = status.segwitAddrs
)
if (bankAppClick != null) {
Button(
@@ -132,9 +87,12 @@ fun ScreenBitcoin(
colors = ButtonDefaults.buttonColors(backgroundColor =
colorResource(R.color.red)),
modifier = Modifier
.padding(vertical = 16.dp)
- .align(Alignment.End),
+ .align(End),
) {
- Text(text =
stringResource(R.string.withdraw_manual_ready_cancel))
+ Text(
+ text =
stringResource(R.string.withdraw_manual_ready_cancel),
+ color = Color.White,
+ )
}
}
}
@@ -142,19 +100,12 @@ fun ScreenBitcoin(
@Composable
fun BitcoinSegwitAddrs(amount: Amount, addr: String, segwitAddresses:
List<String>) {
- val context = LocalContext.current
-
- val sr = segwitAddresses.joinToString(separator = "\n") { s ->
- """
-$s ${Amount.SEGWIT_MIN}
- """.trimIndent()
- }
- val copyText = """
-$addr ${amount.withCurrency("BTC")}
-$sr
- """.trimIndent()
-
Column {
+ CopyToClipboardButton(
+ modifier = Modifier.align(End),
+ label = "Bitcoin",
+ content = getCopyText(amount, addr, segwitAddresses),
+ )
Row(modifier = Modifier.padding(vertical = 8.dp)) {
Column(modifier = Modifier.weight(0.3f)) {
Text(
@@ -177,31 +128,26 @@ $sr
text = segwitAddress,
style = MaterialTheme.typography.body1,
fontWeight = FontWeight.Normal,
- fontSize = 3.em
+ fontSize = 3.em,
)
Text(
- text = Amount.SEGWIT_MIN.toString(),
+ text = SEGWIT_MIN.toString(),
style = MaterialTheme.typography.body1,
fontWeight = FontWeight.Bold,
)
}
}
}
-
- IconButton(
- onClick = { copyToClipBoard(context, "Bitcoin", copyText) },
- ) {
- Row(verticalAlignment = CenterVertically) {
- Icon(Icons.Default.ContentCopy, stringResource(R.string.copy))
- Text(
- modifier = Modifier.padding(start = 8.dp),
- text = stringResource(R.string.copy),
- style = MaterialTheme.typography.body1,
- )
- }
- }
}
+}
+
+private val SEGWIT_MIN = Amount("BTC", 0, 294)
+private fun getCopyText(amount: Amount, addr: String, segwitAddresses:
List<String>): String {
+ val sr = segwitAddresses.joinToString(separator = "\n") { s ->
+ "\n$s ${SEGWIT_MIN}\n"
+ }
+ return "$addr ${amount.withCurrency("BTC")}\n$sr"
}
@Preview
diff --git
a/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenIBAN.kt
b/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenIBAN.kt
index 4cf7941..79ca364 100644
--- a/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenIBAN.kt
+++ b/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenIBAN.kt
@@ -39,6 +39,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.stringResource
@@ -58,9 +59,9 @@ fun ScreenIBAN(
) {
val scrollState = rememberScrollState()
Column(modifier = Modifier
- .padding(all = 16.dp)
.wrapContentWidth(Alignment.CenterHorizontally)
.verticalScroll(scrollState)
+ .padding(all = 16.dp)
) {
Text(
text = stringResource(R.string.withdraw_manual_ready_title),
@@ -73,12 +74,6 @@ fun ScreenIBAN(
modifier = Modifier
.padding(vertical = 8.dp)
)
- Text(
- text =
stringResource(R.string.withdraw_manual_ready_details_intro),
- style = MaterialTheme.typography.body1,
- modifier = Modifier
- .padding(vertical = 8.dp)
- )
DetailRow(stringResource(R.string.withdraw_manual_ready_iban),
status.iban)
DetailRow(stringResource(R.string.withdraw_manual_ready_subject),
status.subject)
DetailRow(stringResource(R.string.amount_chosen),
status.amountRaw.toString())
@@ -112,7 +107,10 @@ fun ScreenIBAN(
.padding(vertical = 16.dp)
.align(Alignment.End),
) {
- Text(text =
stringResource(R.string.withdraw_manual_ready_cancel))
+ Text(
+ text =
stringResource(R.string.withdraw_manual_ready_cancel),
+ color = Color.White,
+ )
}
}
}
diff --git a/wallet/src/main/res/values/strings.xml
b/wallet/src/main/res/values/strings.xml
index ab8984c..52700b8 100644
--- a/wallet/src/main/res/values/strings.xml
+++ b/wallet/src/main/res/values/strings.xml
@@ -153,10 +153,8 @@ GNU Taler is immune against many types of fraud, such as
phishing of credit card
<string name="withdraw_manual_ready_title">Exchange is ready for
withdrawal!</string>
<string name="withdraw_manual_ready_intro">To complete the process you
need to wire %s to the exchange bank account</string>
<string name="withdraw_manual_ready_details_intro">Bank transfer
details</string>
- <string name="withdraw_manual_bitcoin_ready_details_intro">Bitcoin
transfer details</string>
- <string name="withdraw_manual_bitcoin_ready_details_segwit">The exchange
need a transaction with 3 output, one output is the exchange account and the
other two are segwit fake address for metadata with an minimum amount.</string>
- <string name="withdraw_manual_bitcoin_ready_details_bitcoincore">In
bitcoincore wallet use \'Add Recipient\' button to add two additional recipient
and copy addresses and amounts</string>
- <string name="withdraw_manual_bitcoin_ready_details_confirm">Make sure the
amount show %s, else you have to change the base unit to BTC</string>
+ <string name="withdraw_manual_bitcoin_title">Bitcoin exchange ready for
withdrawal</string>
+ <string name="withdraw_manual_bitcoin_intro">Now make a split transaction
with the following three outputs.</string>
<string name="withdraw_manual_ready_iban">IBAN</string>
<string name="withdraw_manual_ready_subject">Subject</string>
<string name="withdraw_manual_ready_bank_button">Open in banking
app</string>
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [taler-taler-android] branch master updated (88fd7c5 -> d03e2da),
gnunet <=