diff options
author | Florian Dold <florian.dold@gmail.com> | 2019-12-20 01:52:22 +0100 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2019-12-20 01:52:22 +0100 |
commit | ab6effe9e2fb7fab1f310689ca5ae3ae7b7099ca (patch) | |
tree | 8b22d6a2092a4c637eba3f96e66399fb4ec8b264 /app/src/main | |
parent | 47b7eab07140dd20710e84b47b43da1de8123fb4 (diff) | |
download | wallet-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.kt | 5 | ||||
-rw-r--r-- | app/src/main/java/net/taler/wallet/Settings.kt | 50 | ||||
-rw-r--r-- | app/src/main/java/net/taler/wallet/ShowBalance.kt | 81 | ||||
-rw-r--r-- | app/src/main/java/net/taler/wallet/WalletViewModel.kt | 22 | ||||
-rw-r--r-- | app/src/main/res/drawable/pending_border.xml | 21 | ||||
-rw-r--r-- | app/src/main/res/layout/fragment_settings.xml | 33 | ||||
-rw-r--r-- | app/src/main/res/layout/fragment_show_balance.xml | 6 | ||||
-rw-r--r-- | app/src/main/res/layout/pending_row.xml | 42 |
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 |