diff options
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") - } - -} |