gnunet-svn
[Top][All Lists]
Advanced

[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.



reply via email to

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