gnunet-svn
[Top][All Lists]
Advanced

[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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]