summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorsten Grote <t@grobox.de>2023-02-21 11:09:28 -0300
committerTorsten Grote <t@grobox.de>2023-02-22 08:33:24 -0300
commit045dafa221abcf54328ca4764eac847195fff0d7 (patch)
treea9e652b0c53013626159f539755c13c6af221da7
parentf0aee2ac0e495339526aa9d03b98cf26031e79bd (diff)
downloadtaler-android-045dafa221abcf54328ca4764eac847195fff0d7.tar.gz
taler-android-045dafa221abcf54328ca4764eac847195fff0d7.tar.bz2
taler-android-045dafa221abcf54328ca4764eac847195fff0d7.zip
[wallet] rename peer ops after core 0.9.2 update
and show fees for incoming peer payments
-rw-r--r--wallet/src/main/java/net/taler/wallet/MainActivity.kt4
-rw-r--r--wallet/src/main/java/net/taler/wallet/peer/IncomingComposable.kt39
-rw-r--r--wallet/src/main/java/net/taler/wallet/peer/IncomingPullPaymentFragment.kt2
-rw-r--r--wallet/src/main/java/net/taler/wallet/peer/IncomingPushPaymentFragment.kt2
-rw-r--r--wallet/src/main/java/net/taler/wallet/peer/IncomingState.kt15
-rw-r--r--wallet/src/main/java/net/taler/wallet/peer/OutgoingPullFragment.kt2
-rw-r--r--wallet/src/main/java/net/taler/wallet/peer/OutgoingPushFragment.kt2
-rw-r--r--wallet/src/main/java/net/taler/wallet/peer/OutgoingState.kt2
-rw-r--r--wallet/src/main/java/net/taler/wallet/peer/PeerManager.kt42
9 files changed, 63 insertions, 47 deletions
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<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)
}
}