gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-taler-android] branch master updated (86b1647 -> d1163e3)


From: gnunet
Subject: [taler-taler-android] branch master updated (86b1647 -> d1163e3)
Date: Wed, 17 Aug 2022 20:40:28 +0200

This is an automated email from the git hooks/post-receive script.

torsten-grote pushed a change to branch master
in repository taler-android.

    from 86b1647  [wallet] Show FAB also in transaction list when having more 
than one currency
     new 326b1bd  [wallet] Use global navigation to handle Taler URIs
     new d1163e3  [wallet] Add ability to cancel/delete transactions

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../src/main/java/net/taler/wallet/MainActivity.kt |  4 +-
 .../transactions/TransactionDetailFragment.kt      | 31 +++++++++-
 .../wallet/transactions/TransactionManager.kt      | 10 +++-
 .../transactions/TransactionPaymentFragment.kt     |  7 ++-
 .../transactions/TransactionRefreshFragment.kt     |  9 ++-
 .../transactions/TransactionRefundFragment.kt      |  7 ++-
 .../transactions/TransactionWithdrawalFragment.kt  | 66 +++++++++++++++-------
 .../wallet/transactions/TransactionsFragment.kt    |  7 +--
 .../res/layout/fragment_transaction_payment.xml    | 14 ++++-
 .../res/layout/fragment_transaction_withdrawal.xml | 14 ++++-
 wallet/src/main/res/navigation/nav_graph.xml       | 10 ++--
 wallet/src/main/res/values/strings.xml             |  3 +
 12 files changed, 137 insertions(+), 45 deletions(-)

