From 045dafa221abcf54328ca4764eac847195fff0d7 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 21 Feb 2023 11:09:28 -0300 Subject: [wallet] rename peer ops after core 0.9.2 update and show fees for incoming peer payments --- .../src/main/java/net/taler/wallet/MainActivity.kt | 4 +-- .../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 +++++++++++----------- 9 files changed, 63 insertions(+), 47 deletions(-) (limited to 'wallet/src/main') 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/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(IncomingChecking) val incomingPushState: StateFlow = _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("acceptPeerPullPayment") { + api.request("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("acceptPeerPushPayment") { + api.request("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) } } -- cgit v1.2.3