diff --git a/app/build.gradle b/app/build.gradle
index 01e60382e..f6c2f9ba5 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -122,7 +122,7 @@ configurations.all {
}
dependencies {
- implementation "io.github.wulkanowy:sdk:069677aa2089b5678adbcae79dc253220995f172"
+ implementation "io.github.wulkanowy:sdk:0886d71"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation "androidx.core:core-ktx:1.2.0-rc01"
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt
index c888ce79b..75a0ba6a6 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt
@@ -5,6 +5,10 @@ import android.database.sqlite.SQLiteConstraintException
import com.readystatesoftware.chuck.api.ChuckCollector
import io.github.wulkanowy.R
import io.github.wulkanowy.sdk.exception.BadCredentialsException
+import io.github.wulkanowy.sdk.mobile.exception.InvalidPinException
+import io.github.wulkanowy.sdk.mobile.exception.InvalidSymbolException
+import io.github.wulkanowy.sdk.mobile.exception.InvalidTokenException
+import io.github.wulkanowy.sdk.mobile.exception.TokenDeadException
import io.github.wulkanowy.ui.base.ErrorHandler
import javax.inject.Inject
@@ -15,12 +19,22 @@ class LoginErrorHandler @Inject constructor(
var onBadCredentials: () -> Unit = {}
+ var onInvalidToken: (String) -> Unit = {}
+
+ var onInvalidPin: (String) -> Unit = {}
+
+ var onInvalidSymbol: (String) -> Unit = {}
+
var onStudentDuplicate: (String) -> Unit = {}
override fun proceed(error: Throwable) {
when (error) {
is BadCredentialsException -> onBadCredentials()
is SQLiteConstraintException -> onStudentDuplicate(resources.getString(R.string.login_duplicate_student))
+ is TokenDeadException -> onInvalidToken(resources.getString(R.string.login_expired_token))
+ is InvalidTokenException -> onInvalidToken(resources.getString(R.string.login_invalid_token))
+ is InvalidPinException -> onInvalidPin(resources.getString(R.string.login_invalid_pin))
+ is InvalidSymbolException -> onInvalidSymbol(resources.getString(R.string.login_invalid_symbol))
else -> super.proceed(error)
}
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt
index 30563ebf4..353effa9b 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedFragment.kt
@@ -4,7 +4,9 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import android.view.inputmethod.EditorInfo
import android.widget.ArrayAdapter
+import androidx.appcompat.widget.AppCompatEditText
import androidx.core.widget.doOnTextChanged
import io.github.wulkanowy.R
import io.github.wulkanowy.data.db.entities.Student
@@ -84,6 +86,9 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView {
})
}
+ loginFormPin.setOnEditorDoneSignIn()
+ loginFormPass.setOnEditorDoneSignIn()
+
loginFormSymbol.setAdapter(ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, resources.getStringArray(R.array.symbols_values)))
with(loginFormHost) {
@@ -92,6 +97,12 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView {
}
}
+ private fun AppCompatEditText.setOnEditorDoneSignIn() {
+ setOnEditorActionListener { _, id, _ ->
+ if (id == EditorInfo.IME_ACTION_DONE || id == EditorInfo.IME_NULL) loginFormSignIn.callOnClick() else false
+ }
+ }
+
override fun setDefaultCredentials(name: String, pass: String, symbol: String, token: String, pin: String) {
loginFormName.setText(name)
loginFormPass.setText(pass)
@@ -101,54 +112,75 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView {
}
override fun setErrorNameRequired() {
- loginFormNameLayout.run {
+ with(loginFormNameLayout) {
requestFocus()
error = getString(R.string.login_field_required)
}
}
override fun setErrorPassRequired(focus: Boolean) {
- loginFormPassLayout.run {
+ with(loginFormPassLayout) {
if (focus) requestFocus()
error = getString(R.string.login_field_required)
}
}
override fun setErrorPassInvalid(focus: Boolean) {
- loginFormPassLayout.run {
+ with(loginFormPassLayout) {
if (focus) requestFocus()
error = getString(R.string.login_invalid_password)
}
}
override fun setErrorPassIncorrect() {
- loginFormPassLayout.run {
+ with(loginFormPassLayout) {
requestFocus()
error = getString(R.string.login_incorrect_password)
}
}
override fun setErrorPinRequired() {
- loginFormPinLayout.run {
+ with(loginFormPinLayout) {
requestFocus()
error = getString(R.string.login_field_required)
}
}
+ override fun setErrorPinInvalid(message: String) {
+ with(loginFormPinLayout) {
+ requestFocus()
+ error = message
+ }
+ }
+
override fun setErrorSymbolRequired() {
- loginFormSymbolLayout.run {
+ with(loginFormSymbolLayout) {
requestFocus()
error = getString(R.string.login_field_required)
}
}
+ override fun setErrorSymbolInvalid(message: String) {
+ with(loginFormSymbolLayout) {
+ requestFocus()
+ error = message
+ }
+ }
+
override fun setErrorTokenRequired() {
- loginFormTokenLayout.run {
+ with(loginFormTokenLayout) {
requestFocus()
error = getString(R.string.login_field_required)
}
}
+ override fun setErrorTokenInvalid(message: String) {
+ with(loginFormTokenLayout) {
+ requestFocus()
+ error = message
+ }
+ }
+
override fun clearNameError() {
loginFormNameLayout.error = null
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt
index 2cd788b03..1e49e5d8b 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedPresenter.kt
@@ -24,14 +24,47 @@ class LoginAdvancedPresenter @Inject constructor(
view.run {
initView()
showOnlyScrapperModeInputs()
- loginErrorHandler.onBadCredentials = {
- setErrorPassIncorrect()
- showSoftKeyboard()
- Timber.i("Entered wrong username or password")
+ with(loginErrorHandler) {
+ onBadCredentials = ::onBadCredentials
+ onInvalidToken = ::onInvalidToken
+ onInvalidSymbol = ::onInvalidSymbol
+ onInvalidPin = ::onInvalidPin
}
}
}
+ private fun onBadCredentials() {
+ view?.run {
+ setErrorPassIncorrect()
+ showSoftKeyboard()
+ Timber.i("Entered wrong username or password")
+ }
+ }
+
+ private fun onInvalidToken(message: String) {
+ view?.run {
+ setErrorTokenInvalid(message)
+ showSoftKeyboard()
+ Timber.i("Entered invalid token")
+ }
+ }
+
+ private fun onInvalidSymbol(message: String) {
+ view?.run {
+ setErrorSymbolInvalid(message)
+ showSoftKeyboard()
+ Timber.i("Entered invalid symbol")
+ }
+ }
+
+ private fun onInvalidPin(message: String) {
+ view?.run {
+ setErrorPinInvalid(message)
+ showSoftKeyboard()
+ Timber.i("Entered invalid PIN")
+ }
+ }
+
fun onHostSelected() {
view?.apply {
clearPassError()
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedView.kt
index ea48d6464..85a85a331 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedView.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/advanced/LoginAdvancedView.kt
@@ -53,10 +53,16 @@ interface LoginAdvancedView : BaseView {
fun setErrorPinRequired()
+ fun setErrorPinInvalid(message: String)
+
fun setErrorSymbolRequired()
+ fun setErrorSymbolInvalid(message: String)
+
fun setErrorTokenRequired()
+ fun setErrorTokenInvalid(message: String)
+
fun showOnlyHybridModeInputs()
fun showOnlyScrapperModeInputs()
diff --git a/app/src/main/res/layout/fragment_login_advanced.xml b/app/src/main/res/layout/fragment_login_advanced.xml
index 094e37d15..15e0904b6 100644
--- a/app/src/main/res/layout/fragment_login_advanced.xml
+++ b/app/src/main/res/layout/fragment_login_advanced.xml
@@ -188,8 +188,6 @@
android:id="@+id/loginFormToken"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:imeActionLabel="@string/login_sign_in"
- android:imeOptions="actionDone"
android:inputType="textCapCharacters"
android:maxLines="1" />
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index a88a42a79..dd61f7df4 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -36,6 +36,10 @@
Zaloguj
To hasło jest za krótkie
Dane logowania są niepoprawne
+ Nieprawidłowy PIN
+ Nieprawidłowy token
+ Token stracił ważność
+ Niepoprawny symbol
Nie znaleziono ucznia. Sprawdź symbol
To pole jest wymagane
Wybrany uczeń jest już zalogowany
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 439bf19d6..e260a4161 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -36,6 +36,10 @@
Sign in
This password is too short
Login details are incorrect
+ Invalid PIN
+ Invalid token
+ Token expired
+ Invalid symbol
Student not found. Check the symbol
This field is required
The selected student is already logged in