diff --git a/wallet/src/main/java/net/taler/wallet/MainActivity.kt 
b/wallet/src/main/java/net/taler/wallet/MainActivity.kt
index 0e04f44..1ba05ac 100644
--- a/wallet/src/main/java/net/taler/wallet/MainActivity.kt
+++ b/wallet/src/main/java/net/taler/wallet/MainActivity.kt
@@ -217,12 +217,12 @@ class MainActivity : AppCompatActivity(), 
OnNavigationItemSelectedListener,
             when {
                 action.startsWith("pay/") -> {
                     Log.v(TAG, "navigating!")
-                    nav.navigate(R.id.action_nav_main_to_promptPayment)
+                    nav.navigate(R.id.action_global_promptPayment)
                     model.paymentManager.preparePay(url)
                 }
                 action.startsWith("tip/") -> {
                     Log.v(TAG, "navigating!")
-                    nav.navigate(R.id.action_nav_main_to_promptTip)
+                    nav.navigate(R.id.action_global_promptTip)
                     model.tipManager.prepareTip(url)
                 }
                 action.startsWith("withdraw/") -> {
diff --git 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt
 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt
index 128ca04..f21818f 100644
--- 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt
+++ 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionDetailFragment.kt
@@ -23,8 +23,11 @@ import android.view.Menu
 import android.view.MenuInflater
 import android.view.MenuItem
 import android.widget.TextView
+import androidx.annotation.StringRes
+import androidx.appcompat.app.AlertDialog
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.activityViewModels
+import androidx.navigation.fragment.findNavController
 import net.taler.common.Amount
 import net.taler.common.startActivitySafe
 import net.taler.wallet.MainViewModel
@@ -67,7 +70,7 @@ abstract class TransactionDetailFragment : Fragment() {
         feeView: TextView,
         info: TransactionInfo,
         raw: Amount,
-        fee: Amount
+        fee: Amount,
     ) {
         orderAmountView.text = raw.toString()
         feeView.text = getString(R.string.amount_negative, fee.toString())
@@ -85,4 +88,30 @@ abstract class TransactionDetailFragment : Fragment() {
         orderIdView.text = getString(R.string.transaction_order_id, 
info.orderId)
     }
 
+    @StringRes
+    protected open val deleteDialogTitle = R.string.transactions_delete
+    @StringRes
+    protected open val deleteDialogMessage = 
R.string.transactions_delete_dialog_message
+    @StringRes
+    protected open val deleteDialogButton = R.string.transactions_delete
+
+    protected fun onDeleteButtonClicked(t: Transaction) {
+        AlertDialog.Builder(requireContext(), R.style.DialogTheme)
+            .setTitle(deleteDialogTitle)
+            .setMessage(deleteDialogMessage)
+            .setPositiveButton(R.string.cancel) { dialog, _ ->
+                dialog.cancel()
+            }
+            .setNegativeButton(deleteDialogButton) { dialog, _ ->
+                deleteTransaction(t)
+                dialog.dismiss()
+            }
+            .show()
+    }
+
+    private fun deleteTransaction(t: Transaction) {
+        transactionManager.deleteTransaction(t.transactionId)
+        findNavController().popBackStack()
+    }
+
 }
diff --git 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt
index ea257a8..d1020e2 100644
--- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt
+++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt
@@ -25,7 +25,6 @@ import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.launch
 import net.taler.wallet.TAG
 import net.taler.wallet.backend.WalletBackendApi
-import java.util.HashMap
 import java.util.LinkedList
 
 sealed class TransactionsResult {
@@ -96,7 +95,14 @@ class TransactionManager(
         }.onError {
             Log.e(TAG, "Error deleteTransaction $it")
         }.onSuccess {
-            // no op
+            // re-load transactions as our list is stale otherwise
+            loadTransactions()
+        }
+    }
+
+    fun deleteTransactions(transactionIds: List<String>) {
+        transactionIds.forEach { id ->
+            deleteTransaction(id)
         }
     }
 
diff --git 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionPaymentFragment.kt
 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionPaymentFragment.kt
index 84c5c77..e2e4f9f 100644
--- 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionPaymentFragment.kt
+++ 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionPaymentFragment.kt
@@ -30,8 +30,8 @@ class TransactionPaymentFragment : 
TransactionDetailFragment() {
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View? {
+        savedInstanceState: Bundle?,
+    ): View {
         ui = FragmentTransactionPaymentBinding.inflate(inflater, container, 
false)
         return ui.root
     }
@@ -51,6 +51,9 @@ class TransactionPaymentFragment : 
TransactionDetailFragment() {
             t.amountRaw,
             fee
         )
+        ui.deleteButton.setOnClickListener {
+            onDeleteButtonClicked(t)
+        }
     }
 
 }
diff --git 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefreshFragment.kt
 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefreshFragment.kt
index 717dd33..d44db43 100644
--- 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefreshFragment.kt
+++ 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefreshFragment.kt
@@ -33,8 +33,8 @@ class TransactionRefreshFragment : 
TransactionDetailFragment() {
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View? {
+        savedInstanceState: Bundle?,
+    ): View {
         ui = FragmentTransactionWithdrawalBinding.inflate(inflater, container, 
false)
         return ui.root
     }
@@ -50,7 +50,10 @@ class TransactionRefreshFragment : 
TransactionDetailFragment() {
         ui.chosenAmountView.visibility = GONE
         val fee = t.amountEffective
         ui.feeView.text = getString(R.string.amount_negative, fee.toString())
-        ui. exchangeView.text = cleanExchange(t.exchangeBaseUrl)
+        ui.exchangeView.text = cleanExchange(t.exchangeBaseUrl)
+        ui.deleteButton.setOnClickListener {
+            onDeleteButtonClicked(t)
+        }
     }
 
 }
diff --git 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefundFragment.kt
 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefundFragment.kt
index 6628d6c..5e6eef4 100644
--- 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefundFragment.kt
+++ 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionRefundFragment.kt
@@ -32,8 +32,8 @@ class TransactionRefundFragment : TransactionDetailFragment() 
{
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View? {
+        savedInstanceState: Bundle?,
+    ): View {
         ui = FragmentTransactionPaymentBinding.inflate(inflater, container, 
false)
         return ui.root
     }
@@ -56,6 +56,9 @@ class TransactionRefundFragment : TransactionDetailFragment() 
{
             t.amountRaw,
             fee
         )
+        ui.deleteButton.setOnClickListener {
+            onDeleteButtonClicked(t)
+        }
     }
 
 }
diff --git 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionWithdrawalFragment.kt
 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionWithdrawalFragment.kt
index a11f8ba..ff8d272 100644
--- 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionWithdrawalFragment.kt
+++ 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionWithdrawalFragment.kt
@@ -31,6 +31,8 @@ import net.taler.wallet.MainViewModel
 import net.taler.wallet.R
 import net.taler.wallet.cleanExchange
 import net.taler.wallet.databinding.FragmentTransactionWithdrawalBinding
