summaryrefslogtreecommitdiff
path: root/app/src/main
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2019-12-20 01:52:22 +0100
committerFlorian Dold <florian.dold@gmail.com>2019-12-20 01:52:22 +0100
commitab6effe9e2fb7fab1f310689ca5ae3ae7b7099ca (patch)
tree8b22d6a2092a4c637eba3f96e66399fb4ec8b264 /app/src/main
parent47b7eab07140dd20710e84b47b43da1de8123fb4 (diff)
downloadwallet-android-ab6effe9e2fb7fab1f310689ca5ae3ae7b7099ca.tar.gz
wallet-android-ab6effe9e2fb7fab1f310689ca5ae3ae7b7099ca.tar.bz2
wallet-android-ab6effe9e2fb7fab1f310689ca5ae3ae7b7099ca.zip
UI tweaks in progress
Diffstat (limited to 'app/src/main')
-rw-r--r--app/src/main/java/net/taler/wallet/PromptPayment.kt5
-rw-r--r--app/src/main/java/net/taler/wallet/Settings.kt50
-rw-r--r--app/src/main/java/net/taler/wallet/ShowBalance.kt81
-rw-r--r--app/src/main/java/net/taler/wallet/WalletViewModel.kt22
-rw-r--r--app/src/main/res/drawable/pending_border.xml21
-rw-r--r--app/src/main/res/layout/fragment_settings.xml33
-rw-r--r--app/src/main/res/layout/fragment_show_balance.xml6
-rw-r--r--app/src/main/res/layout/pending_row.xml42
8 files changed, 224 insertions, 36 deletions
diff --git a/app/src/main/java/net/taler/wallet/PromptPayment.kt b/app/src/main/java/net/taler/wallet/PromptPayment.kt
index 2714a7f..aa7512d 100644
--- a/app/src/main/java/net/taler/wallet/PromptPayment.kt
+++ b/app/src/main/java/net/taler/wallet/PromptPayment.kt
@@ -154,6 +154,11 @@ class PromptPayment : Fragment() {
errorTextView.visibility = View.GONE
abortPaymentButton.setOnClickListener {
+ when (val ps = model.payStatus.value) {
+ is PayStatus.Prepared -> {
+ model.abortProposal(ps.proposalId)
+ }
+ }
model.payStatus.value = PayStatus.None()
requireActivity().findNavController(R.id.nav_host_fragment).navigateUp()
}
diff --git a/app/src/main/java/net/taler/wallet/Settings.kt b/app/src/main/java/net/taler/wallet/Settings.kt
index ab3fec4..7087e78 100644
--- a/app/src/main/java/net/taler/wallet/Settings.kt
+++ b/app/src/main/java/net/taler/wallet/Settings.kt
@@ -19,7 +19,10 @@ package net.taler.wallet
import android.app.Dialog
import android.content.Context
import android.content.DialogInterface
+import android.content.Intent
import android.os.Bundle
+import android.provider.DocumentsContract
+import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
@@ -76,6 +79,25 @@ class ResetDialogFragment : DialogFragment() {
*/
class Settings : Fragment() {
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ when (requestCode) {
+ CREATE_FILE -> {
+ if (data == null) {
+ return
+ }
+ Log.i(TAG, "got createFile result with URL ${data.data}")
+ }
+ PICK_FILE -> {
+ if (data == null) {
+ return
+ }
+ Log.i(TAG, "got pickFile result with URL ${data.data}")
+ }
+ else -> {
+
+ }
+ }
+ }
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
@@ -87,6 +109,34 @@ class Settings : Fragment() {
val d = ResetDialogFragment()
d.show(requireActivity().supportFragmentManager, "walletResetDialog")
}
+ view.findViewById<Button>(R.id.button_backup_export).setOnClickListener {
+ val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
+ addCategory(Intent.CATEGORY_OPENABLE)
+ type = "application/json"
+ putExtra(Intent.EXTRA_TITLE, "taler-wallet-backup.json")
+
+ // Optionally, specify a URI for the directory that should be opened in
+ // the system file picker before your app creates the document.
+ //putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri)
+ }
+ startActivityForResult(intent, CREATE_FILE)
+ }
+ view.findViewById<Button>(R.id.button_backup_import).setOnClickListener {
+ val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
+ addCategory(Intent.CATEGORY_OPENABLE)
+ type = "application/json"
+
+ //putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri)
+ }
+
+ startActivityForResult(intent, PICK_FILE)
+ }
return view
}
+
+ companion object {
+ private const val TAG = "taler-wallet"
+ private const val CREATE_FILE = 1
+ private const val PICK_FILE = 2
+ }
}
diff --git a/app/src/main/java/net/taler/wallet/ShowBalance.kt b/app/src/main/java/net/taler/wallet/ShowBalance.kt
index f8faef9..c4c96d6 100644
--- a/app/src/main/java/net/taler/wallet/ShowBalance.kt
+++ b/app/src/main/java/net/taler/wallet/ShowBalance.kt
@@ -20,25 +20,30 @@ package net.taler.wallet
import android.os.Bundle
import android.util.Log
import android.view.*
-import androidx.fragment.app.Fragment
import android.widget.Button
+import android.widget.LinearLayout
import android.widget.TextView
+import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
+import com.google.android.material.snackbar.Snackbar
import com.google.zxing.integration.android.IntentIntegrator
import me.zhanghai.android.materialprogressbar.MaterialProgressBar
+import org.json.JSONObject
-class WalletBalanceAdapter(private var myDataset: WalletBalances) : RecyclerView.Adapter<WalletBalanceAdapter.MyViewHolder>() {
+class WalletBalanceAdapter(private var myDataset: WalletBalances, private var model: WalletViewModel) :
+ RecyclerView.Adapter<WalletBalanceAdapter.MyViewHolder>() {
init {
setHasStableIds(false)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
- val rowView = LayoutInflater.from(parent.context).inflate(R.layout.balance_row, parent, false)
+ val rowView =
+ LayoutInflater.from(parent.context).inflate(R.layout.balance_row, parent, false)
return MyViewHolder(rowView)
}
@@ -73,14 +78,23 @@ class WalletBalanceAdapter(private var myDataset: WalletBalances) : RecyclerView
class MyViewHolder(val rowView: View) : RecyclerView.ViewHolder(rowView)
}
-class PendingOperationsAdapter(private var myDataset: PendingOperations) : RecyclerView.Adapter<PendingOperationsAdapter.MyViewHolder>() {
+class PendingOperationsAdapter(private var myDataset: PendingOperations) :
+ RecyclerView.Adapter<PendingOperationsAdapter.MyViewHolder>() {
+
+ private var listener: PendingOperationClickListener? = null
+
init {
setHasStableIds(false)
}
+ fun setPendingOperationClickListener(listener: PendingOperationClickListener) {
+ this.listener = listener
+ }
+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
- val rowView = LayoutInflater.from(parent.context).inflate(R.layout.pending_row, parent, false)
+ val rowView =
+ LayoutInflater.from(parent.context).inflate(R.layout.pending_row, parent, false)
return MyViewHolder(rowView)
}
@@ -90,6 +104,26 @@ class PendingOperationsAdapter(private var myDataset: PendingOperations) : Recyc
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val p = myDataset.pending[position]
+ val pendingContainer = holder.rowView.findViewById<LinearLayout>(R.id.pending_container)
+ pendingContainer.setOnClickListener {
+ this.listener?.onPendingOperationClick(p.type, p.detail)
+ }
+ when (p.type) {
+ "proposal-choice" -> {
+ val btn1 = holder.rowView.findViewById<TextView>(R.id.button_pending_action_1)
+ btn1.text = "Refuse Proposal"
+ btn1.visibility = View.VISIBLE
+ btn1.setOnClickListener {
+ this.listener?.onPendingOperationActionClick(p.type, p.detail)
+ }
+ }
+ else -> {
+ val btn1 = holder.rowView.findViewById<TextView>(R.id.button_pending_action_1)
+ btn1.text = "(no action)"
+ btn1.visibility = View.GONE
+ btn1.setOnClickListener {}
+ }
+ }
val textView = holder.rowView.findViewById<TextView>(R.id.pending_text)
val subTextView = holder.rowView.findViewById<TextView>(R.id.pending_subtext)
subTextView.text = p.detail.toString(1)
@@ -104,12 +138,16 @@ class PendingOperationsAdapter(private var myDataset: PendingOperations) : Recyc
class MyViewHolder(val rowView: View) : RecyclerView.ViewHolder(rowView)
}
+interface PendingOperationClickListener {
+ fun onPendingOperationClick(type: String, detail: JSONObject)
+ fun onPendingOperationActionClick(type: String, detail: JSONObject)
+}
/**
* A simple [Fragment] subclass.
*
*/
-class ShowBalance : Fragment() {
+class ShowBalance : Fragment(), PendingOperationClickListener {
private lateinit var pendingOperationsLabel: View
lateinit var balancesView: RecyclerView
@@ -209,10 +247,9 @@ class ShowBalance : Fragment() {
this.balancesView = view.findViewById(R.id.list_balances)
this.balancesPlaceholderView = view.findViewById(R.id.list_balances_placeholder)
-
val balances = model.balances.value!!
- balancesAdapter = WalletBalanceAdapter(balances)
+ balancesAdapter = WalletBalanceAdapter(balances, model)
view.findViewById<RecyclerView>(R.id.list_balances).apply {
val myLayoutManager = LinearLayoutManager(context)
@@ -242,6 +279,7 @@ class ShowBalance : Fragment() {
})
pendingAdapter = PendingOperationsAdapter(PendingOperations(listOf()))
+ pendingAdapter.setPendingOperationClickListener(this)
this.pendingOperationsLabel = view.findViewById<View>(R.id.pending_operations_label)
@@ -259,4 +297,31 @@ class ShowBalance : Fragment() {
return view
}
+
+ override fun onPendingOperationClick(type: String, detail: JSONObject) {
+ val v = view ?: return
+ when (type) {
+ else -> {
+ val bar = Snackbar.make(
+ v,
+ "No detail view for ${type} implemented yet.",
+ Snackbar.LENGTH_SHORT
+ )
+ bar.show()
+ }
+ }
+ }
+
+ override fun onPendingOperationActionClick(type: String, detail: JSONObject) {
+ when (type) {
+ "proposal-choice" -> {
+ Log.v(TAG, "got action click on proposal-choice")
+ val proposalId = detail.optString("proposalId", "")
+ if (proposalId == "") {
+ return
+ }
+ model.abortProposal(proposalId)
+ }
+ }
+ }
}
diff --git a/app/src/main/java/net/taler/wallet/WalletViewModel.kt b/app/src/main/java/net/taler/wallet/WalletViewModel.kt
index e5e888d..b933bf1 100644
--- a/app/src/main/java/net/taler/wallet/WalletViewModel.kt
+++ b/app/src/main/java/net/taler/wallet/WalletViewModel.kt
@@ -275,8 +275,8 @@ class WalletViewModel(val app: Application) : AndroidViewModel(app) {
if (result.has("proposalId")) {
proposalId = result.getString("proposalId")
}
- if (result.has("contractTerms")) {
- val ctJson = result.getJSONObject("contractTerms")
+ if (result.has("contractTermsRaw")) {
+ val ctJson = JSONObject(result.getString("contractTermsRaw"))
val amount = Amount.fromString(ctJson.getString("amount"))
val summary = ctJson.getString("summary")
contractTerms = ContractTerms(summary, amount)
@@ -301,10 +301,22 @@ class WalletViewModel(val app: Application) : AndroidViewModel(app) {
}
}
- fun confirmPay(proposalId: String) {
- val msg = JSONObject()
- msg.put("operation", "confirmPay")
+ fun abortProposal(proposalId: String) {
+ val args = JSONObject()
+ args.put("proposalId", proposalId)
+ Log.i(TAG, "aborting proposal")
+
+ walletBackendApi.sendRequest("abortProposal", args) { isError, _ ->
+ if (isError) {
+ Log.e(TAG, "received error response to abortProposal")
+ return@sendRequest
+ }
+ payStatus.postValue(PayStatus.None())
+ }
+ }
+
+ fun confirmPay(proposalId: String) {
val args = JSONObject()
args.put("proposalId", proposalId)
diff --git a/app/src/main/res/drawable/pending_border.xml b/app/src/main/res/drawable/pending_border.xml
new file mode 100644
index 0000000..d003891
--- /dev/null
+++ b/app/src/main/res/drawable/pending_border.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle" >
+
+ <!-- View background color -->
+ <solid
+ android:color="@android:color/transparent" >
+ </solid>
+
+ <!-- View border color and width -->
+ <stroke
+ android:width="1dp"
+ android:color="@color/colorPrimary" >
+ </stroke>
+
+ <!-- The radius makes the corners rounded -->
+ <corners
+ android:radius="2dp" >
+ </corners>
+
+</shape> \ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml
index ed144e4..6873ff4 100644
--- a/app/src/main/res/layout/fragment_settings.xml
+++ b/app/src/main/res/layout/fragment_settings.xml
@@ -11,13 +11,14 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
- <EditText
+ <TextView
android:id="@+id/editText2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
- android:text="Version Information" />
+ android:text="Version Information"
+ android:textSize="18sp" />
<LinearLayout
@@ -63,14 +64,32 @@
</LinearLayout>
- <EditText
- android:id="@+id/editText"
+ <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
- android:inputType="textPersonName"
- android:text="Developer Settings (be careful!)" />
-
+ android:text="Backups"
+ android:textSize="18sp" />
+
+ <Button
+ android:text="Export wallet to file"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/button_backup_export"/>
+
+ <Button
+ android:text="Import from file"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/button_backup_import"/>
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:text="Developer Settings (be careful!)"
+ android:textSize="18sp" />
+
<Button
android:text="Withdraw TESTKUDOS"
android:layout_width="wrap_content"
diff --git a/app/src/main/res/layout/fragment_show_balance.xml b/app/src/main/res/layout/fragment_show_balance.xml
index a5fb26f..21a1fe9 100644
--- a/app/src/main/res/layout/fragment_show_balance.xml
+++ b/app/src/main/res/layout/fragment_show_balance.xml
@@ -33,6 +33,12 @@
<Space android:layout_width="match_parent" android:layout_height="20dp"/>
<Button
+ android:text="Withdraw TESTKUDOS"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/button_withdraw_testkudos"/>
+
+ <Button
android:text="Scan Taler QR Code"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
diff --git a/app/src/main/res/layout/pending_row.xml b/app/src/main/res/layout/pending_row.xml
index ec5aa2c..79d7250 100644
--- a/app/src/main/res/layout/pending_row.xml
+++ b/app/src/main/res/layout/pending_row.xml
@@ -1,22 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/pending_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_margin="3dp"
+ android:padding="3dp"
+ android:background="@drawable/pending_border"
+ android:orientation="vertical">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/pending_text"
- android:textSize="24sp" tools:text="My Pending Operation">
- </TextView>
+ <TextView
+ android:id="@+id/pending_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="24sp"
+ tools:text="My Pending Operation" />
- <TextView
- android:id="@+id/pending_subtext"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="14sp"
- tools:text="My further details" />
+ <Button
+ android:id="@+id/button_pending_action_1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ tools:text="Cancel Operation" />
+
+ <TextView
+ android:id="@+id/pending_subtext"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="14sp"
+ tools:text="My further details" />
</LinearLayout> \ No newline at end of file