[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-taler-android] branch master updated (413e27d -> 005a08e)
From: |
gnunet |
Subject: |
[taler-taler-android] branch master updated (413e27d -> 005a08e) |
Date: |
Wed, 22 Feb 2023 12:33:52 +0100 |
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 413e27d Translated using Weblate (Spanish)
new 4559c84 [wallet] navigate to withdrawal transaction detail for bank
withdrawals
new 58945ae [wallet] Initial work for QuickJS migration.
new 5f7e7ac [wallet] Fixed JNI issue with Proguard.
new b76b001 [wallet] TalerWalletCore now pulled from Maven
new f0aee2a [wallet] Final preparations for merging QuickJS
new 045dafa [wallet] rename peer ops after core 0.9.2 update
new 94c0ecc [wallet] adapt qtart log level and only log on debug builds
new 005a08e [wallet] update qtart to 0.9.3-dev.3
The 8 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:
build.gradle | 2 +-
wallet/.gitignore | 2 +-
wallet/build.gradle | 46 ++++--------------
wallet/proguard-rules.pro | 3 --
wallet/src/main/AndroidManifest.xml | 3 +-
.../src/main/java/net/taler/wallet/MainActivity.kt | 4 +-
.../taler/wallet/backend/WalletBackendService.kt | 56 +++++++++++++---------
.../net/taler/wallet/peer/IncomingComposable.kt | 39 +++++++++------
.../wallet/peer/IncomingPullPaymentFragment.kt | 2 +-
.../wallet/peer/IncomingPushPaymentFragment.kt | 2 +-
.../java/net/taler/wallet/peer/IncomingState.kt | 15 +++---
.../net/taler/wallet/peer/OutgoingPullFragment.kt | 2 +-
.../net/taler/wallet/peer/OutgoingPushFragment.kt | 2 +-
.../java/net/taler/wallet/peer/OutgoingState.kt | 2 +-
.../main/java/net/taler/wallet/peer/PeerManager.kt | 42 ++++++++--------
.../net/taler/wallet/settings/SettingsFragment.kt | 2 +-
.../wallet/transactions/TransactionManager.kt | 11 +++++
.../wallet/withdraw/PromptWithdrawFragment.kt | 27 +++++++++--
.../net/taler/wallet/withdraw/WithdrawManager.kt | 12 +++--
wallet/src/main/res/navigation/nav_graph.xml | 4 ++
20 files changed, 155 insertions(+), 123 deletions(-)
diff --git a/build.gradle b/build.gradle
index 70d1bce..96b232e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -11,7 +11,7 @@ buildscript {
// check https://android-rebuilds.beuc.net/ for availability of free
build tools
build_tools_version = "33.0.1"
// should debug build types be minified with D8 as well? good for
catching issues early
- minify_debug = true
+ minify_debug = false
}
repositories {
google()
diff --git a/wallet/.gitignore b/wallet/.gitignore
index 44ca846..5ddaed3 100644
--- a/wallet/.gitignore
+++ b/wallet/.gitignore
@@ -1,3 +1,3 @@
/build
/.bundle
-/src/main/assets/taler-wallet-*-*.js
+/src/main/jniLibs
\ No newline at end of file
diff --git a/wallet/build.gradle b/wallet/build.gradle
index fb897c6..fcd2b98 100644
--- a/wallet/build.gradle
+++ b/wallet/build.gradle
@@ -13,18 +13,13 @@
* 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/>
*/
-
-import com.android.build.gradle.tasks.MergeResources
-
plugins {
id "com.android.application"
id "kotlin-android"
id "kotlinx-serialization"
- id "de.undercouch.download" version "5.3.0"
}
-def walletCoreVersion = "v0.9.1"
-def walletCoreSha256 =
"99fd96fb897c6954710728820369949090bff84d06728f04b29c6cb067c8f9d4"
+def qtart_version = "0.9.3-dev.3"
static def versionCodeEpoch() {
return (new Date().getTime() / 1000).toInteger()
@@ -45,16 +40,15 @@ android {
defaultConfig {
applicationId "net.taler.wallet"
- minSdkVersion 21
+ minSdkVersion 24
targetSdkVersion 32
versionCode 21
- versionName walletCoreVersion
+ versionName qtart_version
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
- buildConfigField "String", "WALLET_CORE_VERSION",
"\"$walletCoreVersion\""
}
buildTypes {
release {
- minifyEnabled true
+ minifyEnabled false
proguardFiles
getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
@@ -116,7 +110,7 @@ android {
dependencies {
implementation project(":taler-kotlin-android")
- implementation 'net.taler:akono:0.2'
+ implementation "net.taler:qtart:$qtart_version@aar"
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
@@ -160,37 +154,13 @@ dependencies {
implementation "io.noties.markwon:ext-tables:$markwon_version"
implementation "io.noties.markwon:recycler:$markwon_version"
+ // Java Native access
+ implementation "net.java.dev.jna:jna:5.13.0@aar"
+
testImplementation "junit:junit:$junit_version"
testImplementation 'org.json:json:20220320'
}
-def walletLibraryDir = "src/main/assets"
-def walletDestFile =
"${walletLibraryDir}/taler-wallet-embedded-${walletCoreVersion}.js"
-task downloadWalletLibrary(type: Download, dependsOn: preBuild) {
- src
"https://git.taler.net/wallet-core.git/plain/${walletCoreVersion}/taler-wallet-embedded.js?h=prebuilt"
- dest walletDestFile
- onlyIfModified true
- overwrite false
- doFirst {
- new File(walletLibraryDir).mkdirs()
- if (!file(dest).exists()) { // delete old versions before fetching
new one
- delete fileTree(walletLibraryDir) {
- include 'taler-wallet-embedded-*.js'
- }
- }
- }
-}
-task verifyWalletLibrary(type: Verify, dependsOn: downloadWalletLibrary) {
- src walletDestFile
- algorithm 'SHA-256'
- checksum walletCoreSha256
-}
-
-tasks.withType(MergeResources) {
- inputs.dir walletLibraryDir
- dependsOn verifyWalletLibrary
-}
-
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
kotlinOptions {
freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
diff --git a/wallet/proguard-rules.pro b/wallet/proguard-rules.pro
index 04cb4da..9eda10b 100644
--- a/wallet/proguard-rules.pro
+++ b/wallet/proguard-rules.pro
@@ -20,7 +20,4 @@
# hide the original source file name.
#-renamesourcefileattribute SourceFile
--keep class net.taler.akono.** {*;}
-
#noinspection ShrinkerUnresolvedReference
--keep class net.taler.wallet.** {*;}
diff --git a/wallet/src/main/AndroidManifest.xml
b/wallet/src/main/AndroidManifest.xml
index c40b87e..0b0a5b6 100644
--- a/wallet/src/main/AndroidManifest.xml
+++ b/wallet/src/main/AndroidManifest.xml
@@ -43,8 +43,7 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
- tools:ignore="GoogleAppIndexingWarning"
- tools:targetApi="m">
+ tools:ignore="GoogleAppIndexingWarning">
<activity
android:name=".MainActivity"
diff --git a/wallet/src/main/java/net/taler/wallet/MainActivity.kt
b/wallet/src/main/java/net/taler/wallet/MainActivity.kt
index fcc9dee..7a40b4b 100644
--- a/wallet/src/main/java/net/taler/wallet/MainActivity.kt
+++ b/wallet/src/main/java/net/taler/wallet/MainActivity.kt
@@ -279,11 +279,11 @@ class MainActivity : AppCompatActivity(),
OnNavigationItemSelectedListener,
}
action.startsWith("pay-pull/", ignoreCase = true) -> {
nav.navigate(R.id.action_global_prompt_pull_payment)
- model.peerManager.checkPeerPullPayment(u2)
+ model.peerManager.preparePeerPullDebit(u2)
}
action.startsWith("pay-push/", ignoreCase = true) -> {
nav.navigate(R.id.action_global_prompt_push_payment)
- model.peerManager.checkPeerPushPayment(u2)
+ model.peerManager.preparePeerPushCredit(u2)
}
else -> {
showError(R.string.error_unsupported_uri, "From:
$from\nURI: $u2")
diff --git
a/wallet/src/main/java/net/taler/wallet/backend/WalletBackendService.kt
b/wallet/src/main/java/net/taler/wallet/backend/WalletBackendService.kt
index 06e0627..6411b8b 100644
--- a/wallet/src/main/java/net/taler/wallet/backend/WalletBackendService.kt
+++ b/wallet/src/main/java/net/taler/wallet/backend/WalletBackendService.kt
@@ -25,8 +25,8 @@ import android.os.Message
import android.os.Messenger
import android.os.RemoteException
import android.util.Log
-import net.taler.akono.AkonoJni
-import net.taler.wallet.BuildConfig.WALLET_CORE_VERSION
+import net.taler.qtart.TalerWalletCore
+import net.taler.wallet.BuildConfig
import net.taler.wallet.HostCardEmulatorService
import org.json.JSONObject
import java.lang.ref.WeakReference
@@ -46,7 +46,7 @@ class WalletBackendService : Service() {
*/
private val messenger: Messenger = Messenger(IncomingHandler(this))
- private lateinit var akono: AkonoJni
+ private val walletCore = TalerWalletCore()
private var initialized = false
@@ -57,25 +57,17 @@ class WalletBackendService : Service() {
private val subscribers = LinkedList<Messenger>()
override fun onCreate() {
- val talerWalletAndroidCode =
- assets.open("taler-wallet-embedded-$WALLET_CORE_VERSION.js").use {
- it.readBytes().toString(Charsets.UTF_8)
- }
-
-
Log.i(TAG, "onCreate in wallet backend service")
- akono = AkonoJni()
- akono.putModuleCode("@gnu-taler/taler-wallet-embedded",
talerWalletAndroidCode)
- akono.setMessageHandler(object : AkonoJni.MessageHandler {
- override fun handleMessage(message: String) {
- this@WalletBackendService.handleAkonoMessage(message)
- }
- })
- //akono.evalNodeCode("require('source-map-support').install();")
- akono.evalNodeCode("require('akono');")
- akono.evalNodeCode("tw = require('@gnu-taler/taler-wallet-embedded');")
- akono.evalNodeCode("tw.installNativeWalletListener();")
+
+ walletCore.setMessageHandler {
+ this@WalletBackendService.handleAkonoMessage(it)
+ }
+ if (BuildConfig.DEBUG) walletCore.setStdoutHandler {
+ Log.d(TAG, it)
+ }
+ walletCore.run()
sendInitMessage()
+ // runIntegrationTest()
super.onCreate()
}
@@ -85,7 +77,27 @@ class WalletBackendService : Service() {
val args = JSONObject()
msg.put("args", args)
args.put("persistentStoragePath", "${application.filesDir}/$WALLET_DB")
- akono.sendMessage(msg.toString())
+ args.put("logLevel", "INFO")
+ Log.d(TAG, "init message: ${msg.toString(2)}")
+ walletCore.sendRequest(msg.toString())
+ }
+
+ /**
+ * Run the integration tests for wallet-core.
+ */
+ private fun runIntegrationTest() {
+ val msg = JSONObject()
+ msg.put("operation", "runIntegrationTest")
+ val args = JSONObject()
+ msg.put("args", args)
+ args.put("amountToWithdraw", "KUDOS:3")
+ args.put("amountToSpend", "KUDOS:1")
+ args.put("bankBaseUrl",
"https://bank.demo.taler.net/demobanks/default/access-api/")
+ args.put("exchangeBaseUrl", "https://exchange.demo.taler.net/")
+ args.put("merchantBaseUrl", "https://backend.demo.taler.net/")
+ args.put("merchantAuthToken", "secret-token:sandbox")
+ Log.d(TAG, "integration test message: ${msg.toString(2)}")
+ walletCore.sendRequest(msg.toString())
}
/**
@@ -125,7 +137,7 @@ class WalletBackendService : Service() {
request.put("operation", operation)
request.put("id", serviceRequestID)
request.put("args", argsObj)
- svc.akono.sendMessage(request.toString(2))
+ svc.walletCore.sendRequest(request.toString())
Log.i(
TAG,
"mapping service request ID $serviceRequestID to
client request ID $clientRequestID"
diff --git a/wallet/src/main/java/net/taler/wallet/peer/IncomingComposable.kt
b/wallet/src/main/java/net/taler/wallet/peer/IncomingComposable.kt
index 98f1edd..11867f3 100644
--- a/wallet/src/main/java/net/taler/wallet/peer/IncomingComposable.kt
+++ b/wallet/src/main/java/net/taler/wallet/peer/IncomingComposable.kt
@@ -86,12 +86,12 @@ fun IncomingComposable(
)
when (val s = state.value) {
IncomingChecking -> PeerPullCheckingComposable()
- is IncomingTerms -> PeerPullTermsComposable(s, onAccept, data)
is IncomingAccepting -> PeerPullTermsComposable(s, onAccept, data)
+ is IncomingTerms -> PeerPullTermsComposable(s, onAccept, data)
+ is IncomingError -> PeerPullErrorComposable(s)
IncomingAccepted -> {
// we navigate away, don't show anything
}
- is IncomingError -> PeerPullErrorComposable(s)
}
}
}
@@ -121,7 +121,9 @@ fun ColumnScope.PeerPullTermsComposable(
Spacer(modifier = Modifier.weight(1f))
Card(modifier = Modifier.fillMaxWidth()) {
Column(
- modifier = Modifier.padding(8.dp)
+ modifier = Modifier
+ .padding(8.dp)
+ .fillMaxWidth()
) {
Row(
modifier = Modifier.align(End),
@@ -137,15 +139,18 @@ fun ColumnScope.PeerPullTermsComposable(
fontWeight = FontWeight.Bold,
)
}
- val fee =
- Amount.zero(terms.amount.currency) // terms.amount -
terms.contractTerms.amount
- if (!fee.isZero()) {
- Text(
- modifier = Modifier.align(End),
- text = stringResource(id = R.string.payment_fee, fee),
- style = MaterialTheme.typography.bodyLarge,
- )
+ // this gets used for credit and debit, so fee calculation differs
+ val fee = if (terms.amountRaw > terms.amountEffective) {
+ terms.amountRaw - terms.amountEffective
+ } else {
+ terms.amountEffective - terms.amountRaw
}
+ if (!fee.isZero()) Text(
+ modifier = Modifier.align(End),
+ text = stringResource(id = R.string.amount_negative, fee),
+ style = MaterialTheme.typography.bodyLarge,
+ color = MaterialTheme.colorScheme.error,
+ )
if (terms is IncomingAccepting) {
CircularProgressIndicator(
modifier = Modifier
@@ -199,7 +204,8 @@ fun PeerPullCheckingPreview() {
fun PeerPullTermsPreview() {
Surface {
val terms = IncomingTerms(
- amount = Amount.fromDouble("TESTKUDOS", 42.23),
+ amountRaw = Amount.fromDouble("TESTKUDOS", 42.23),
+ amountEffective = Amount.fromDouble("TESTKUDOS", 42.423),
contractTerms = PeerContractTerms(
summary = "This is a long test summary that can be more than
one line long for sure",
amount = Amount.fromDouble("TESTKUDOS", 23.42),
@@ -218,7 +224,8 @@ fun PeerPullTermsPreview() {
fun PeerPullAcceptingPreview() {
Surface {
val terms = IncomingTerms(
- amount = Amount.fromDouble("TESTKUDOS", 42.23),
+ amountRaw = Amount.fromDouble("TESTKUDOS", 42.23),
+ amountEffective = Amount.fromDouble("TESTKUDOS", 42.123),
contractTerms = PeerContractTerms(
summary = "This is a long test summary that can be more than
one line long for sure",
amount = Amount.fromDouble("TESTKUDOS", 23.42),
@@ -237,7 +244,11 @@ fun PeerPullAcceptingPreview() {
fun PeerPullPayErrorPreview() {
Surface {
@SuppressLint("UnrememberedMutableState")
- val s =
mutableStateOf(IncomingError(TalerErrorInfo(WALLET_WITHDRAWAL_KYC_REQUIRED,
"hint", "msg")))
+ val s = mutableStateOf(
+ IncomingError(
+ info = TalerErrorInfo(WALLET_WITHDRAWAL_KYC_REQUIRED, "hint",
"msg"),
+ )
+ )
IncomingComposable(s, incomingPush) {}
}
}
diff --git
a/wallet/src/main/java/net/taler/wallet/peer/IncomingPullPaymentFragment.kt
b/wallet/src/main/java/net/taler/wallet/peer/IncomingPullPaymentFragment.kt
index 6a74c30..3aa0963 100644
--- a/wallet/src/main/java/net/taler/wallet/peer/IncomingPullPaymentFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/peer/IncomingPullPaymentFragment.kt
@@ -51,7 +51,7 @@ class IncomingPullPaymentFragment : Fragment() {
TalerSurface {
val state =
peerManager.incomingPullState.collectAsStateLifecycleAware()
IncomingComposable(state, incomingPull) { terms ->
- peerManager.acceptPeerPullPayment(terms)
+ peerManager.confirmPeerPullDebit(terms)
}
}
}
diff --git
a/wallet/src/main/java/net/taler/wallet/peer/IncomingPushPaymentFragment.kt
b/wallet/src/main/java/net/taler/wallet/peer/IncomingPushPaymentFragment.kt
index 56734e3..736ccd5 100644
--- a/wallet/src/main/java/net/taler/wallet/peer/IncomingPushPaymentFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/peer/IncomingPushPaymentFragment.kt
@@ -51,7 +51,7 @@ class IncomingPushPaymentFragment : Fragment() {
TalerSurface {
val state =
peerManager.incomingPushState.collectAsStateLifecycleAware()
IncomingComposable(state, incomingPush) { terms ->
- peerManager.acceptPeerPushPayment(terms)
+ peerManager.confirmPeerPushCredit(terms)
}
}
}
diff --git a/wallet/src/main/java/net/taler/wallet/peer/IncomingState.kt
b/wallet/src/main/java/net/taler/wallet/peer/IncomingState.kt
index 7ca38c4..c6c78f3 100644
--- a/wallet/src/main/java/net/taler/wallet/peer/IncomingState.kt
+++ b/wallet/src/main/java/net/taler/wallet/peer/IncomingState.kt
@@ -23,13 +23,14 @@ import net.taler.wallet.backend.TalerErrorInfo
sealed class IncomingState
object IncomingChecking : IncomingState()
open class IncomingTerms(
- val amount: Amount,
+ val amountRaw: Amount,
+ val amountEffective: Amount,
val contractTerms: PeerContractTerms,
val id: String,
) : IncomingState()
class IncomingAccepting(s: IncomingTerms) :
- IncomingTerms(s.amount, s.contractTerms, s.id)
+ IncomingTerms(s.amountRaw, s.amountEffective, s.contractTerms, s.id)
object IncomingAccepted : IncomingState()
data class IncomingError(
@@ -43,15 +44,17 @@ data class PeerContractTerms(
)
@Serializable
-data class CheckPeerPullPaymentResponse(
- val amount: Amount,
+data class PreparePeerPullDebitResponse(
val contractTerms: PeerContractTerms,
+ val amountRaw: Amount,
+ val amountEffective: Amount,
val peerPullPaymentIncomingId: String,
)
@Serializable
-data class CheckPeerPushPaymentResponse(
- val amount: Amount,
+data class PreparePeerPushCreditResponse(
val contractTerms: PeerContractTerms,
+ val amountRaw: Amount,
+ val amountEffective: Amount,
val peerPushPaymentIncomingId: String,
)
diff --git a/wallet/src/main/java/net/taler/wallet/peer/OutgoingPullFragment.kt
b/wallet/src/main/java/net/taler/wallet/peer/OutgoingPullFragment.kt
index b9634d5..9f579e2 100644
--- a/wallet/src/main/java/net/taler/wallet/peer/OutgoingPullFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/peer/OutgoingPullFragment.kt
@@ -78,6 +78,6 @@ class OutgoingPullFragment : Fragment() {
}
private fun onCreateInvoice(amount: Amount, summary: String, exchange:
ExchangeItem) {
- peerManager.initiatePullPayment(amount, summary, exchange)
+ peerManager.initiatePeerPullCredit(amount, summary, exchange)
}
}
diff --git a/wallet/src/main/java/net/taler/wallet/peer/OutgoingPushFragment.kt
b/wallet/src/main/java/net/taler/wallet/peer/OutgoingPushFragment.kt
index b110876..b7a510c 100644
--- a/wallet/src/main/java/net/taler/wallet/peer/OutgoingPushFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/peer/OutgoingPushFragment.kt
@@ -72,6 +72,6 @@ class OutgoingPushFragment : Fragment() {
}
private fun onSend(amount: Amount, summary: String) {
- peerManager.initiatePeerPushPayment(amount, summary)
+ peerManager.initiatePeerPushDebit(amount, summary)
}
}
diff --git a/wallet/src/main/java/net/taler/wallet/peer/OutgoingState.kt
b/wallet/src/main/java/net/taler/wallet/peer/OutgoingState.kt
index 0e01056..e40ddb8 100644
--- a/wallet/src/main/java/net/taler/wallet/peer/OutgoingState.kt
+++ b/wallet/src/main/java/net/taler/wallet/peer/OutgoingState.kt
@@ -41,7 +41,7 @@ data class InitiatePeerPullPaymentResponse(
)
@Serializable
-data class InitiatePeerPushPaymentResponse(
+data class InitiatePeerPullCreditResponse(
val exchangeBaseUrl: String,
val talerUri: String,
)
diff --git a/wallet/src/main/java/net/taler/wallet/peer/PeerManager.kt
b/wallet/src/main/java/net/taler/wallet/peer/PeerManager.kt
index 270ca04..5b38e2f 100644
--- a/wallet/src/main/java/net/taler/wallet/peer/PeerManager.kt
+++ b/wallet/src/main/java/net/taler/wallet/peer/PeerManager.kt
@@ -52,11 +52,11 @@ class PeerManager(
private val _incomingPushState =
MutableStateFlow<IncomingState>(IncomingChecking)
val incomingPushState: StateFlow<IncomingState> = _incomingPushState
- fun initiatePullPayment(amount: Amount, summary: String, exchange:
ExchangeItem) {
+ fun initiatePeerPullCredit(amount: Amount, summary: String, exchange:
ExchangeItem) {
_outgoingPullState.value = OutgoingCreating
scope.launch(Dispatchers.IO) {
val expiry = Timestamp.fromMillis(System.currentTimeMillis() +
DAYS.toMillis(3))
- api.request("initiatePeerPullPayment",
InitiatePeerPullPaymentResponse.serializer()) {
+ api.request("initiatePeerPullCredit",
InitiatePeerPullPaymentResponse.serializer()) {
put("exchangeBaseUrl", exchange.exchangeBaseUrl)
put("partialContractTerms", JSONObject().apply {
put("amount", amount.toJSONString())
@@ -67,7 +67,7 @@ class PeerManager(
val qrCode = QrCodeManager.makeQrCode(it.talerUri)
_outgoingPullState.value = OutgoingResponse(it.talerUri,
qrCode)
}.onError { error ->
- Log.e(TAG, "got initiatePeerPullPayment error result $error")
+ Log.e(TAG, "got initiatePeerPullCredit error result $error")
_outgoingPullState.value = OutgoingError(error)
}
}
@@ -77,11 +77,11 @@ class PeerManager(
_outgoingPullState.value = OutgoingIntro
}
- fun initiatePeerPushPayment(amount: Amount, summary: String) {
+ fun initiatePeerPushDebit(amount: Amount, summary: String) {
_outgoingPushState.value = OutgoingCreating
scope.launch(Dispatchers.IO) {
val expiry = Timestamp.fromMillis(System.currentTimeMillis() +
DAYS.toMillis(3))
- api.request("initiatePeerPushPayment",
InitiatePeerPushPaymentResponse.serializer()) {
+ api.request("initiatePeerPushDebit",
InitiatePeerPullCreditResponse.serializer()) {
put("amount", amount.toJSONString())
put("partialContractTerms", JSONObject().apply {
put("amount", amount.toJSONString())
@@ -92,7 +92,7 @@ class PeerManager(
val qrCode = QrCodeManager.makeQrCode(response.talerUri)
_outgoingPushState.value = OutgoingResponse(response.talerUri,
qrCode)
}.onError { error ->
- Log.e(TAG, "got initiatePeerPushPayment error result $error")
+ Log.e(TAG, "got initiatePeerPushDebit error result $error")
_outgoingPushState.value = OutgoingError(error)
}
}
@@ -102,65 +102,67 @@ class PeerManager(
_outgoingPushState.value = OutgoingIntro
}
- fun checkPeerPullPayment(talerUri: String) {
+ fun preparePeerPullDebit(talerUri: String) {
_incomingPullState.value = IncomingChecking
scope.launch(Dispatchers.IO) {
- api.request("checkPeerPullPayment",
CheckPeerPullPaymentResponse.serializer()) {
+ api.request("preparePeerPullDebit",
PreparePeerPullDebitResponse.serializer()) {
put("talerUri", talerUri)
}.onSuccess { response ->
_incomingPullState.value = IncomingTerms(
- amount = response.amount,
+ amountRaw = response.amountRaw,
+ amountEffective = response.amountEffective,
contractTerms = response.contractTerms,
id = response.peerPullPaymentIncomingId,
)
}.onError { error ->
- Log.e(TAG, "got checkPeerPushPayment error result $error")
+ Log.e(TAG, "got preparePeerPullDebit error result $error")
_incomingPullState.value = IncomingError(error)
}
}
}
- fun acceptPeerPullPayment(terms: IncomingTerms) {
+ fun confirmPeerPullDebit(terms: IncomingTerms) {
_incomingPullState.value = IncomingAccepting(terms)
scope.launch(Dispatchers.IO) {
- api.request<Unit>("acceptPeerPullPayment") {
+ api.request<Unit>("confirmPeerPullDebit") {
put("peerPullPaymentIncomingId", terms.id)
}.onSuccess {
_incomingPullState.value = IncomingAccepted
}.onError { error ->
- Log.e(TAG, "got checkPeerPushPayment error result $error")
+ Log.e(TAG, "got confirmPeerPullDebit error result $error")
_incomingPullState.value = IncomingError(error)
}
}
}
- fun checkPeerPushPayment(talerUri: String) {
+ fun preparePeerPushCredit(talerUri: String) {
_incomingPushState.value = IncomingChecking
scope.launch(Dispatchers.IO) {
- api.request("checkPeerPushPayment",
CheckPeerPushPaymentResponse.serializer()) {
+ api.request("preparePeerPushCredit",
PreparePeerPushCreditResponse.serializer()) {
put("talerUri", talerUri)
}.onSuccess { response ->
_incomingPushState.value = IncomingTerms(
- amount = response.amount,
+ amountRaw = response.amountRaw,
+ amountEffective = response.amountEffective,
contractTerms = response.contractTerms,
id = response.peerPushPaymentIncomingId,
)
}.onError { error ->
- Log.e(TAG, "got checkPeerPushPayment error result $error")
+ Log.e(TAG, "got preparePeerPushCredit error result $error")
_incomingPushState.value = IncomingError(error)
}
}
}
- fun acceptPeerPushPayment(terms: IncomingTerms) {
+ fun confirmPeerPushCredit(terms: IncomingTerms) {
_incomingPushState.value = IncomingAccepting(terms)
scope.launch(Dispatchers.IO) {
- api.request<Unit>("acceptPeerPushPayment") {
+ api.request<Unit>("confirmPeerPushCredit") {
put("peerPushPaymentIncomingId", terms.id)
}.onSuccess {
_incomingPushState.value = IncomingAccepted
}.onError { error ->
- Log.e(TAG, "got checkPeerPushPayment error result $error")
+ Log.e(TAG, "got confirmPeerPushCredit error result $error")
_incomingPushState.value = IncomingError(error)
}
}
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 8bb0a4a..11c252b 100644
--- a/wallet/src/main/java/net/taler/wallet/settings/SettingsFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/settings/SettingsFragment.kt
@@ -28,10 +28,10 @@ import
com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_SHORT
import com.google.android.material.snackbar.Snackbar
import net.taler.common.showError
import net.taler.common.toRelativeTime
+import net.taler.qtart.BuildConfig.WALLET_CORE_VERSION
import net.taler.wallet.BuildConfig.FLAVOR
import net.taler.wallet.BuildConfig.VERSION_CODE
import net.taler.wallet.BuildConfig.VERSION_NAME
-import net.taler.wallet.BuildConfig.WALLET_CORE_VERSION
import net.taler.wallet.MainViewModel
import net.taler.wallet.R
import net.taler.wallet.withdraw.WithdrawTestStatus
diff --git
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt
index bbae22b..a65d9a6 100644
--- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt
+++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt
@@ -89,6 +89,17 @@ class TransactionManager(
}
}
+ /**
+ * Returns true if given [transactionId] was found for given [currency]
and selected.
+ */
+ fun selectTransaction(currency: String, transactionId: String): Boolean {
+ val t = allTransactions[currency]?.find {
+ it.transactionId == transactionId
+ } ?: return false
+ selectedTransaction = t
+ return true
+ }
+
fun deleteTransaction(transactionId: String) = scope.launch {
api.request<Unit>("deleteTransaction") {
put("transactionId", transactionId)
diff --git
a/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt
b/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt
index dbf901a..abe9562 100644
--- a/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt
@@ -23,9 +23,11 @@ import android.view.ViewGroup
import android.widget.ArrayAdapter
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
+import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.snackbar.Snackbar.LENGTH_LONG
+import kotlinx.coroutines.launch
import net.taler.common.Amount
import net.taler.common.EventObserver
import net.taler.common.fadeIn
@@ -43,6 +45,7 @@ class PromptWithdrawFragment : Fragment() {
private val model: MainViewModel by activityViewModels()
private val withdrawManager by lazy { model.withdrawManager }
+ private val transactionManager by lazy { model.transactionManager }
private lateinit var ui: FragmentPromptWithdrawBinding
@@ -88,9 +91,18 @@ class PromptWithdrawFragment : Fragment() {
is WithdrawStatus.Success -> {
model.showProgressBar.value = false
withdrawManager.withdrawStatus.value = null
-
findNavController().navigate(R.id.action_promptWithdraw_to_nav_main)
- model.showTransactions(status.currency)
- Snackbar.make(requireView(), R.string.withdraw_initiated,
LENGTH_LONG).show()
+ lifecycleScope.launch {
+ // FIXME this is hacky and blocks the UI thread, not good for
many transactions
+ // load new transactions first and wait for result
+ transactionManager.loadTransactions().join()
+ // now select new transaction based on currency and ID
+ if (transactionManager.selectTransaction(status.currency,
status.transactionId)) {
+
findNavController().navigate(R.id.action_promptWithdraw_to_nav_transactions_detail_withdrawal)
+ } else {
+
findNavController().navigate(R.id.action_promptWithdraw_to_nav_main)
+ }
+ Snackbar.make(requireView(), R.string.withdraw_initiated,
LENGTH_LONG).show()
+ }
}
is WithdrawStatus.Error -> {
model.showProgressBar.value = false
@@ -115,8 +127,13 @@ class PromptWithdrawFragment : Fragment() {
}
private fun onReceivedDetails(s: ReceivedDetails) {
- showContent(s.amountRaw, s.amountEffective, s.exchangeBaseUrl,
s.talerWithdrawUri,
- s.ageRestrictionOptions)
+ showContent(
+ amountRaw = s.amountRaw,
+ amountEffective = s.amountEffective,
+ exchange = s.exchangeBaseUrl,
+ uri = s.talerWithdrawUri,
+ ageRestrictionOptions = s.ageRestrictionOptions,
+ )
ui.confirmWithdrawButton.apply {
text = getString(R.string.withdraw_button_confirm)
setOnClickListener {
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 1698a10..90b8570 100644
--- a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt
+++ b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt
@@ -59,7 +59,7 @@ sealed class WithdrawStatus {
) : WithdrawStatus()
object Withdrawing : WithdrawStatus()
- data class Success(val currency: String) : WithdrawStatus()
+ data class Success(val currency: String, val transactionId: String) :
WithdrawStatus()
sealed class ManualTransferRequired : WithdrawStatus() {
abstract val uri: Uri
abstract val transactionId: String?
@@ -108,6 +108,11 @@ data class WithdrawalDetails(
val ageRestrictionOptions: List<Int>? = null,
)
+@Serializable
+data class AcceptWithdrawalResponse(
+ val transactionId: String,
+)
+
@Serializable
data class AcceptManualWithdrawalResponse(
val exchangePaytoUris: List<String>,
@@ -249,14 +254,15 @@ class WithdrawManager(
status: ReceivedDetails,
restrictAge: Int? = null,
) {
- api.request<Unit>("acceptBankIntegratedWithdrawal") {
+ api.request("acceptBankIntegratedWithdrawal",
AcceptWithdrawalResponse.serializer()) {
restrictAge?.let { put("restrictAge", restrictAge) }
put("exchangeBaseUrl", status.exchangeBaseUrl)
put("talerWithdrawUri", status.talerWithdrawUri)
}.onError {
handleError("acceptBankIntegratedWithdrawal", it)
}.onSuccess {
- withdrawStatus.value =
WithdrawStatus.Success(status.amountRaw.currency)
+ withdrawStatus.value =
+ WithdrawStatus.Success(status.amountRaw.currency,
it.transactionId)
}
}
diff --git a/wallet/src/main/res/navigation/nav_graph.xml
b/wallet/src/main/res/navigation/nav_graph.xml
index ec5ec08..1fc4504 100644
--- a/wallet/src/main/res/navigation/nav_graph.xml
+++ b/wallet/src/main/res/navigation/nav_graph.xml
@@ -301,6 +301,10 @@
android:id="@+id/action_promptWithdraw_to_nav_exchange_manual_withdrawal_success"
app:destination="@id/nav_exchange_manual_withdrawal_success"
app:popUpTo="@id/nav_main" />
+ <action
+
android:id="@+id/action_promptWithdraw_to_nav_transactions_detail_withdrawal"
+ app:destination="@id/nav_transactions_detail_withdrawal"
+ app:popUpTo="@id/nav_main" />
<action
android:id="@+id/action_promptWithdraw_to_errorFragment"
app:destination="@id/errorFragment"
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [taler-taler-android] branch master updated (413e27d -> 005a08e),
gnunet <=
- [taler-taler-android] 03/08: [wallet] Fixed JNI issue with Proguard., gnunet, 2023/02/22
- [taler-taler-android] 05/08: [wallet] Final preparations for merging QuickJS, gnunet, 2023/02/22
- [taler-taler-android] 01/08: [wallet] navigate to withdrawal transaction detail for bank withdrawals, gnunet, 2023/02/22
- [taler-taler-android] 02/08: [wallet] Initial work for QuickJS migration., gnunet, 2023/02/22
- [taler-taler-android] 07/08: [wallet] adapt qtart log level and only log on debug builds, gnunet, 2023/02/22
- [taler-taler-android] 04/08: [wallet] TalerWalletCore now pulled from Maven, gnunet, 2023/02/22
- [taler-taler-android] 06/08: [wallet] rename peer ops after core 0.9.2 update, gnunet, 2023/02/22
- [taler-taler-android] 08/08: [wallet] update qtart to 0.9.3-dev.3, gnunet, 2023/02/22