+import net.taler.wallet.transactions.WithdrawalDetails.ManualTransfer
+import net.taler.wallet.transactions.WithdrawalDetails.TalerBankIntegrationApi
 import net.taler.wallet.withdraw.createManualTransferRequired
 
 class TransactionWithdrawalFragment : TransactionDetailFragment() {
@@ -54,33 +56,55 @@ class TransactionWithdrawalFragment : 
TransactionDetailFragment() {
 
         ui.effectiveAmountLabel.text = getString(R.string.withdraw_total)
         ui.effectiveAmountView.text = t.amountEffective.toString()
-        if (t.pending && t.withdrawalDetails is 
WithdrawalDetails.TalerBankIntegrationApi &&
-            !t.confirmed && t.withdrawalDetails.bankConfirmationUrl != null
-        ) {
-            val i = Intent(ACTION_VIEW).apply {
-                data = Uri.parse(t.withdrawalDetails.bankConfirmationUrl)
-            }
-            ui.confirmWithdrawalButton.setOnClickListener { 
startActivitySafe(i) }
-        } else if (t.pending && !t.confirmed && t.withdrawalDetails is 
WithdrawalDetails.ManualTransfer) {
-            
ui.confirmWithdrawalButton.setText(R.string.withdraw_manual_ready_details_intro)
-            ui.confirmWithdrawalButton.setOnClickListener {
-                val status = createManualTransferRequired(
-                    amount = t.amountRaw,
-                    exchangeBaseUrl = t.exchangeBaseUrl,
-                    // TODO what if there's more than one or no URI?
-                    uriStr = t.withdrawalDetails.exchangePaytoUris[0],
-                    transactionId = t.transactionId,
-                )
-                withdrawManager.viewManualWithdrawal(status)
-                
findNavController().navigate(R.id.action_nav_transactions_detail_withdrawal_to_nav_exchange_manual_withdrawal_success)
-            }
-        } else ui.confirmWithdrawalButton.visibility = View.GONE
+        setupConfirmWithdrawalButton(t)
         ui.chosenAmountLabel.text = getString(R.string.amount_chosen)
         ui.chosenAmountView.text =
             getString(R.string.amount_positive, t.amountRaw.toString())
         val fee = t.amountRaw - t.amountEffective
         ui.feeView.text = getString(R.string.amount_negative, fee.toString())
         ui.exchangeView.text = cleanExchange(t.exchangeBaseUrl)
+        if (t.pending) {
+            ui.deleteButton.setIconResource(R.drawable.ic_cancel)
+            ui.deleteButton.setText(R.string.cancel)
+        }
+        ui.deleteButton.setOnClickListener {
+            onDeleteButtonClicked(t)
+        }
+    }
+
+    override val deleteDialogTitle: Int
+        get() = if (transaction?.pending == true) R.string.cancel else 
super.deleteDialogTitle
+    override val deleteDialogMessage: Int
+        get() = if (transaction?.pending == true) 
R.string.transactions_cancel_dialog_message
+        else super.deleteDialogMessage
+    override val deleteDialogButton: Int
+        get() = if (transaction?.pending == true) R.string.ok else 
super.deleteDialogButton
+
+    private fun setupConfirmWithdrawalButton(t: TransactionWithdrawal) {
+        if (t.pending && !t.confirmed) {
+            if (t.withdrawalDetails is TalerBankIntegrationApi &&
+                t.withdrawalDetails.bankConfirmationUrl != null
+            ) {
+                val i = Intent(ACTION_VIEW).apply {
+                    data = Uri.parse(t.withdrawalDetails.bankConfirmationUrl)
+                }
+                ui.confirmWithdrawalButton.setOnClickListener { 
startActivitySafe(i) }
+            } else if (t.withdrawalDetails is ManualTransfer) {
+                
ui.confirmWithdrawalButton.setText(R.string.withdraw_manual_ready_details_intro)
+                ui.confirmWithdrawalButton.setOnClickListener {
+                    val status = createManualTransferRequired(
+                        amount = t.amountRaw,
+                        exchangeBaseUrl = t.exchangeBaseUrl,
+                        // TODO what if there's more than one or no URI?
+                        uriStr = t.withdrawalDetails.exchangePaytoUris[0],
+                        transactionId = t.transactionId,
+                    )
+                    withdrawManager.viewManualWithdrawal(status)
+                    findNavController().navigate(
+                        
R.id.action_nav_transactions_detail_withdrawal_to_nav_exchange_manual_withdrawal_success)
+                }
+            } else ui.confirmWithdrawalButton.visibility = View.GONE
+        } else ui.confirmWithdrawalButton.visibility = View.GONE
     }
 
 }
diff --git 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt
index ff2574f..fddaaec 100644
--- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt
@@ -25,8 +25,6 @@ import android.view.MenuItem
 import android.view.View
 import android.view.View.INVISIBLE
 import android.view.ViewGroup
-import android.widget.Toast
-import android.widget.Toast.LENGTH_LONG
 import androidx.appcompat.widget.SearchView
 import androidx.appcompat.widget.SearchView.OnQueryTextListener
 import androidx.fragment.app.Fragment
@@ -211,8 +209,9 @@ class TransactionsFragment : Fragment(), 
OnTransactionClickListener, ActionMode.
     override fun onActionItemClicked(mode: ActionMode, item: MenuItem): 
