1
0
mirror of https://github.com/wulkanowy/wulkanowy.git synced 2024-09-20 01:29:09 -05:00

Display bad credentials error in the message box above login form (#1525)

This commit is contained in:
Mikołaj Pich 2021-09-24 21:02:51 +02:00 committed by GitHub
parent 6615e68430
commit a43ffcdef4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 126 additions and 59 deletions

View File

@ -166,7 +166,7 @@ ext {
}
dependencies {
implementation "io.github.wulkanowy:sdk:1.2.3"
implementation "io.github.wulkanowy:sdk:8f3721f1f9"
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'

View File

@ -103,9 +103,8 @@ class LoginActivity : BaseActivity<LoginPresenter, ActivityLoginBinding>(), Logi
}
override fun notifyInitSymbolFragment(loginData: Triple<String, String, String>) {
(loginAdapter.getFragmentInstance(1) as? LoginSymbolFragment)?.onParentInitSymbolFragment(
loginData
)
(loginAdapter.getFragmentInstance(1) as? LoginSymbolFragment)
?.onParentInitSymbolFragment(loginData)
}
override fun notifyInitStudentSelectFragment(studentsWithSemesters: List<StudentWithSemesters>) {

View File

@ -13,7 +13,7 @@ import javax.inject.Inject
class LoginErrorHandler @Inject constructor(resources: Resources) : ErrorHandler(resources) {
var onBadCredentials: () -> Unit = {}
var onBadCredentials: (String?) -> Unit = {}
var onInvalidToken: (String) -> Unit = {}
@ -25,7 +25,7 @@ class LoginErrorHandler @Inject constructor(resources: Resources) : ErrorHandler
override fun proceed(error: Throwable) {
when (error) {
is BadCredentialsException -> onBadCredentials()
is BadCredentialsException -> onBadCredentials(error.message)
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))

View File

@ -51,10 +51,12 @@ class LoginAdvancedFragment :
private lateinit var hostSymbols: Array<String>
override val formHostValue: String
get() = hostValues.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())).orEmpty()
get() = hostValues.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString()))
.orEmpty()
override val formHostSymbol: String
get() = hostSymbols.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())).orEmpty()
get() = hostSymbols.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString()))
.orEmpty()
override val formPinValue: String
get() = binding.loginFormPin.text.toString().trim()
@ -92,39 +94,62 @@ class LoginAdvancedFragment :
loginFormSignIn.setOnClickListener { presenter.onSignInClick() }
loginTypeSwitch.setOnCheckedChangeListener { _, checkedId ->
presenter.onLoginModeSelected(when (checkedId) {
R.id.loginTypeApi -> Sdk.Mode.API
R.id.loginTypeScrapper -> Sdk.Mode.SCRAPPER
else -> Sdk.Mode.HYBRID
})
presenter.onLoginModeSelected(
when (checkedId) {
R.id.loginTypeApi -> Sdk.Mode.API
R.id.loginTypeScrapper -> Sdk.Mode.SCRAPPER
else -> Sdk.Mode.HYBRID
}
)
}
loginFormPin.setOnEditorDoneSignIn { loginFormSignIn.callOnClick() }
loginFormPass.setOnEditorDoneSignIn { loginFormSignIn.callOnClick() }
loginFormSymbol.setAdapter(ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, resources.getStringArray(R.array.symbols_values)))
loginFormSymbol.setAdapter(
ArrayAdapter(
requireContext(),
android.R.layout.simple_list_item_1,
resources.getStringArray(R.array.symbols_values)
)
)
}
with(binding.loginFormHost) {
setText(hostKeys.getOrNull(0).orEmpty())
setAdapter(LoginSymbolAdapter(context, R.layout.support_simple_spinner_dropdown_item, hostKeys))
setAdapter(
LoginSymbolAdapter(
context,
R.layout.support_simple_spinner_dropdown_item,
hostKeys
)
)
setOnClickListener { if (binding.loginFormContainer.visibility == GONE) dismissDropDown() }
}
}
override fun showMobileApiWarningMessage() {
binding.loginFormAdvancedWarningInfo.text = getString(R.string.login_advanced_warning_mobile_api)
binding.loginFormAdvancedWarningInfo.text =
getString(R.string.login_advanced_warning_mobile_api)
}
override fun showScraperWarningMessage() {
binding.loginFormAdvancedWarningInfo.text = getString(R.string.login_advanced_warning_scraper)
binding.loginFormAdvancedWarningInfo.text =
getString(R.string.login_advanced_warning_scraper)
}
override fun showHybridWarningMessage() {
binding.loginFormAdvancedWarningInfo.text = getString(R.string.login_advanced_warning_hybrid)
binding.loginFormAdvancedWarningInfo.text =
getString(R.string.login_advanced_warning_hybrid)
}
override fun setDefaultCredentials(username: String, pass: String, symbol: String, token: String, pin: String) {
override fun setDefaultCredentials(
username: String,
pass: String,
symbol: String,
token: String,
pin: String
) {
with(binding) {
loginFormUsername.setText(username)
loginFormPass.setText(pass)
@ -177,10 +202,10 @@ class LoginAdvancedFragment :
}
}
override fun setErrorPassIncorrect() {
override fun setErrorPassIncorrect(message: String?) {
with(binding.loginFormPassLayout) {
requestFocus()
error = getString(R.string.login_incorrect_password)
error = message ?: getString(R.string.login_incorrect_password)
}
}
@ -296,11 +321,13 @@ class LoginAdvancedFragment :
}
override fun notifyParentAccountLogged(studentsWithSemesters: List<StudentWithSemesters>) {
(activity as? LoginActivity)?.onFormFragmentAccountLogged(studentsWithSemesters, Triple(
binding.loginFormUsername.text.toString(),
binding.loginFormPass.text.toString(),
resources.getStringArray(R.array.hosts_values)[1]
))
(activity as? LoginActivity)?.onFormFragmentAccountLogged(
studentsWithSemesters, Triple(
binding.loginFormUsername.text.toString(),
binding.loginFormPass.text.toString(),
resources.getStringArray(R.array.hosts_values)[1]
)
)
}
override fun onResume() {

View File

@ -34,9 +34,9 @@ class LoginAdvancedPresenter @Inject constructor(
}
}
private fun onBadCredentials() {
private fun onBadCredentials(message: String?) {
view?.run {
setErrorPassIncorrect()
setErrorPassIncorrect(message)
showSoftKeyboard()
Timber.i("Entered wrong username or password")
}

View File

@ -49,7 +49,7 @@ interface LoginAdvancedView : BaseView {
fun setErrorPassInvalid(focus: Boolean)
fun setErrorPassIncorrect()
fun setErrorPassIncorrect(message: String?)
fun clearUsernameError()

View File

@ -5,6 +5,7 @@ import android.os.Bundle
import android.view.View
import android.view.View.GONE
import android.view.View.VISIBLE
import androidx.core.view.isVisible
import androidx.core.widget.doOnTextChanged
import dagger.hilt.android.AndroidEntryPoint
import io.github.wulkanowy.R
@ -41,10 +42,12 @@ class LoginFormFragment : BaseFragment<FragmentLoginFormBinding>(R.layout.fragme
get() = binding.loginFormPass.text.toString()
override val formHostValue: String
get() = hostValues.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())).orEmpty()
get() = hostValues.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString()))
.orEmpty()
override val formHostSymbol: String
get() = hostSymbols.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())).orEmpty()
get() = hostSymbols.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString()))
.orEmpty()
override val nicknameLabel: String
get() = getString(R.string.login_nickname_hint)
@ -88,7 +91,13 @@ class LoginFormFragment : BaseFragment<FragmentLoginFormBinding>(R.layout.fragme
with(binding.loginFormHost) {
setText(hostKeys.getOrNull(0).orEmpty())
setAdapter(LoginSymbolAdapter(context, R.layout.support_simple_spinner_dropdown_item, hostKeys))
setAdapter(
LoginSymbolAdapter(
context,
R.layout.support_simple_spinner_dropdown_item,
hostKeys
)
)
setOnClickListener { if (binding.loginFormContainer.visibility == GONE) dismissDropDown() }
}
}
@ -142,24 +151,31 @@ class LoginFormFragment : BaseFragment<FragmentLoginFormBinding>(R.layout.fragme
}
}
override fun setErrorPassIncorrect() {
with(binding.loginFormPassLayout) {
error = getString(R.string.login_incorrect_password)
override fun setErrorPassIncorrect(message: String?) {
val error = message ?: getString(R.string.login_incorrect_password_default)
with(binding) {
loginFormUsernameLayout.error = " "
loginFormPassLayout.error = " "
loginFormErrorBox.text = getString(R.string.login_incorrect_password, error)
loginFormErrorBox.isVisible = true
}
}
override fun setErrorEmailInvalid(domain: String) {
with(binding.loginFormUsernameLayout) {
error = getString(R.string.login_invalid_custom_email,domain)
error = getString(R.string.login_invalid_custom_email, domain)
}
}
override fun clearUsernameError() {
binding.loginFormUsernameLayout.error = null
binding.loginFormErrorBox.isVisible = false
}
override fun clearPassError() {
binding.loginFormPassLayout.error = null
binding.loginFormErrorBox.isVisible = false
}
override fun showSoftKeyboard() {
@ -183,12 +199,18 @@ class LoginFormFragment : BaseFragment<FragmentLoginFormBinding>(R.layout.fragme
binding.loginFormVersion.text = "v${appInfo.versionName}"
}
override fun notifyParentAccountLogged(studentsWithSemesters: List<StudentWithSemesters>, loginData: Triple<String, String, String>) {
override fun notifyParentAccountLogged(
studentsWithSemesters: List<StudentWithSemesters>,
loginData: Triple<String, String, String>
) {
(activity as? LoginActivity)?.onFormFragmentAccountLogged(studentsWithSemesters, loginData)
}
override fun openPrivacyPolicyPage() {
context?.openInternetBrowser("https://wulkanowy.github.io/polityka-prywatnosci.html", ::showMessage)
context?.openInternetBrowser(
"https://wulkanowy.github.io/polityka-prywatnosci.html",
::showMessage
)
}
override fun showContact(show: Boolean) {
@ -210,7 +232,10 @@ class LoginFormFragment : BaseFragment<FragmentLoginFormBinding>(R.layout.fragme
}
override fun openFaqPage() {
context?.openInternetBrowser("https://wulkanowy.github.io/czesto-zadawane-pytania/dlaczego-nie-moge-sie-zalogowac", ::showMessage)
context?.openInternetBrowser(
"https://wulkanowy.github.io/czesto-zadawane-pytania/dlaczego-nie-moge-sie-zalogowac",
::showMessage
)
}
override fun onResume() {
@ -223,7 +248,8 @@ class LoginFormFragment : BaseFragment<FragmentLoginFormBinding>(R.layout.fragme
chooserTitle = requireContext().getString(R.string.login_email_intent_title),
email = "wulkanowyinc@gmail.com",
subject = requireContext().getString(R.string.login_email_subject),
body = requireContext().getString(R.string.login_email_text,
body = requireContext().getString(
R.string.login_email_text,
"${appInfo.systemManufacturer} ${appInfo.systemModel}",
appInfo.systemVersion.toString(),
appInfo.versionName,

View File

@ -30,7 +30,7 @@ class LoginFormPresenter @Inject constructor(
showVersion()
loginErrorHandler.onBadCredentials = {
setErrorPassIncorrect()
setErrorPassIncorrect(it)
showSoftKeyboard()
Timber.i("Entered wrong username or password")
}

View File

@ -37,7 +37,7 @@ interface LoginFormView : BaseView {
fun setErrorPassInvalid(focus: Boolean)
fun setErrorPassIncorrect()
fun setErrorPassIncorrect(message: String?)
fun setErrorEmailInvalid(domain: String)

View File

@ -110,10 +110,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginLeft="32dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="32dp"
android:layout_marginRight="32dp"
android:gravity="center_horizontal"
android:text="@string/login_header_default"
android:textSize="16sp"
@ -126,6 +124,20 @@
app:layout_constraintVertical_chainStyle="packed"
app:layout_goneMarginTop="64dp" />
<TextView
android:id="@+id/loginFormErrorBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="32dp"
android:textAppearance="?attr/textAppearanceCaption"
android:textColor="@color/mtrl_error"
android:textSize="14sp"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@id/loginFormHeader"
tools:text="Nazwa użytkownika lub hasło są niepoprawne albo hasło do konta wygasło"
tools:visibility="visible" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/loginFormUsernameLayout"
@ -134,15 +146,15 @@
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginLeft="24dp"
android:layout_marginTop="48dp"
android:layout_marginTop="28dp"
android:layout_marginEnd="24dp"
android:layout_marginRight="24dp"
android:hint="@string/login_nickname_hint"
app:errorEnabled="true"
app:layout_constraintBottom_toTopOf="@+id/loginFormPassLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/loginFormHeader">
app:layout_constraintTop_toBottomOf="@+id/loginFormErrorBox"
app:layout_goneMarginTop="48dp">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/loginFormUsername"
@ -170,7 +182,6 @@
android:hint="@string/login_password_hint"
app:errorEnabled="true"
app:errorIconDrawable="@null"
app:layout_constraintBottom_toTopOf="@+id/loginFormRecoverLink"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/loginFormUsernameLayout"
@ -200,7 +211,6 @@
android:textAppearance="?android:textAppearance"
app:backgroundTint="?android:windowBackground"
app:fontFamily="sans-serif-medium"
app:layout_constraintBottom_toTopOf="@id/loginFormHostLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/loginFormPassLayout"
tools:visibility="visible" />
@ -217,7 +227,6 @@
android:layout_marginRight="24dp"
android:hint="@string/login_host_hint"
android:orientation="vertical"
app:layout_constraintBottom_toTopOf="@+id/loginFormAdvancedButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/loginFormRecoverLink">
@ -262,14 +271,13 @@
android:id="@+id/loginFormPrivacyLink"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:gravity="start|center_vertical"
android:text="@string/login_privacy_policy"
android:textColor="?android:textColorSecondary"
android:textSize="12sp"
app:fontFamily="sans-serif-medium"
app:layout_constraintStart_toStartOf="@id/loginFormAdvancedButton"
app:layout_constraintTop_toBottomOf="@+id/loginFormAdvancedButton"
app:layout_constraintTop_toTopOf="@+id/loginFormVersion"
tools:visibility="visible" />
<TextView

View File

@ -42,7 +42,8 @@
<string name="login_symbol_hint">Symbol</string>
<string name="login_sign_in">Přihlásit</string>
<string name="login_invalid_password">Toto heslo je příliš krátké</string>
<string name="login_incorrect_password">Přihlašovací údaje jsou nesprávné. Ujistěte se, že je v poli níže vybrána správná variace deníku UONET+</string>
<string name="login_incorrect_password_default">Přihlašovací údaje jsou nesprávné</string>
<string name="login_incorrect_password">%1$s. Ujistěte se, že je v poli níže vybrána správná variace deníku UONET+</string>
<string name="login_invalid_pin">Neplatný PIN</string>
<string name="login_invalid_token">Neplatný token</string>
<string name="login_expired_token">Token vypršel</string>

View File

@ -42,7 +42,8 @@
<string name="login_symbol_hint">Symbol</string>
<string name="login_sign_in">Anmelden</string>
<string name="login_invalid_password">Passwort ist zu kurz</string>
<string name="login_incorrect_password">Anmeldedaten sind falsch. Stellen Sie sicher, dass die richtige UONET+ Registervariation im unteren Feld ausgewählt ist</string>
<string name="login_incorrect_password_default">Anmeldedaten sind falsch</string>
<string name="login_incorrect_password">%1$s. Stellen Sie sicher, dass die richtige UONET+ Registervariation im unteren Feld ausgewählt ist</string>
<string name="login_invalid_pin">Ungültige PIN</string>
<string name="login_invalid_token">Ungültige token</string>
<string name="login_expired_token">Token ist nicht mehr gültig</string>

View File

@ -42,7 +42,8 @@
<string name="login_symbol_hint">Symbol</string>
<string name="login_sign_in">Zaloguj</string>
<string name="login_invalid_password">To hasło jest za krótkie</string>
<string name="login_incorrect_password">Dane logowania są niepoprawne. Upewnij się, że została wybrana odpowiednia odmiana dziennika UONET+ w polu poniżej</string>
<string name="login_incorrect_password_default">Dane logowania są niepoprawne</string>
<string name="login_incorrect_password">%1$s. Upewnij się, że poniżej została wybrana odpowiednia odmiana dziennika UONET+</string>
<string name="login_invalid_pin">Nieprawidłowy PIN</string>
<string name="login_invalid_token">Nieprawidłowy token</string>
<string name="login_expired_token">Token stracił ważność</string>

View File

@ -42,7 +42,8 @@
<string name="login_symbol_hint">Symbol</string>
<string name="login_sign_in">Войти</string>
<string name="login_invalid_password">Слишком короткий пароль</string>
<string name="login_incorrect_password">Данные для входа неверны. Убедитесь, что в поле ниже выбран правильный вариант регистра UONET+</string>
<string name="login_incorrect_password_default">Данные для входа неверны</string>
<string name="login_incorrect_password">%1$s. Убедитесь, что в поле ниже выбран правильный вариант регистра UONET+</string>
<string name="login_invalid_pin">Неправильный PIN</string>
<string name="login_invalid_token">Неверный token</string>
<string name="login_expired_token">Token просрочен</string>

View File

@ -42,7 +42,8 @@
<string name="login_symbol_hint">Symbol</string>
<string name="login_sign_in">Prihlásiť</string>
<string name="login_invalid_password">Toto heslo je príliš krátke</string>
<string name="login_incorrect_password">Prihlasovacie údaje sú nesprávne. Uistite sa, že je v poli nižšie vybraná správna variácie denníka UONET+</string>
<string name="login_incorrect_password_default">Prihlasovacie údaje sú nesprávne</string>
<string name="login_incorrect_password">%1$s. Uistite sa, že je v poli nižšie vybraná správna variácie denníka UONET+</string>
<string name="login_invalid_pin">Neplatný PIN</string>
<string name="login_invalid_token">Neplatný token</string>
<string name="login_expired_token">Platnosť tokenu vypršala</string>

View File

@ -42,7 +42,8 @@
<string name="login_symbol_hint">Symbol</string>
<string name="login_sign_in">Увійти</string>
<string name="login_invalid_password">Занадто короткий пароль</string>
<string name="login_incorrect_password">Дані для входу неправильні. Переконайтеся, що у полі нижче вказано правильний варіант реєстрації UONET+</string>
<string name="login_incorrect_password_default">Дані для входу неправильні</string>
<string name="login_incorrect_password">%1$s. Переконайтеся, що у полі нижче вказано правильний варіант реєстрації UONET+</string>
<string name="login_invalid_pin">Неправильний PIN</string>
<string name="login_invalid_token">Неправильний token</string>
<string name="login_expired_token">Минув термін дії токену</string>

View File

@ -46,7 +46,8 @@
<string name="login_symbol_hint">Symbol</string>
<string name="login_sign_in">Sign in</string>
<string name="login_invalid_password">Password too short</string>
<string name="login_incorrect_password">Login details are incorrect. Make sure the correct UONET+ register variation is selected in the field below</string>
<string name="login_incorrect_password_default">Login details are incorrect</string>
<string name="login_incorrect_password">%1$s. Make sure the correct UONET+ register variation is selected below</string>
<string name="login_invalid_pin">Invalid PIN</string>
<string name="login_invalid_token">Invalid token</string>
<string name="login_expired_token">Token expired</string>