summaryrefslogtreecommitdiff
path: root/wallet
diff options
context:
space:
mode:
authorTorsten Grote <t@grobox.de>2024-02-06 14:26:12 -0300
committerTorsten Grote <t@grobox.de>2024-02-06 14:26:12 -0300
commit20a83c6618236e269b2540990f6a687b5598c889 (patch)
tree9503c5c28353066024b0781841e43e98ff2f324c /wallet
parentda098a6bd5c7cdc4722a24ac28e0a87334341bbb (diff)
downloadtaler-android-20a83c6618236e269b2540990f6a687b5598c889.tar.gz
taler-android-20a83c6618236e269b2540990f6a687b5598c889.tar.bz2
taler-android-20a83c6618236e269b2540990f6a687b5598c889.zip
[wallet] bye bye tips!
Diffstat (limited to 'wallet')
-rw-r--r--wallet/src/main/java/net/taler/wallet/MainActivity.kt5
-rw-r--r--wallet/src/main/java/net/taler/wallet/MainViewModel.kt2
-rw-r--r--wallet/src/main/java/net/taler/wallet/tip/AlreadyAcceptedFragment.kt50
-rw-r--r--wallet/src/main/java/net/taler/wallet/tip/PromptTipFragment.kt153
-rw-r--r--wallet/src/main/java/net/taler/wallet/tip/TipManager.kt100
-rw-r--r--wallet/src/main/java/net/taler/wallet/tip/TipResponses.kt59
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransactionTipFragment.kt135
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt26
-rw-r--r--wallet/src/main/res/drawable/ic_baseline_account_tree.xml10
-rw-r--r--wallet/src/main/res/drawable/ic_baseline_backup.xml10
-rw-r--r--wallet/src/main/res/drawable/ic_baseline_vpn_key.xml10
-rw-r--r--wallet/src/main/res/layout/fragment_already_accepted.xml52
-rw-r--r--wallet/src/main/res/layout/fragment_prompt_tip.xml257
-rw-r--r--wallet/src/main/res/navigation/nav_graph.xml25
-rw-r--r--wallet/src/main/res/values/defaults.xml2
-rw-r--r--wallet/src/main/res/values/strings.xml10
-rw-r--r--wallet/src/test/java/net/taler/wallet/tip/TipResponsesTest.kt83
17 files changed, 1 insertions, 988 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/MainActivity.kt b/wallet/src/main/java/net/taler/wallet/MainActivity.kt
index 868ebe3..631897a 100644
--- a/wallet/src/main/java/net/taler/wallet/MainActivity.kt
+++ b/wallet/src/main/java/net/taler/wallet/MainActivity.kt
@@ -273,11 +273,6 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener,
nav.navigate(R.id.action_global_promptPayment)
model.paymentManager.preparePay(u2)
}
- action.startsWith("tip/", ignoreCase = true) -> {
- Log.v(TAG, "navigating!")
- nav.navigate(R.id.action_global_promptTip)
- model.tipManager.prepareTip(u2)
- }
action.startsWith("withdraw/", ignoreCase = true) -> {
Log.v(TAG, "navigating!")
// there's more than one entry point, so use global action
diff --git a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
index 263df49..3c2c4ae 100644
--- a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
+++ b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
@@ -46,7 +46,6 @@ import net.taler.wallet.peer.PeerManager
import net.taler.wallet.pending.PendingOperationsManager
import net.taler.wallet.refund.RefundManager
import net.taler.wallet.settings.SettingsManager
-import net.taler.wallet.tip.TipManager
import net.taler.wallet.transactions.TransactionManager
import net.taler.wallet.withdraw.WithdrawManager
import org.json.JSONObject
@@ -79,7 +78,6 @@ class MainViewModel(
val networkManager = NetworkManager(app.applicationContext)
val withdrawManager = WithdrawManager(api, viewModelScope)
- val tipManager = TipManager(api, viewModelScope)
val paymentManager = PaymentManager(api, viewModelScope)
val pendingOperationsManager: PendingOperationsManager =
PendingOperationsManager(api, viewModelScope)
diff --git a/wallet/src/main/java/net/taler/wallet/tip/AlreadyAcceptedFragment.kt b/wallet/src/main/java/net/taler/wallet/tip/AlreadyAcceptedFragment.kt
deleted file mode 100644
index 637a2da..0000000
--- a/wallet/src/main/java/net/taler/wallet/tip/AlreadyAcceptedFragment.kt
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * This file is part of GNU Taler
- * (C) 2020 Taler Systems S.A.
- *
- * GNU Taler is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3, or (at your option) any later version.
- *
- * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- * 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/>
- */
-
-package net.taler.wallet.tip
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.navigation.fragment.findNavController
-import net.taler.wallet.databinding.FragmentAlreadyAcceptedBinding
-
-/**
- * Display the message that the user already paid for the order
- * that the merchant is proposing.
- */
-class AlreadyAcceptedFragment : Fragment() {
-
- private lateinit var ui: FragmentAlreadyAcceptedBinding
-
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?,
- ): View {
- ui = FragmentAlreadyAcceptedBinding.inflate(inflater, container, false)
- return ui.root
- }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- ui.backButton.setOnClickListener {
- findNavController().navigateUp()
- }
- }
-
-}
diff --git a/wallet/src/main/java/net/taler/wallet/tip/PromptTipFragment.kt b/wallet/src/main/java/net/taler/wallet/tip/PromptTipFragment.kt
deleted file mode 100644
index 78969d0..0000000
--- a/wallet/src/main/java/net/taler/wallet/tip/PromptTipFragment.kt
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * This file is part of GNU Taler
- * (C) 2020 Taler Systems S.A.
- *
- * GNU Taler is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3, or (at your option) any later version.
- *
- * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- * 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/>
- */
-
-package net.taler.wallet.tip
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.activityViewModels
-import androidx.navigation.fragment.findNavController
-import com.google.android.material.snackbar.Snackbar
-import com.google.android.material.snackbar.Snackbar.LENGTH_LONG
-import net.taler.common.Amount
-import net.taler.common.fadeIn
-import net.taler.common.fadeOut
-import net.taler.common.showError
-import net.taler.wallet.MainViewModel
-import net.taler.wallet.R
-import net.taler.wallet.cleanExchange
-import net.taler.wallet.databinding.FragmentPromptTipBinding
-
-/**
- * Show a tip and ask the user to accept/decline.
- */
-class PromptTipFragment : Fragment() {
-
- private val model: MainViewModel by activityViewModels()
- private val tipManager by lazy { model.tipManager }
-
- private lateinit var ui: FragmentPromptTipBinding
-
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?,
- ): View {
- ui = FragmentPromptTipBinding.inflate(inflater, container, false)
- return ui.root
- }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- tipManager.tipStatus.observe(viewLifecycleOwner, ::onPaymentStatusChanged)
- }
-
- private fun showLoading(show: Boolean) {
- model.showProgressBar.value = show
- if (show) {
- ui.progressBar.fadeIn()
- } else {
- ui.progressBar.fadeOut()
- }
- }
-
- private fun onPaymentStatusChanged(payStatus: TipStatus) = when (payStatus) {
- is TipStatus.Prepared -> {
- showLoading(false)
- showContent(
- amountRaw = payStatus.tipAmountRaw,
- amountEffective = payStatus.tipAmountEffective,
- exchange = payStatus.exchangeBaseUrl,
- merchant = payStatus.merchantBaseUrl
- )
- ui.confirmWithdrawButton.isEnabled = true
- ui.confirmWithdrawButton.setOnClickListener {
- tipManager.acceptTip(
- payStatus.walletTipId,
- payStatus.tipAmountRaw.currency
- )
- }
- }
- is TipStatus.Accepting -> {
- model.showProgressBar.value = true
- ui.confirmProgressBar.fadeIn()
- ui.confirmWithdrawButton.fadeOut()
- }
- is TipStatus.AlreadyAccepted -> {
- showLoading(false)
- tipManager.resetTipStatus()
- findNavController().navigate(R.id.action_promptTip_to_alreadyAccepted)
- }
- is TipStatus.Success -> {
- showLoading(false)
- tipManager.resetTipStatus()
- findNavController().navigate(R.id.action_promptTip_to_nav_main)
- model.showTransactions(payStatus.currency)
- Snackbar.make(requireView(), R.string.tip_received, LENGTH_LONG).show()
- }
- is TipStatus.Error -> {
- showLoading(false)
- // TODO pass TalerErrorInfo for JSON rendering
- showError(getString(R.string.payment_error, payStatus.error.userFacingMsg))
- ui.confirmProgressBar.fadeOut()
- ui.confirmWithdrawButton.fadeIn()
- }
- is TipStatus.None -> {
- // No tip active
- showLoading(false)
- }
- is TipStatus.Loading -> {
- // Wait until loaded ...
- showLoading(true)
- }
- }
-
- private fun showContent(
- amountRaw: Amount,
- amountEffective: Amount,
- exchange: String,
- merchant: String,
- ) {
- model.showProgressBar.value = false
- ui.progressBar.fadeOut()
-
- ui.introView.fadeIn()
- ui.effectiveAmountView.text = amountEffective.toString()
- ui.effectiveAmountView.fadeIn()
-
- ui.chosenAmountLabel.fadeIn()
- ui.chosenAmountView.text = amountRaw.toString()
- ui.chosenAmountView.fadeIn()
-
- ui.feeLabel.fadeIn()
- ui.feeView.text =
- getString(R.string.amount_negative, (amountRaw - amountEffective).toString())
- ui.feeView.fadeIn()
-
- ui.exchangeIntroView.fadeIn()
- ui.withdrawExchangeUrl.text = cleanExchange(exchange)
- ui.withdrawExchangeUrl.fadeIn()
-
- ui.merchantIntroView.fadeIn()
- ui.withdrawMerchantUrl.text = cleanExchange(merchant)
- ui.withdrawMerchantUrl.fadeIn()
-
- ui.withdrawCard.fadeIn()
- }
-
-}
diff --git a/wallet/src/main/java/net/taler/wallet/tip/TipManager.kt b/wallet/src/main/java/net/taler/wallet/tip/TipManager.kt
deleted file mode 100644
index 3c54d20..0000000
--- a/wallet/src/main/java/net/taler/wallet/tip/TipManager.kt
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * This file is part of GNU Taler
- * (C) 2020 Taler Systems S.A.
- *
- * GNU Taler is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3, or (at your option) any later version.
- *
- * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- * 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/>
- */
-
-package net.taler.wallet.tip
-
-import android.util.Log
-import androidx.annotation.UiThread
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.launch
-import net.taler.common.Amount
-import net.taler.common.Timestamp
-import net.taler.wallet.TAG
-import net.taler.wallet.backend.TalerErrorInfo
-import net.taler.wallet.backend.WalletBackendApi
-import net.taler.wallet.tip.PrepareTipResponse.AlreadyAcceptedResponse
-import net.taler.wallet.tip.PrepareTipResponse.TipPossibleResponse
-
-sealed class TipStatus {
- object None : TipStatus()
- object Loading : TipStatus()
- data class Prepared(
- val walletTipId: String,
- val merchantBaseUrl: String,
- val exchangeBaseUrl: String,
- val expirationTimestamp: Timestamp,
- val tipAmountRaw: Amount,
- val tipAmountEffective: Amount,
- ) : TipStatus()
- object Accepting : TipStatus()
- data class AlreadyAccepted(
- val walletTipId: String,
- ) : TipStatus()
-
- // TODO bring user to fulfilment URI (not yet in wallet API)
- data class Error(val error: TalerErrorInfo) : TipStatus()
- data class Success(val currency: String) : TipStatus()
-}
-
-class TipManager(
- private val api: WalletBackendApi,
- private val scope: CoroutineScope,
-) {
-
- private val mTipStatus = MutableLiveData<TipStatus>(TipStatus.None)
- internal val tipStatus: LiveData<TipStatus> = mTipStatus
-
- @UiThread
- fun prepareTip(url: String) = scope.launch {
- mTipStatus.value = TipStatus.Loading
- api.request("prepareTip", PrepareTipResponse.serializer()) {
- put("talerTipUri", url)
- }.onError {
- handleError("prepareTip", it)
- }.onSuccess { response ->
- mTipStatus.value = when (response) {
- is TipPossibleResponse -> response.toTipStatusPrepared()
- is AlreadyAcceptedResponse -> TipStatus.AlreadyAccepted(
- response.walletTipId
- )
- }
- }
- }
-
- fun acceptTip(tipId: String, currency: String) = scope.launch {
- mTipStatus.value = TipStatus.Accepting
- api.request("acceptTip", ConfirmTipResult.serializer()) {
- put("walletTipId", tipId)
- }.onError {
- handleError("acceptTip", it)
- }.onSuccess {
- mTipStatus.postValue(TipStatus.Success(currency))
- }
- }
-
- @UiThread
- fun resetTipStatus() {
- mTipStatus.value = TipStatus.None
- }
-
- private fun handleError(operation: String, error: TalerErrorInfo) {
- Log.e(TAG, "got $operation error result $error")
- mTipStatus.value = TipStatus.Error(error)
- }
-
-}
diff --git a/wallet/src/main/java/net/taler/wallet/tip/TipResponses.kt b/wallet/src/main/java/net/taler/wallet/tip/TipResponses.kt
deleted file mode 100644
index b0f6273..0000000
--- a/wallet/src/main/java/net/taler/wallet/tip/TipResponses.kt
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * This file is part of GNU Taler
- * (C) 2020 Taler Systems S.A.
- *
- * GNU Taler is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3, or (at your option) any later version.
- *
- * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- * 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/>
- */
-
-package net.taler.wallet.tip
-
-import kotlinx.serialization.ExperimentalSerializationApi
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
-import kotlinx.serialization.json.JsonClassDiscriminator
-import net.taler.common.Amount
-import net.taler.common.Timestamp
-
-@OptIn(ExperimentalSerializationApi::class)
-@Serializable
-@JsonClassDiscriminator("accepted")
-sealed class PrepareTipResponse {
-
- @Serializable
- @SerialName("false")
- data class TipPossibleResponse(
- val walletTipId: String,
- val merchantBaseUrl: String,
- val exchangeBaseUrl: String,
- val expirationTimestamp: Timestamp,
- val tipAmountRaw: Amount,
- val tipAmountEffective: Amount,
- ) : PrepareTipResponse() {
- fun toTipStatusPrepared() = TipStatus.Prepared(
- walletTipId = walletTipId,
- merchantBaseUrl = merchantBaseUrl,
- exchangeBaseUrl = exchangeBaseUrl,
- expirationTimestamp = expirationTimestamp,
- tipAmountEffective = tipAmountEffective,
- tipAmountRaw = tipAmountRaw,
- )
- }
-
- @Serializable
- @SerialName("true")
- data class AlreadyAcceptedResponse(
- val walletTipId: String,
- ) : PrepareTipResponse()
-}
-
-@Serializable
-class ConfirmTipResult
diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionTipFragment.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionTipFragment.kt
deleted file mode 100644
index c15f931..0000000
--- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionTipFragment.kt
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * This file is part of GNU Taler
- * (C) 2022 Taler Systems S.A.
- *
- * GNU Taler is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3, or (at your option) any later version.
- *
- * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- * 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/>
- */
-
-package net.taler.wallet.transactions
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.rememberScrollState
-import androidx.compose.foundation.verticalScroll
-import androidx.compose.material3.MaterialTheme
-import androidx.compose.material3.Surface
-import androidx.compose.material3.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.livedata.observeAsState
-import androidx.compose.ui.Alignment.Companion.CenterHorizontally
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.ComposeView
-import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.res.stringResource
-import androidx.compose.ui.tooling.preview.Preview
-import androidx.compose.ui.unit.dp
-import net.taler.common.Amount
-import net.taler.common.Timestamp
-import net.taler.common.toAbsoluteTime
-import net.taler.wallet.R
-import net.taler.wallet.backend.TalerErrorCode.EXCHANGE_GENERIC_KYC_REQUIRED
-import net.taler.wallet.backend.TalerErrorInfo
-import net.taler.wallet.compose.TalerSurface
-import net.taler.wallet.transactions.TransactionAction.Abort
-import net.taler.wallet.transactions.TransactionAction.Retry
-import net.taler.wallet.transactions.TransactionAction.Suspend
-import net.taler.wallet.transactions.TransactionMajorState.Pending
-
-class TransactionTipFragment : TransactionDetailFragment() {
-
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?,
- ): View = ComposeView(requireContext()).apply {
- setContent {
- TalerSurface {
- val t = transactionManager.selectedTransaction.observeAsState(null).value
- if (t is TransactionTip) TransactionTipComposable(t, devMode) {
- onTransitionButtonClicked(t, it)
- }
- }
- }
- }
-}
-
-@Composable
-fun TransactionTipComposable(
- t: TransactionTip,
- devMode: Boolean?,
- onTransition: (t: TransactionAction) -> Unit,
-) {
- val scrollState = rememberScrollState()
- Column(
- modifier = Modifier
- .fillMaxWidth()
- .verticalScroll(scrollState),
- horizontalAlignment = CenterHorizontally,
- ) {
- val context = LocalContext.current
- Text(
- modifier = Modifier.padding(16.dp),
- text = t.timestamp.ms.toAbsoluteTime(context).toString(),
- style = MaterialTheme.typography.bodyLarge,
- )
-
- TransactionAmountComposable(
- label = stringResource(id = R.string.send_peer_payment_amount_received),
- amount = t.amountEffective,
- amountType = AmountType.Positive,
- )
- TransactionAmountComposable(
- label = stringResource(id = R.string.send_peer_payment_amount_sent),
- amount = t.amountRaw,
- amountType = AmountType.Neutral,
- )
- val fee = t.amountRaw - t.amountEffective
- if (!fee.isZero()) {
- TransactionAmountComposable(
- label = stringResource(id = R.string.withdraw_fees),
- amount = fee,
- amountType = AmountType.Negative,
- )
- }
- TransactionInfoComposable(
- label = stringResource(id = R.string.tip_merchant_url),
- info = t.merchantBaseUrl,
- )
- TransitionsComposable(t, devMode == true, onTransition)
- if (devMode == true && t.error != null) {
- ErrorTransactionButton(error = t.error)
- }
- }
-}
-
-@Preview
-@Composable
-fun TransactionTipPreview() {
- val t = TransactionTip(
- transactionId = "transactionId",
- timestamp = Timestamp.fromMillis(System.currentTimeMillis() - 360 * 60 * 1000),
- txState = TransactionState(Pending),
- txActions = listOf(Retry, Suspend, Abort),
- merchantBaseUrl = "https://merchant.example.org/",
- amountRaw = Amount.fromString("TESTKUDOS", "42.23"),
- amountEffective = Amount.fromString("TESTKUDOS", "42.1337"),
- error = TalerErrorInfo(code = EXCHANGE_GENERIC_KYC_REQUIRED),
- )
- Surface {
- TransactionTipComposable(t, true) {}
- }
-}
diff --git a/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt b/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt
index de47f68..9017854 100644
--- a/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt
+++ b/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt
@@ -41,8 +41,8 @@ import net.taler.wallet.R
import net.taler.wallet.TAG
import net.taler.wallet.backend.TalerErrorCode
import net.taler.wallet.backend.TalerErrorInfo
-import net.taler.wallet.cleanExchange
import net.taler.wallet.balances.CurrencySpecification
+import net.taler.wallet.cleanExchange
import net.taler.wallet.refund.RefundPaymentInfo
import net.taler.wallet.transactions.TransactionMajorState.None
import net.taler.wallet.transactions.TransactionMajorState.Pending
@@ -337,30 +337,6 @@ class TransactionRefund(
}
@Serializable
-@SerialName("tip")
-class TransactionTip(
- override val transactionId: String,
- override val timestamp: Timestamp,
- override val txState: TransactionState,
- override val txActions: List<TransactionAction>,
- val merchantBaseUrl: String,
- override val error: TalerErrorInfo? = null,
- override val amountRaw: Amount,
- override val amountEffective: Amount,
-) : Transaction() {
- override val icon = R.drawable.transaction_tip_accepted
- override val detailPageNav = R.id.action_nav_transactions_detail_tip
-
- @Transient
- override val amountType = AmountType.Positive
- override fun getTitle(context: Context): String {
- return context.getString(R.string.transaction_tip_from, merchantBaseUrl)
- }
-
- override val generalTitleRes = R.string.tip_title
-}
-
-@Serializable
@SerialName("refresh")
class TransactionRefresh(
override val transactionId: String,
diff --git a/wallet/src/main/res/drawable/ic_baseline_account_tree.xml b/wallet/src/main/res/drawable/ic_baseline_account_tree.xml
deleted file mode 100644
index 7067bd3..0000000
--- a/wallet/src/main/res/drawable/ic_baseline_account_tree.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:tint="?attr/colorControlNormal"
- android:viewportWidth="24"
- android:viewportHeight="24">
- <path
- android:fillColor="@android:color/white"
- android:pathData="M22,11V3h-7v3H9V3H2v8h7V8h2v10h4v3h7v-8h-7v3h-2V8h2v3z" />
-</vector>
diff --git a/wallet/src/main/res/drawable/ic_baseline_backup.xml b/wallet/src/main/res/drawable/ic_baseline_backup.xml
deleted file mode 100644
index 006b014..0000000
--- a/wallet/src/main/res/drawable/ic_baseline_backup.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:tint="?attr/colorControlNormal"
- android:viewportWidth="24"
- android:viewportHeight="24">
- <path
- android:fillColor="@android:color/white"
- android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM14,13v4h-4v-4H7l5,-5 5,5h-3z" />
-</vector>
diff --git a/wallet/src/main/res/drawable/ic_baseline_vpn_key.xml b/wallet/src/main/res/drawable/ic_baseline_vpn_key.xml
deleted file mode 100644
index 7b554c9..0000000
--- a/wallet/src/main/res/drawable/ic_baseline_vpn_key.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:tint="?attr/colorControlNormal"
- android:viewportWidth="24"
- android:viewportHeight="24">
- <path
- android:fillColor="@android:color/white"
- android:pathData="M12.65,10C11.83,7.67 9.61,6 7,6c-3.31,0 -6,2.69 -6,6s2.69,6 6,6c2.61,0 4.83,-1.67 5.65,-4H17v4h4v-4h2v-4H12.65zM7,14c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z" />
-</vector>
diff --git a/wallet/src/main/res/layout/fragment_already_accepted.xml b/wallet/src/main/res/layout/fragment_already_accepted.xml
deleted file mode 100644
index b1a7bb1..0000000
--- a/wallet/src/main/res/layout/fragment_already_accepted.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- ~ This file is part of GNU Taler
- ~ (C) 2020 Taler Systems S.A.
- ~
- ~ GNU Taler is free software; you can redistribute it and/or modify it under the
- ~ terms of the GNU General Public License as published by the Free Software
- ~ Foundation; either version 3, or (at your option) any later version.
- ~
- ~ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- ~ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- ~ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- ~
- ~ 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/>
- -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_margin="15dp"
- android:orientation="vertical"
- tools:context=".tip.AlreadyAcceptedFragment">
-
- <Space
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1" />
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="50dp"
- android:layout_gravity="center"
- android:text="@string/tip_already_accepted"
- android:textAlignment="center"
- android:textColor="@android:color/holo_green_dark"
- app:autoSizeTextType="uniform" />
-
-
- <Space
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1" />
-
- <Button
- android:id="@+id/backButton"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/button_back" />
-
-</LinearLayout>
diff --git a/wallet/src/main/res/layout/fragment_prompt_tip.xml b/wallet/src/main/res/layout/fragment_prompt_tip.xml
deleted file mode 100644
index e3b32cd..0000000
--- a/wallet/src/main/res/layout/fragment_prompt_tip.xml
+++ /dev/null
@@ -1,257 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- ~ This file is part of GNU Taler
- ~ (C) 2020 Taler Systems S.A.
- ~
- ~ GNU Taler is free software; you can redistribute it and/or modify it under the
- ~ terms of the GNU General Public License as published by the Free Software
- ~ Foundation; either version 3, or (at your option) any later version.
- ~
- ~ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- ~ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- ~ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- ~
- ~ 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/>
- -->
-
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context=".tip.PromptTipFragment">
-
- <TextView
- android:id="@+id/introView"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_marginStart="16dp"
- android:layout_marginEnd="16dp"
- android:layout_marginBottom="8dp"
- android:gravity="center"
- android:text="@string/tip_total"
- android:visibility="invisible"
- app:layout_constraintBottom_toTopOf="@+id/effectiveAmountView"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintHorizontal_bias="0.5"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent"
- app:layout_constraintVertical_chainStyle="packed"
- tools:visibility="visible" />
-
- <TextView
- android:id="@+id/effectiveAmountView"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_marginStart="16dp"
- android:layout_marginEnd="16dp"
- android:gravity="center"
- android:textColor="@color/green"
- android:textSize="24sp"
- android:visibility="invisible"
- app:layout_constraintBottom_toTopOf="@+id/chosenAmountLabel"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/introView"
- tools:text="9.8 TESTKUDOS"
- tools:visibility="visible" />
-
- <TextView
- android:id="@+id/chosenAmountLabel"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_marginStart="16dp"
- android:layout_marginTop="32dp"
- android:layout_marginEnd="16dp"
- android:gravity="center"
- android:text="@string/amount_chosen"
- android:visibility="invisible"
- app:layout_constraintBottom_toTopOf="@+id/chosenAmountView"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/effectiveAmountView"
- tools:visibility="visible" />
-
- <TextView
- android:id="@+id/chosenAmountView"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_marginStart="16dp"
- android:layout_marginTop="8dp"
- android:layout_marginEnd="16dp"
- android:gravity="center"
- android:textSize="20sp"
- android:visibility="invisible"
- app:layout_constraintBottom_toTopOf="@+id/feeLabel"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/chosenAmountLabel"
- tools:text="10 TESTKUDOS"
- tools:visibility="visible" />
-
- <TextView
- android:id="@+id/feeLabel"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_marginStart="16dp"
- android:layout_marginTop="32dp"
- android:layout_marginEnd="16dp"
- android:gravity="center"
- android:text="@string/tip_fees"
- android:visibility="invisible"
- app:layout_constraintBottom_toTopOf="@+id/feeView"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintHorizontal_bias="0.5"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/chosenAmountView"
- tools:visibility="visible" />
-
- <TextView
- android:id="@+id/feeView"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_marginStart="16dp"
- android:layout_marginTop="8dp"
- android:layout_marginEnd="16dp"
- android:gravity="center"
- android:textColor="?colorError"
- android:textSize="20sp"
- android:visibility="invisible"
- app:layout_constraintBottom_toTopOf="@+id/exchangeIntroView"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/feeLabel"
- tools:text="-0.2 TESTKUDOS"
- tools:visibility="visible" />
-
- <TextView
- android:id="@+id/exchangeIntroView"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_marginStart="16dp"
- android:layout_marginTop="32dp"
- android:layout_marginEnd="16dp"
- android:layout_marginBottom="8dp"
- android:gravity="center"
- android:text="@string/tip_exchange"
- android:visibility="invisible"
- app:layout_constraintBottom_toTopOf="@+id/withdrawExchangeUrl"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintHorizontal_bias="0.5"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/feeView"
- tools:visibility="visible" />
-
- <TextView
- android:id="@+id/withdrawExchangeUrl"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginStart="16dp"
- android:layout_marginEnd="8dp"
- android:layout_marginBottom="8dp"
- android:gravity="center"
- android:textSize="24sp"
- android:visibility="invisible"
- app:layout_constrainedWidth="true"
- app:layout_constraintBottom_toTopOf="@+id/merchantIntroView"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintHorizontal_chainStyle="packed"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/exchangeIntroView"
- tools:text="demo.taler.net"
- tools:visibility="visible" />
-
- <TextView
- android:id="@+id/merchantIntroView"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_marginStart="16dp"
- android:layout_marginEnd="16dp"
- android:layout_marginBottom="8dp"
- android:gravity="center"
- android:text="@string/tip_merchant_url"
- android:visibility="invisible"
- app:layout_constraintBottom_toTopOf="@+id/withdrawMerchantUrl"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintHorizontal_bias="0.5"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/withdrawExchangeUrl"
- tools:visibility="visible" />
-
-
- <TextView
- android:id="@+id/withdrawMerchantUrl"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginStart="16dp"
- android:layout_marginEnd="8dp"
- android:gravity="center"
- android:textSize="24sp"
- android:visibility="invisible"
- app:layout_constrainedWidth="true"
- app:layout_constraintBottom_toTopOf="@+id/withdrawCard"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintHorizontal_bias="0.502"
- app:layout_constraintHorizontal_chainStyle="packed"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/merchantIntroView"
- tools:text="merchant.demo.taler.net"
- tools:visibility="visible" />
-
- <ProgressBar
- android:id="@+id/progressBar"
- style="?android:attr/progressBarStyleLarge"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent" />
-
- <com.google.android.material.card.MaterialCardView
- android:id="@+id/withdrawCard"
- style="@style/BottomCard"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:visibility="invisible"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintStart_toStartOf="parent"
- tools:visibility="visible">
-
- <androidx.constraintlayout.widget.ConstraintLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:padding="8dp">
-
- <Button
- android:id="@+id/confirmWithdrawButton"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:backgroundTint="@color/green"
- android:enabled="false"
- android:text="@string/tip_button_confirm"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintHorizontal_bias="1.0"
- app:layout_constraintStart_toStartOf="parent"
- tools:enabled="true"
- tools:text="@string/tip_button_confirm" />
-
- <ProgressBar
- android:id="@+id/confirmProgressBar"
- style="?android:attr/progressBarStyle"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:visibility="invisible"
- app:layout_constraintBottom_toBottomOf="@+id/confirmWithdrawButton"
- app:layout_constraintEnd_toEndOf="@+id/confirmWithdrawButton"
- app:layout_constraintStart_toStartOf="@+id/confirmWithdrawButton"
- app:layout_constraintTop_toTopOf="@+id/confirmWithdrawButton"
- tools:visibility="visible" />
-
- </androidx.constraintlayout.widget.ConstraintLayout>
-
- </com.google.android.material.card.MaterialCardView>
-
-</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/wallet/src/main/res/navigation/nav_graph.xml b/wallet/src/main/res/navigation/nav_graph.xml
index 24def7f..3ea02fc 100644
--- a/wallet/src/main/res/navigation/nav_graph.xml
+++ b/wallet/src/main/res/navigation/nav_graph.xml
@@ -70,21 +70,6 @@
</fragment>
<fragment
- android:id="@+id/promptTip"
- android:name="net.taler.wallet.tip.PromptTipFragment"
- android:label="Review Tip"
- tools:layout="@layout/fragment_prompt_tip">
- <action
- android:id="@+id/action_promptTip_to_nav_main"
- app:destination="@id/nav_main"
- app:popUpTo="@id/nav_main" />
- <action
- android:id="@+id/action_promptTip_to_alreadyAccepted"
- app:destination="@id/alreadyAccepted"
- app:popUpTo="@id/nav_main" />
- </fragment>
-
- <fragment
android:id="@+id/promptPayment"
android:name="net.taler.wallet.payment.PromptPaymentFragment"
android:label="@string/payment_prompt_title"
@@ -290,12 +275,6 @@
android:label="@string/transactions_detail_title" />
<fragment
- android:id="@+id/alreadyAccepted"
- android:name="net.taler.wallet.tip.AlreadyAcceptedFragment"
- android:label="@string/tip_already_accepted"
- tools:layout="@layout/fragment_already_accepted" />
-
- <fragment
android:id="@+id/promptWithdraw"
android:name="net.taler.wallet.withdraw.PromptWithdrawFragment"
android:label="@string/nav_prompt_withdraw"
@@ -370,10 +349,6 @@
app:destination="@id/promptPayment" />
<action
- android:id="@+id/action_global_promptTip"
- app:destination="@id/promptTip" />
-
- <action
android:id="@+id/action_global_prompt_pull_payment"
app:destination="@id/promptPullPayment" />
diff --git a/wallet/src/main/res/values/defaults.xml b/wallet/src/main/res/values/defaults.xml
index 0e2a6a1..dffc14e 100644
--- a/wallet/src/main/res/values/defaults.xml
+++ b/wallet/src/main/res/values/defaults.xml
@@ -16,6 +16,4 @@
<resources>
- <bool name="settings_backup_default">true</bool>
-
</resources> \ No newline at end of file
diff --git a/wallet/src/main/res/values/strings.xml b/wallet/src/main/res/values/strings.xml
index 436116e..6dac8a8 100644
--- a/wallet/src/main/res/values/strings.xml
+++ b/wallet/src/main/res/values/strings.xml
@@ -109,7 +109,6 @@ GNU Taler is immune against many types of fraud, such as phishing of credit card
<string name="transaction_order_total">Total</string>
<string name="transaction_order">Purchase</string>
<string name="transaction_order_id">Receipt #%1$s</string>
- <string name="transaction_tip_from">Reward from %s</string>
<string name="transaction_refund">Refund</string>
<string name="transaction_refund_from">Refund from %s</string>
<string name="transaction_pending">PENDING</string>
@@ -295,15 +294,6 @@ GNU Taler is immune against many types of fraud, such as phishing of credit card
<string name="refund_error">Error processing refund</string>
<string name="refund_success">Refund received!</string>
- <string name="tip_title">Reward</string>
- <string name="tip_already_accepted">This reward was already accepted.</string>
- <string name="tip_total">Total</string>
- <string name="tip_fees">Fee</string>
- <string name="tip_exchange">Exchange</string>
- <string name="tip_merchant_url">Merchant URL</string>
- <string name="tip_button_confirm">Accept reward</string>
- <string name="tip_received">Reward received</string>
-
<string name="wifi_disabled_error">Turn on Wi-Fi to get free Wi-Fi</string>
<string name="wifi_connect_error">Could not connect to free Wi-Fi: %s</string>
diff --git a/wallet/src/test/java/net/taler/wallet/tip/TipResponsesTest.kt b/wallet/src/test/java/net/taler/wallet/tip/TipResponsesTest.kt
deleted file mode 100644
index 0300933..0000000
--- a/wallet/src/test/java/net/taler/wallet/tip/TipResponsesTest.kt
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * This file is part of GNU Taler
- * (C) 2020 Taler Systems S.A.
- *
- * GNU Taler is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3, or (at your option) any later version.
- *
- * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- * 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/>
- */
-
-package net.taler.wallet.tip
-
-import kotlinx.serialization.json.Json
-import net.taler.common.Amount
-import org.junit.Test
-
-class TipResponsesTest {
-
- private val json = Json {
- ignoreUnknownKeys = true
- }
-
- @Test
- fun testConfirmTipResult() {
- val jsonStr = """
- {
- "type": "response",
- "operation": "acceptTip",
- "id": 47,
- "result": {}
- }
- """.trimIndent()
- json.decodeFromString(ConfirmTipResult.serializer(), jsonStr)
- }
-
- @Test
- fun testTipPossibleSerializer() {
- val jsonStr = """
- {
- "accepted": false,
- "tipAmountRaw": "ARS:2",
- "exchangeBaseUrl": "http://exchange.taler:8081/",
- "merchantBaseUrl": "http://merchant-backend.taler:9966/",
- "expirationTimestamp": {
- "t_s": 1688217455
- },
- "tipAmountEffective": "ARS:1.4",
- "walletTipId": "SZH86ATJC4NZ427JHFVQ9M3S1TCQKVWSSZGSBW8MQ8VTVWD4M4GG"
- }
- """.trimIndent()
- val response = json.decodeFromString(PrepareTipResponse.serializer(), jsonStr)
- response as PrepareTipResponse.TipPossibleResponse
- assert(response.walletTipId == "SZH86ATJC4NZ427JHFVQ9M3S1TCQKVWSSZGSBW8MQ8VTVWD4M4GG")
- assert(response.tipAmountEffective == Amount(currency = "ARS", fraction = 40000000, value = 1))
- }
-
- @Test
- fun testTipAcceptedSerializer() {
- val jsonStr = """
- {
- "accepted": true,
- "tipAmountRaw": "ARS:2",
- "exchangeBaseUrl": "http://exchange.taler:8081/",
- "merchantBaseUrl": "http://merchant-backend.taler:9966/",
- "expirationTimestamp": {
- "t_s": 1688217455
- },
- "tipAmountEffective": "ARS:1.4",
- "walletTipId": "SZH86ATJC4NZ427JHFVQ9M3S1TCQKVWSSZGSBW8MQ8VTVWD4M4GG"
- }
- """.trimIndent()
- val response = json.decodeFromString(PrepareTipResponse.serializer(), jsonStr)
- assert(response is PrepareTipResponse.AlreadyAcceptedResponse)
- assert((response as PrepareTipResponse.AlreadyAcceptedResponse).walletTipId == "SZH86ATJC4NZ427JHFVQ9M3S1TCQKVWSSZGSBW8MQ8VTVWD4M4GG")
- }
-
-}