[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-merchant-terminal-android] 11/19: Allow user to decide if they wa
From: |
gnunet |
Subject: |
[taler-merchant-terminal-android] 11/19: Allow user to decide if they want to save password, add FORGET option |
Date: |
Fri, 21 Feb 2020 19:00:04 +0100 |
This is an automated email from the git hooks/post-receive script.
torsten-grote pushed a commit to branch master
in repository merchant-terminal-android.
commit 94dd96d2481a87ce0fbad452d68afcdf0d87e067
Author: Torsten Grote <address@hidden>
AuthorDate: Mon Feb 3 13:40:33 2020 -0300
Allow user to decide if they want to save password, add FORGET option
---
.idea/codeStyles/Project.xml | 2 ++
.../java/net/taler/merchantpos/MainActivity.kt | 14 ++++++++++-
.../java/net/taler/merchantpos/MainViewModel.kt | 4 ----
.../net/taler/merchantpos/config/ConfigManager.kt | 20 ++++++++++++++--
.../net/taler/merchantpos/config/MerchantConfig.kt | 1 +
.../merchantpos/config/MerchantConfigFragment.kt | 18 ++++++++++++++-
.../net/taler/merchantpos/order/OrderFragment.kt | 8 +++++++
.../taler/merchantpos/payment/PaymentManager.kt | 4 ++++
.../merchantpos/payment/ProcessPaymentFragment.kt | 12 ++++------
app/src/main/res/layout/fragment_categories.xml | 2 ++
.../main/res/layout/fragment_merchant_settings.xml | 27 ++++++++++++++++++++--
app/src/main/res/values/strings.xml | 2 ++
12 files changed, 97 insertions(+), 17 deletions(-)
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index a88ded0..a705caf 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -4,6 +4,8 @@
<option name="ARRANGEMENT_SETTINGS_MIGRATED_TO_191" value="true" />
</AndroidXmlCodeStyleSettings>
<JetCodeStyleSettings>
+ <option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="2147483647" />
+ <option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS"
value="2147483647" />
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<codeStyleSettings language="XML">
diff --git a/app/src/main/java/net/taler/merchantpos/MainActivity.kt
b/app/src/main/java/net/taler/merchantpos/MainActivity.kt
index e26146d..6bbcea1 100644
--- a/app/src/main/java/net/taler/merchantpos/MainActivity.kt
+++ b/app/src/main/java/net/taler/merchantpos/MainActivity.kt
@@ -1,5 +1,9 @@
package net.taler.merchantpos
+import android.content.Intent
+import android.content.Intent.ACTION_MAIN
+import android.content.Intent.CATEGORY_HOME
+import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
import android.nfc.NfcAdapter
import android.os.Bundle
import android.view.MenuItem
@@ -16,6 +20,7 @@ import androidx.navigation.ui.setupWithNavController
import com.google.android.material.navigation.NavigationView
import
com.google.android.material.navigation.NavigationView.OnNavigationItemSelectedListener
+
class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener {
private val model: MainViewModel by viewModels()
@@ -58,7 +63,7 @@ class MainActivity : AppCompatActivity(),
OnNavigationItemSelectedListener {
override fun onStart() {
super.onStart()
- if (!model.configManager.config.isValid()) {
+ if (model.configManager.needsConfig()) {
nav.navigate(R.id.action_global_merchantSettings)
} else if (model.configManager.merchantConfig == null) {
nav.navigate(R.id.action_global_configFetcher)
@@ -91,6 +96,13 @@ class MainActivity : AppCompatActivity(),
OnNavigationItemSelectedListener {
override fun onBackPressed() {
if (drawerLayout.isDrawerOpen(START)) {
drawerLayout.closeDrawer(START)
+ } else if (nav.currentDestination?.id == R.id.merchantSettings &&
model.configManager.needsConfig()) {
+ // we are in the configuration screen and need a config to continue
+ val intent = Intent(ACTION_MAIN).apply {
+ addCategory(CATEGORY_HOME)
+ flags = FLAG_ACTIVITY_NEW_TASK
+ }
+ startActivity(intent)
} else {
super.onBackPressed()
}
diff --git a/app/src/main/java/net/taler/merchantpos/MainViewModel.kt
b/app/src/main/java/net/taler/merchantpos/MainViewModel.kt
index c14ab66..f4f792b 100644
--- a/app/src/main/java/net/taler/merchantpos/MainViewModel.kt
+++ b/app/src/main/java/net/taler/merchantpos/MainViewModel.kt
@@ -24,10 +24,6 @@ class MainViewModel(app: Application) :
AndroidViewModel(app) {
}
val paymentManager = PaymentManager(configManager, queue, mapper)
- @Deprecated("Use ConfigManager instead!",
ReplaceWith("configManager.merchantConfig"))
- val merchantConfig
- get() = configManager.merchantConfig
-
init {
if (configManager.merchantConfig == null &&
configManager.config.isValid()) {
configManager.fetchConfig(configManager.config, false)
diff --git a/app/src/main/java/net/taler/merchantpos/config/ConfigManager.kt
b/app/src/main/java/net/taler/merchantpos/config/ConfigManager.kt
index 5bc8e4b..9009466 100644
--- a/app/src/main/java/net/taler/merchantpos/config/ConfigManager.kt
+++ b/app/src/main/java/net/taler/merchantpos/config/ConfigManager.kt
@@ -60,10 +60,20 @@ class ConfigManager(
configurationReceivers.add(receiver)
}
+ /**
+ * Returns true if the user needs to provide more configuration
+ * and false if the configuration is sufficient to continue.
+ */
+ fun needsConfig(): Boolean {
+ return !config.isValid() || (!config.hasPassword() && merchantConfig
== null)
+ }
+
@UiThread
- fun fetchConfig(config: Config, save: Boolean) {
+ fun fetchConfig(config: Config, save: Boolean, savePassword: Boolean =
false) {
mConfigUpdateResult.value = null
- val configToSave = if (save) config else null
+ val configToSave = if (save) {
+ if (savePassword) config else config.copy(password = "")
+ } else null
val stringRequest = object : JsonObjectRequest(GET, config.configUrl,
null,
Listener { onConfigReceived(it, configToSave) },
@@ -120,6 +130,12 @@ class ConfigManager(
}
}
+ fun forgetPassword() {
+ config = config.copy(password = "")
+ saveConfig(config)
+ merchantConfig = null
+ }
+
private fun saveConfig(config: Config) {
prefs.edit()
.putString(SETTINGS_CONFIG_URL, config.configUrl)
diff --git a/app/src/main/java/net/taler/merchantpos/config/MerchantConfig.kt
b/app/src/main/java/net/taler/merchantpos/config/MerchantConfig.kt
index c237a24..634cc3e 100644
--- a/app/src/main/java/net/taler/merchantpos/config/MerchantConfig.kt
+++ b/app/src/main/java/net/taler/merchantpos/config/MerchantConfig.kt
@@ -9,6 +9,7 @@ data class Config(
val password: String
) {
fun isValid() = !configUrl.isBlank()
+ fun hasPassword() = !password.isBlank()
}
data class MerchantConfig(
diff --git
a/app/src/main/java/net/taler/merchantpos/config/MerchantConfigFragment.kt
b/app/src/main/java/net/taler/merchantpos/config/MerchantConfigFragment.kt
index 27e22ad..abe7d10 100644
--- a/app/src/main/java/net/taler/merchantpos/config/MerchantConfigFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/config/MerchantConfigFragment.kt
@@ -42,7 +42,7 @@ class MerchantConfigFragment : Fragment() {
username = usernameView.editText!!.text.toString(),
password = passwordView.editText!!.text.toString()
)
- configManager.fetchConfig(config, true)
+ configManager.fetchConfig(config, true,
savePasswordCheckBox.isChecked)
configManager.configUpdateResult.observe(viewLifecycleOwner,
Observer { result ->
when {
result == null -> return@Observer
@@ -52,14 +52,30 @@ class MerchantConfigFragment : Fragment() {
configManager.configUpdateResult.removeObservers(viewLifecycleOwner)
})
}
+ forgetPasswordButton.setOnClickListener {
+ configManager.forgetPassword()
+ passwordView.editText!!.text = null
+ forgetPasswordButton.visibility = GONE
+ currencyView.visibility = GONE
+ }
updateView()
}
+ override fun onStart() {
+ super.onStart()
+ // focus password if this is the only empty field
+ if (!configUrlView.editText!!.text.isBlank() &&
!usernameView.editText!!.text.isBlank()) {
+ passwordView.requestFocus()
+ }
+ }
+
private fun updateView() {
configUrlView.editText!!.setText(configManager.config.configUrl)
usernameView.editText!!.setText(configManager.config.username)
passwordView.editText!!.setText(configManager.config.password)
+ forgetPasswordButton.visibility = if
(configManager.config.hasPassword()) VISIBLE else GONE
+
val currency = configManager.merchantConfig?.currency
if (currency == null) {
currencyView.visibility = GONE
diff --git a/app/src/main/java/net/taler/merchantpos/order/OrderFragment.kt
b/app/src/main/java/net/taler/merchantpos/order/OrderFragment.kt
index 99f6c57..d42b149 100644
--- a/app/src/main/java/net/taler/merchantpos/order/OrderFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/OrderFragment.kt
@@ -9,6 +9,7 @@ import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Observer
import androidx.navigation.NavController
import androidx.navigation.Navigation.findNavController
+import androidx.navigation.fragment.findNavController
import kotlinx.android.synthetic.main.fragment_order.*
import net.taler.merchantpos.MainViewModel
import net.taler.merchantpos.R
@@ -57,4 +58,11 @@ class OrderFragment : Fragment() {
}
}
+ override fun onStart() {
+ super.onStart()
+ if (viewModel.configManager.needsConfig()) {
+ findNavController().navigate(R.id.action_global_merchantSettings)
+ }
+ }
+
}
diff --git a/app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt
b/app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt
index 3e6ee2c..a3645cc 100644
--- a/app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt
+++ b/app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt
@@ -123,6 +123,10 @@ class PaymentManager(
private fun onNetworkError(volleyError: VolleyError) {
Log.e(PaymentManager::class.java.simpleName, volleyError.toString())
+ cancelPayment()
+ }
+
+ fun cancelPayment() {
mPayment.value = mPayment.value!!.copy(error = true)
checkTimer.cancel()
}
diff --git
a/app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
b/app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
index 4a235da..ec83b2c 100644
--- a/app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
@@ -56,17 +56,15 @@ class ProcessPaymentFragment : Fragment() {
text_view_amount.text = "${payment.order.getTotalAsString()}
${payment.currency}"
text_view_order_reference.text = "Order Reference: ${payment.orderId}"
payment.talerPayUri?.let {
- val myBitmap = makeQrCode(it)
- qrcode.setImageBitmap(myBitmap)
+ val qrcodeBitmap = makeQrCode(it)
+ qrcode.setImageBitmap(qrcodeBitmap)
}
}
private fun onPaymentCancel() {
- val navController = findNavController()
- navController.popBackStack()
-
- val mySnackbar = Snackbar.make(view!!, "Payment Canceled",
LENGTH_SHORT)
- mySnackbar.show()
+ paymentManager.cancelPayment()
+ findNavController().popBackStack()
+ Snackbar.make(view!!, "Payment Canceled", LENGTH_SHORT).show()
}
private fun makeQrCode(text: String): Bitmap {
diff --git a/app/src/main/res/layout/fragment_categories.xml
b/app/src/main/res/layout/fragment_categories.xml
index dcd6bd5..431edd7 100644
--- a/app/src/main/res/layout/fragment_categories.xml
+++ b/app/src/main/res/layout/fragment_categories.xml
@@ -3,6 +3,8 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
xmlns:tools="http://schemas.android.com/tools"
+ android:layout_marginStart="8dp"
+ android:layout_marginEnd="8dp"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
diff --git a/app/src/main/res/layout/fragment_merchant_settings.xml
b/app/src/main/res/layout/fragment_merchant_settings.xml
index 6f1bcc9..93874b8 100644
--- a/app/src/main/res/layout/fragment_merchant_settings.xml
+++ b/app/src/main/res/layout/fragment_merchant_settings.xml
@@ -59,7 +59,7 @@
app:boxBackgroundColor="@android:color/transparent"
app:boxBackgroundMode="outline"
app:endIconMode="password_toggle"
- app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintEnd_toStartOf="@+id/forgetPasswordButton"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/usernameView">
@@ -70,6 +70,29 @@
</com.google.android.material.textfield.TextInputLayout>
+ <Button
+ android:id="@+id/forgetPasswordButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="16dp"
+ android:text="@string/config_forget_password"
+ android:visibility="gone"
+ app:layout_constraintBottom_toBottomOf="@+id/passwordView"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintTop_toTopOf="@+id/passwordView"
+ tools:visibility="visible" />
+
+ <CheckBox
+ android:id="@+id/savePasswordCheckBox"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_margin="16dp"
+ android:checked="true"
+ android:text="@string/config_save_password"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/passwordView" />
+
<TextView
android:id="@+id/currencyView"
android:layout_width="0dp"
@@ -79,7 +102,7 @@
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/passwordView"
+ app:layout_constraintTop_toBottomOf="@+id/savePasswordCheckBox"
tools:text="@string/config_currency"
tools:visibility="visible" />
diff --git a/app/src/main/res/values/strings.xml
b/app/src/main/res/values/strings.xml
index 8e5511e..98f2da4 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -34,5 +34,7 @@
<string name="config_auth_error">Invalid username or password</string>
<string name="config_error">Error: Invalid Configuration</string>
<string name="config_fetching">Fetching Configuration…</string>
+ <string name="config_save_password">Remember Password</string>
+ <string name="config_forget_password">Forget</string>
</resources>
--
To stop receiving notification emails like this one, please contact
address@hidden.
- [taler-merchant-terminal-android] 01/19: Upgrade libraries to latest stable versions, (continued)
- [taler-merchant-terminal-android] 01/19: Upgrade libraries to latest stable versions, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 05/19: Allow user to undo restarting the order, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 07/19: Add ordered products to order's contract terms, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 08/19: Use actual taler icon for the app, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 09/19: Factor out NFC code from MainActivity, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 06/19: Create payments directly from the order, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 04/19: Fetch merchant config from central configuration JSON, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 02/19: Add screen to process an order, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 18/19: Don't talk about NFC if it is not supported, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 14/19: Use product categories for order summary, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 11/19: Allow user to decide if they want to save password, add FORGET option,
gnunet <=
- [taler-merchant-terminal-android] 13/19: Make NFC and QR code re-useable in another app, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 15/19: Introduce different product classes for re-use in other taler apps, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 17/19: Make order sorting deterministic, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 12/19: Fix invalid product configuration, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 19/19: Check for duplicate product IDs, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 10/19: Require valid configuration before showing UI, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 16/19: Allow editing order with -1 and +1 buttons, gnunet, 2020/02/21