gnunet-svn
[Top][All Lists]
Advanced

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



reply via email to

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