Boolean {
         when (item.itemId) {
             R.id.transaction_delete -> {
-                val s = "Not yet implemented. Pester Florian! ;)"
-                Toast.makeText(requireContext(), s, LENGTH_LONG).show()
+                tracker?.selection?.toList()?.let { transactionIds ->
+                    transactionManager.deleteTransactions(transactionIds)
+                }
                 mode.finish()
             }
             R.id.transaction_select_all -> transactionAdapter.selectAll()
diff --git a/wallet/src/main/res/layout/fragment_transaction_payment.xml 
b/wallet/src/main/res/layout/fragment_transaction_payment.xml
index 20ba161..32aa6ed 100644
--- a/wallet/src/main/res/layout/fragment_transaction_payment.xml
+++ b/wallet/src/main/res/layout/fragment_transaction_payment.xml
@@ -116,11 +116,23 @@
             style="@style/TransactionLabel"
             android:layout_marginBottom="16dp"
             android:text="@string/transaction_order_id"
-            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintBottom_toTopOf="@+id/deleteButton"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toBottomOf="@+id/orderSummaryView" />
 
+        <com.google.android.material.button.MaterialButton
+            android:id="@+id/deleteButton"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/transactions_delete"
+            app:backgroundTint="@color/red"
+            app:icon="@drawable/ic_delete"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/orderIdView" />
+
     </androidx.constraintlayout.widget.ConstraintLayout>
 
 </ScrollView>
diff --git a/wallet/src/main/res/layout/fragment_transaction_withdrawal.xml 
b/wallet/src/main/res/layout/fragment_transaction_withdrawal.xml
index 8fe3247..78d1667 100644
--- a/wallet/src/main/res/layout/fragment_transaction_withdrawal.xml
+++ b/wallet/src/main/res/layout/fragment_transaction_withdrawal.xml
@@ -117,12 +117,24 @@
         <TextView
             android:id="@+id/exchangeView"
             style="@style/TransactionContent"
-            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintBottom_toTopOf="@+id/deleteButton"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toBottomOf="@+id/exchangeLabel"
             tools:text="exchange.demo.taler.net" />
 
+        <com.google.android.material.button.MaterialButton
+            android:id="@+id/deleteButton"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/transactions_delete"
+            app:backgroundTint="@color/red"
+            app:icon="@drawable/ic_delete"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/exchangeView" />
+
     </androidx.constraintlayout.widget.ConstraintLayout>
 
 </ScrollView>
diff --git a/wallet/src/main/res/navigation/nav_graph.xml 
b/wallet/src/main/res/navigation/nav_graph.xml
index f0048d9..724fd93 100644
--- a/wallet/src/main/res/navigation/nav_graph.xml
+++ b/wallet/src/main/res/navigation/nav_graph.xml
@@ -25,18 +25,12 @@
         android:name="net.taler.wallet.MainFragment"
         android:label="@string/balances_title"
         tools:layout="@layout/fragment_balances">
-        <action
-            android:id="@+id/action_nav_main_to_promptPayment"
-            app:destination="@id/promptPayment" />
         <action
             android:id="@+id/action_nav_main_to_nav_transactions"
             app:destination="@id/nav_transactions" />
         <action
             android:id="@+id/action_nav_main_to_nav_uri_input"
             app:destination="@id/nav_uri_input" />
-        <action
-            android:id="@+id/action_nav_main_to_promptTip"
-            app:destination="@id/promptTip" />
     </fragment>
 
     <fragment
@@ -231,6 +225,10 @@
         android:id="@+id/action_global_promptPayment"
         app:destination="@id/promptPayment" />
 
+    <action
+        android:id="@+id/action_global_promptTip"
+        app:destination="@id/promptTip" />
+
     <action
         android:id="@+id/action_global_pending_operations"
         app:destination="@id/nav_pending_operations" />
diff --git a/wallet/src/main/res/values/strings.xml 
b/wallet/src/main/res/values/strings.xml
index efaa7dd..d1a0c78 100644
--- a/wallet/src/main/res/values/strings.xml
+++ b/wallet/src/main/res/values/strings.xml
@@ -77,6 +77,9 @@ GNU Taler is immune against many types of fraud, such as 
phishing of credit card
     <string name="transactions_detail_title_balance">Balance: %s</string>
     <string name="transactions_delete">Delete</string>
     <string name="transactions_select_all">Select All</string>
+    <string name="transactions_delete_dialog_title">Delete Transaction</string>
+    <string name="transactions_delete_dialog_message">Are you sure you want to 
remove this transaction from your wallet?</string>
+    <string name="transactions_cancel_dialog_message">Are you sure you want to 
cancel this withdrawal? Funds still in transit might get lost.</string>
 
     <!-- Transactions -->
     <string name="transaction_paid">Paid</string>

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

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