mirror of
https://github.com/wulkanowy/wulkanowy.git
synced 2025-02-20 21:14:44 +01:00
Add separate host in login form to login to VULCAN adfslight (#704)
This commit is contained in:
parent
565114a2d2
commit
f294e3d57c
@ -29,7 +29,7 @@ class StudentRepository @Inject constructor(
|
||||
}
|
||||
}
|
||||
|
||||
fun getStudentsScrapper(email: String, password: String, endpoint: String, symbol: String = ""): Single<List<Student>> {
|
||||
fun getStudentsScrapper(email: String, password: String, endpoint: String, symbol: String): Single<List<Student>> {
|
||||
return ReactiveNetwork.checkInternetConnectivity(settings).flatMap {
|
||||
if (it) remote.getStudentsScrapper(email, password, endpoint, symbol)
|
||||
else Single.error(UnknownHostException("No internet connection"))
|
||||
|
@ -6,9 +6,7 @@ import android.view.View
|
||||
import android.view.View.GONE
|
||||
import android.view.View.VISIBLE
|
||||
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
|
||||
@ -17,6 +15,7 @@ import io.github.wulkanowy.ui.base.BaseFragment
|
||||
import io.github.wulkanowy.ui.modules.login.LoginActivity
|
||||
import io.github.wulkanowy.ui.modules.login.form.LoginSymbolAdapter
|
||||
import io.github.wulkanowy.utils.hideSoftInput
|
||||
import io.github.wulkanowy.utils.setOnEditorDoneSignIn
|
||||
import io.github.wulkanowy.utils.showSoftInput
|
||||
import kotlinx.android.synthetic.main.fragment_login_advanced.*
|
||||
import javax.inject.Inject
|
||||
@ -47,9 +46,14 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView {
|
||||
|
||||
private lateinit var hostValues: Array<String>
|
||||
|
||||
private lateinit var hostSymbols: Array<String>
|
||||
|
||||
override val formHostValue: String
|
||||
get() = hostValues.getOrNull(hostKeys.indexOf(loginFormHost.text.toString())).orEmpty()
|
||||
|
||||
override val formHostSymbol: String
|
||||
get() = hostSymbols.getOrNull(hostKeys.indexOf(loginFormHost.text.toString())).orEmpty()
|
||||
|
||||
override val formPinValue: String
|
||||
get() = loginFormPin.text.toString().trim()
|
||||
|
||||
@ -77,6 +81,7 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView {
|
||||
override fun initView() {
|
||||
hostKeys = resources.getStringArray(R.array.hosts_keys)
|
||||
hostValues = resources.getStringArray(R.array.hosts_values)
|
||||
hostSymbols = resources.getStringArray(R.array.hosts_symbols)
|
||||
|
||||
loginFormUsername.doOnTextChanged { _, _, _, _ -> presenter.onUsernameTextChanged() }
|
||||
loginFormPass.doOnTextChanged { _, _, _, _ -> presenter.onPassTextChanged() }
|
||||
@ -94,8 +99,8 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView {
|
||||
})
|
||||
}
|
||||
|
||||
loginFormPin.setOnEditorDoneSignIn()
|
||||
loginFormPass.setOnEditorDoneSignIn()
|
||||
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)))
|
||||
|
||||
@ -106,12 +111,6 @@ 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(username: String, pass: String, symbol: String, token: String, pin: String) {
|
||||
loginFormUsername.setText(username)
|
||||
loginFormPass.setText(pass)
|
||||
@ -124,6 +123,10 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView {
|
||||
loginFormUsernameLayout.hint = label
|
||||
}
|
||||
|
||||
override fun setSymbol(symbol: String) {
|
||||
loginFormSymbol.setText(symbol)
|
||||
}
|
||||
|
||||
override fun setErrorUsernameRequired() {
|
||||
with(loginFormUsernameLayout) {
|
||||
requestFocus()
|
||||
|
@ -78,6 +78,7 @@ class LoginAdvancedPresenter @Inject constructor(
|
||||
if (formHostValue.contains("fakelog")) {
|
||||
setDefaultCredentials("jan@fakelog.cf", "jan123", "powiatwulkanowy", "FK100000", "999999")
|
||||
}
|
||||
setSymbol(formHostSymbol)
|
||||
updateUsernameLabel()
|
||||
}
|
||||
}
|
||||
|
@ -11,6 +11,8 @@ interface LoginAdvancedView : BaseView {
|
||||
|
||||
val formHostValue: String
|
||||
|
||||
val formHostSymbol: String
|
||||
|
||||
val formLoginType: String
|
||||
|
||||
val formPinValue: String
|
||||
@ -29,6 +31,8 @@ interface LoginAdvancedView : BaseView {
|
||||
|
||||
fun setUsernameLabel(label: String)
|
||||
|
||||
fun setSymbol(symbol: String)
|
||||
|
||||
fun setErrorUsernameRequired()
|
||||
|
||||
fun setErrorPassRequired(focus: Boolean)
|
||||
|
@ -7,8 +7,7 @@ import android.view.View
|
||||
import android.view.View.GONE
|
||||
import android.view.View.VISIBLE
|
||||
import android.view.ViewGroup
|
||||
import android.view.inputmethod.EditorInfo.IME_ACTION_DONE
|
||||
import android.view.inputmethod.EditorInfo.IME_NULL
|
||||
import android.widget.ArrayAdapter
|
||||
import androidx.core.widget.doOnTextChanged
|
||||
import io.github.wulkanowy.R
|
||||
import io.github.wulkanowy.data.db.entities.Student
|
||||
@ -18,6 +17,7 @@ import io.github.wulkanowy.utils.AppInfo
|
||||
import io.github.wulkanowy.utils.hideSoftInput
|
||||
import io.github.wulkanowy.utils.openEmailClient
|
||||
import io.github.wulkanowy.utils.openInternetBrowser
|
||||
import io.github.wulkanowy.utils.setOnEditorDoneSignIn
|
||||
import io.github.wulkanowy.utils.showSoftInput
|
||||
import kotlinx.android.synthetic.main.fragment_login_form.*
|
||||
import javax.inject.Inject
|
||||
@ -43,6 +43,12 @@ class LoginFormFragment : BaseFragment(), LoginFormView {
|
||||
override val formHostValue: String
|
||||
get() = hostValues.getOrNull(hostKeys.indexOf(loginFormHost.text.toString())).orEmpty()
|
||||
|
||||
override val formHostSymbol: String
|
||||
get() = hostSymbols.getOrNull(hostKeys.indexOf(loginFormHost.text.toString())).orEmpty()
|
||||
|
||||
override val formSymbolValue: String
|
||||
get() = loginFormSymbol.text.toString()
|
||||
|
||||
override val nicknameLabel: String
|
||||
get() = getString(R.string.login_nickname_hint)
|
||||
|
||||
@ -53,6 +59,8 @@ class LoginFormFragment : BaseFragment(), LoginFormView {
|
||||
|
||||
private lateinit var hostValues: Array<String>
|
||||
|
||||
private lateinit var hostSymbols: Array<String>
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||
return inflater.inflate(R.layout.fragment_login_form, container, false)
|
||||
}
|
||||
@ -65,9 +73,11 @@ class LoginFormFragment : BaseFragment(), LoginFormView {
|
||||
override fun initView() {
|
||||
hostKeys = resources.getStringArray(R.array.hosts_keys)
|
||||
hostValues = resources.getStringArray(R.array.hosts_values)
|
||||
hostSymbols = resources.getStringArray(R.array.hosts_symbols)
|
||||
|
||||
loginFormUsername.doOnTextChanged { _, _, _, _ -> presenter.onUsernameTextChanged() }
|
||||
loginFormPass.doOnTextChanged { _, _, _, _ -> presenter.onPassTextChanged() }
|
||||
loginFormSymbol.doOnTextChanged { _, _, _, _ -> presenter.onSymbolTextChanged() }
|
||||
loginFormHost.setOnItemClickListener { _, _, _, _ -> presenter.onHostSelected() }
|
||||
loginFormSignIn.setOnClickListener { presenter.onSignInClick() }
|
||||
loginFormAdvancedButton.setOnClickListener { presenter.onAdvancedLoginClick() }
|
||||
@ -75,9 +85,10 @@ class LoginFormFragment : BaseFragment(), LoginFormView {
|
||||
loginFormFaq.setOnClickListener { presenter.onFaqClick() }
|
||||
loginFormContactEmail.setOnClickListener { presenter.onEmailClick() }
|
||||
loginFormRecoverLink.setOnClickListener { presenter.onRecoverClick() }
|
||||
loginFormPass.setOnEditorActionListener { _, id, _ ->
|
||||
if (id == IME_ACTION_DONE || id == IME_NULL) loginFormSignIn.callOnClick() else false
|
||||
}
|
||||
loginFormPass.setOnEditorDoneSignIn { loginFormSignIn.callOnClick() }
|
||||
loginFormSymbol.setOnEditorDoneSignIn { loginFormSignIn.callOnClick() }
|
||||
|
||||
loginFormSymbol.setAdapter(ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, resources.getStringArray(R.array.symbols_values)))
|
||||
|
||||
with(loginFormHost) {
|
||||
setText(hostKeys.getOrNull(0).orEmpty())
|
||||
@ -91,10 +102,18 @@ class LoginFormFragment : BaseFragment(), LoginFormView {
|
||||
loginFormPass.setText(pass)
|
||||
}
|
||||
|
||||
override fun setSymbol(symbol: String) {
|
||||
loginFormSymbol.setText(symbol)
|
||||
}
|
||||
|
||||
override fun setUsernameLabel(label: String) {
|
||||
loginFormUsernameLayout.hint = label
|
||||
}
|
||||
|
||||
override fun showSymbol(show: Boolean) {
|
||||
loginFormSymbolLayout.visibility = if (show) VISIBLE else GONE
|
||||
}
|
||||
|
||||
override fun setErrorUsernameRequired() {
|
||||
with(loginFormUsernameLayout) {
|
||||
requestFocus()
|
||||
@ -102,6 +121,13 @@ class LoginFormFragment : BaseFragment(), LoginFormView {
|
||||
}
|
||||
}
|
||||
|
||||
override fun setErrorSymbolRequired(focus: Boolean) {
|
||||
with(loginFormSymbolLayout) {
|
||||
if (focus) requestFocus()
|
||||
error = getString(R.string.login_field_required)
|
||||
}
|
||||
}
|
||||
|
||||
override fun setErrorPassRequired(focus: Boolean) {
|
||||
with(loginFormPassLayout) {
|
||||
if (focus) requestFocus()
|
||||
@ -131,6 +157,10 @@ class LoginFormFragment : BaseFragment(), LoginFormView {
|
||||
loginFormPassLayout.error = null
|
||||
}
|
||||
|
||||
override fun clearSymbolError() {
|
||||
loginFormSymbolLayout.error = null
|
||||
}
|
||||
|
||||
override fun showSoftKeyboard() {
|
||||
activity?.showSoftInput()
|
||||
}
|
||||
@ -183,7 +213,10 @@ class LoginFormFragment : BaseFragment(), LoginFormView {
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
presenter.updateUsernameLabel()
|
||||
with(presenter) {
|
||||
updateUsernameLabel()
|
||||
updateSymbolInputVisibility()
|
||||
}
|
||||
}
|
||||
|
||||
override fun openEmail() {
|
||||
|
@ -46,13 +46,21 @@ class LoginFormPresenter @Inject constructor(
|
||||
if (formHostValue.contains("fakelog")) {
|
||||
setCredentials("jan@fakelog.cf", "jan123")
|
||||
}
|
||||
setSymbol(formHostSymbol)
|
||||
updateUsernameLabel()
|
||||
updateSymbolInputVisibility()
|
||||
}
|
||||
}
|
||||
|
||||
fun updateUsernameLabel() {
|
||||
view?.apply {
|
||||
setUsernameLabel(if ("vulcan" in formHostValue || "fakelog" in formHostValue) emailLabel else nicknameLabel)
|
||||
view?.run {
|
||||
setUsernameLabel(if ("standard" in formHostValue) emailLabel else nicknameLabel)
|
||||
}
|
||||
}
|
||||
|
||||
fun updateSymbolInputVisibility() {
|
||||
view?.run {
|
||||
showSymbol("adfs" in formHostValue)
|
||||
}
|
||||
}
|
||||
|
||||
@ -64,14 +72,19 @@ class LoginFormPresenter @Inject constructor(
|
||||
view?.clearUsernameError()
|
||||
}
|
||||
|
||||
fun onSymbolTextChanged() {
|
||||
view?.clearSymbolError()
|
||||
}
|
||||
|
||||
fun onSignInClick() {
|
||||
val email = view?.formUsernameValue.orEmpty().trim()
|
||||
val password = view?.formPassValue.orEmpty().trim()
|
||||
val endpoint = view?.formHostValue.orEmpty().trim()
|
||||
val host = view?.formHostValue.orEmpty().trim()
|
||||
val symbol = view?.formSymbolValue.orEmpty().trim()
|
||||
|
||||
if (!validateCredentials(email, password)) return
|
||||
if (!validateCredentials(email, password, host, symbol)) return
|
||||
|
||||
disposable.add(studentRepository.getStudentsScrapper(email, password, endpoint)
|
||||
disposable.add(studentRepository.getStudentsScrapper(email, password, host, symbol)
|
||||
.subscribeOn(schedulers.backgroundThread)
|
||||
.observeOn(schedulers.mainThread)
|
||||
.doOnSubscribe {
|
||||
@ -90,11 +103,11 @@ class LoginFormPresenter @Inject constructor(
|
||||
}
|
||||
.subscribe({
|
||||
Timber.i("Login result: Success")
|
||||
analytics.logEvent("registration_form", "success" to true, "students" to it.size, "scrapperBaseUrl" to endpoint, "error" to "No error")
|
||||
view?.notifyParentAccountLogged(it, Triple(email, password, endpoint))
|
||||
analytics.logEvent("registration_form", "success" to true, "students" to it.size, "scrapperBaseUrl" to host, "error" to "No error")
|
||||
view?.notifyParentAccountLogged(it, Triple(email, password, host))
|
||||
}, {
|
||||
Timber.i("Login result: An exception occurred")
|
||||
analytics.logEvent("registration_form", "success" to false, "students" to -1, "scrapperBaseUrl" to endpoint, "error" to it.message.ifNullOrBlank { "No message" })
|
||||
analytics.logEvent("registration_form", "success" to false, "students" to -1, "scrapperBaseUrl" to host, "error" to it.message.ifNullOrBlank { "No message" })
|
||||
loginErrorHandler.dispatch(it)
|
||||
view?.showContact(true)
|
||||
}))
|
||||
@ -112,7 +125,7 @@ class LoginFormPresenter @Inject constructor(
|
||||
view?.onRecoverClick()
|
||||
}
|
||||
|
||||
private fun validateCredentials(login: String, password: String): Boolean {
|
||||
private fun validateCredentials(login: String, password: String, host: String, symbol: String): Boolean {
|
||||
var isCorrect = true
|
||||
|
||||
if (login.isEmpty()) {
|
||||
@ -129,6 +142,12 @@ class LoginFormPresenter @Inject constructor(
|
||||
view?.setErrorPassInvalid(focus = isCorrect)
|
||||
isCorrect = false
|
||||
}
|
||||
|
||||
if ("standard" !in host && symbol.isBlank()) {
|
||||
view?.setErrorSymbolRequired(focus = isCorrect)
|
||||
isCorrect = false
|
||||
}
|
||||
|
||||
return isCorrect
|
||||
}
|
||||
}
|
||||
|
@ -13,16 +13,26 @@ interface LoginFormView : BaseView {
|
||||
|
||||
val formHostValue: String
|
||||
|
||||
val formHostSymbol: String
|
||||
|
||||
val formSymbolValue: String
|
||||
|
||||
val nicknameLabel: String
|
||||
|
||||
val emailLabel: String
|
||||
|
||||
fun setCredentials(username: String, pass: String)
|
||||
|
||||
fun setSymbol(symbol: String)
|
||||
|
||||
fun setUsernameLabel(label: String)
|
||||
|
||||
fun showSymbol(show: Boolean)
|
||||
|
||||
fun setErrorUsernameRequired()
|
||||
|
||||
fun setErrorSymbolRequired(focus: Boolean)
|
||||
|
||||
fun setErrorPassRequired(focus: Boolean)
|
||||
|
||||
fun setErrorPassInvalid(focus: Boolean)
|
||||
@ -33,6 +43,8 @@ interface LoginFormView : BaseView {
|
||||
|
||||
fun clearPassError()
|
||||
|
||||
fun clearSymbolError()
|
||||
|
||||
fun showSoftKeyboard()
|
||||
|
||||
fun hideSoftKeyboard()
|
||||
|
@ -68,6 +68,7 @@ class LoginRecoverFragment : BaseFragment(), LoginRecoverView {
|
||||
hostValues = resources.getStringArray(R.array.hosts_values)
|
||||
|
||||
loginRecoverName.doOnTextChanged { _, _, _, _ -> presenter.onNameTextChanged() }
|
||||
loginRecoverSymbol.doOnTextChanged { _, _, _, _ -> presenter.onSymbolTextChanged() }
|
||||
loginRecoverHost.setOnItemClickListener { _, _, _, _ -> presenter.onHostSelected() }
|
||||
loginRecoverButton.setOnClickListener { presenter.onRecoverClick() }
|
||||
loginRecoverErrorRetry.setOnClickListener { presenter.onRecoverClick() }
|
||||
@ -83,9 +84,8 @@ class LoginRecoverFragment : BaseFragment(), LoginRecoverView {
|
||||
}
|
||||
}
|
||||
|
||||
override fun setDefaultCredentials(username: String, symbol: String) {
|
||||
override fun setDefaultCredentials(username: String) {
|
||||
loginRecoverName.setText(username)
|
||||
loginRecoverSymbol.setText(symbol)
|
||||
}
|
||||
|
||||
override fun setErrorNameRequired() {
|
||||
@ -106,10 +106,21 @@ class LoginRecoverFragment : BaseFragment(), LoginRecoverView {
|
||||
}
|
||||
}
|
||||
|
||||
override fun setSymbolError(focus: Boolean) {
|
||||
with(loginRecoverSymbolLayout) {
|
||||
if (focus) requestFocus()
|
||||
error = getString(R.string.login_field_required)
|
||||
}
|
||||
}
|
||||
|
||||
override fun clearUsernameError() {
|
||||
loginRecoverNameLayout.error = null
|
||||
}
|
||||
|
||||
override fun clearSymbolError() {
|
||||
loginRecoverSymbolLayout.error = null
|
||||
}
|
||||
|
||||
override fun showSymbol(show: Boolean) {
|
||||
loginRecoverSymbolLayout.visibility = if (show) VISIBLE else GONE
|
||||
}
|
||||
|
@ -34,9 +34,13 @@ class LoginRecoverPresenter @Inject constructor(
|
||||
view?.clearUsernameError()
|
||||
}
|
||||
|
||||
fun onSymbolTextChanged() {
|
||||
view?.clearSymbolError()
|
||||
}
|
||||
|
||||
fun onHostSelected() {
|
||||
view?.run {
|
||||
if ("fakelog" in recoverHostValue) setDefaultCredentials("jan@fakelog.cf", "Default")
|
||||
if ("fakelog" in recoverHostValue) setDefaultCredentials("jan@fakelog.cf")
|
||||
clearUsernameError()
|
||||
updateFields()
|
||||
}
|
||||
@ -44,32 +48,19 @@ class LoginRecoverPresenter @Inject constructor(
|
||||
|
||||
fun updateFields() {
|
||||
view?.run {
|
||||
if ("fakelog" in recoverHostValue || "vulcan" in recoverHostValue) {
|
||||
showSymbol(true)
|
||||
setUsernameHint(emailHintString)
|
||||
} else {
|
||||
showSymbol(false)
|
||||
setUsernameHint(loginPeselEmailHintString)
|
||||
}
|
||||
showSymbol("adfs" in recoverHostValue)
|
||||
setUsernameHint(if ("standard" in recoverHostValue) emailHintString else loginPeselEmailHintString)
|
||||
}
|
||||
}
|
||||
|
||||
fun onRecoverClick() {
|
||||
val username = view?.recoverNameValue.orEmpty()
|
||||
val host = view?.recoverHostValue.orEmpty()
|
||||
val symbol = view?.recoverSymbolValue.ifNullOrBlank { "Default" }
|
||||
val symbol = view?.recoverSymbolValue.orEmpty()
|
||||
|
||||
if (username.isEmpty()) {
|
||||
view?.setErrorNameRequired()
|
||||
return
|
||||
}
|
||||
if (!validateInput(username, host, symbol)) return
|
||||
|
||||
if (("fakelog" in host || "vulcan" in host) && "@" !in username) {
|
||||
view?.setUsernameError(view?.invalidEmailString.orEmpty())
|
||||
return
|
||||
}
|
||||
|
||||
disposable.add(recoverRepository.getReCaptchaSiteKey(host, symbol)
|
||||
disposable.add(recoverRepository.getReCaptchaSiteKey(host, symbol.ifBlank { "Default" })
|
||||
.subscribeOn(schedulers.backgroundThread)
|
||||
.observeOn(schedulers.mainThread)
|
||||
.doOnSubscribe {
|
||||
@ -89,6 +80,27 @@ class LoginRecoverPresenter @Inject constructor(
|
||||
})
|
||||
}
|
||||
|
||||
private fun validateInput(username: String, host: String, symbol: String): Boolean {
|
||||
var isCorrect = true
|
||||
|
||||
if (username.isEmpty()) {
|
||||
view?.setErrorNameRequired()
|
||||
isCorrect = false
|
||||
}
|
||||
|
||||
if ("standard" in host && "@" !in username) {
|
||||
view?.setUsernameError(view?.invalidEmailString.orEmpty())
|
||||
isCorrect = false
|
||||
}
|
||||
|
||||
if ("adfs" in host && symbol.isBlank()) {
|
||||
view?.setSymbolError(focus = isCorrect)
|
||||
isCorrect = false
|
||||
}
|
||||
|
||||
return isCorrect
|
||||
}
|
||||
|
||||
fun onReCaptchaVerified(reCaptchaResponse: String) {
|
||||
val username = view?.recoverNameValue.orEmpty()
|
||||
val host = view?.recoverHostValue.orEmpty()
|
||||
|
@ -18,10 +18,12 @@ interface LoginRecoverView : BaseView {
|
||||
|
||||
fun initView()
|
||||
|
||||
fun setDefaultCredentials(username: String, symbol: String)
|
||||
fun setDefaultCredentials(username: String)
|
||||
|
||||
fun clearUsernameError()
|
||||
|
||||
fun clearSymbolError()
|
||||
|
||||
fun showSymbol(show: Boolean)
|
||||
|
||||
fun setErrorNameRequired()
|
||||
@ -30,6 +32,8 @@ interface LoginRecoverView : BaseView {
|
||||
|
||||
fun setUsernameError(message: String)
|
||||
|
||||
fun setSymbolError(focus: Boolean)
|
||||
|
||||
fun showSoftKeyboard()
|
||||
|
||||
fun hideSoftKeyboard()
|
||||
|
@ -0,0 +1,10 @@
|
||||
package io.github.wulkanowy.utils
|
||||
|
||||
import android.view.inputmethod.EditorInfo
|
||||
import android.widget.EditText
|
||||
|
||||
fun EditText.setOnEditorDoneSignIn(callback: () -> Boolean) {
|
||||
setOnEditorActionListener { _, id, _ ->
|
||||
if (id == EditorInfo.IME_ACTION_DONE || id == EditorInfo.IME_NULL) callback() else false
|
||||
}
|
||||
}
|
@ -202,7 +202,7 @@
|
||||
android:layout_marginRight="24dp"
|
||||
android:hint="@string/login_host_hint"
|
||||
android:orientation="vertical"
|
||||
app:layout_constraintBottom_toTopOf="@+id/loginFormSignIn"
|
||||
app:layout_constraintBottom_toTopOf="@+id/loginFormSymbolLayout"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/loginFormRecoverLink">
|
||||
@ -215,6 +215,36 @@
|
||||
tools:ignore="Deprecated,LabelFor" />
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:id="@+id/loginFormSymbolLayout"
|
||||
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="24dp"
|
||||
android:layout_marginLeft="24dp"
|
||||
android:layout_marginTop="24dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:layout_marginRight="24dp"
|
||||
android:hint="@string/login_symbol_hint"
|
||||
app:errorEnabled="true"
|
||||
app:layout_constraintBottom_toTopOf="@+id/loginFormSignIn"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/loginFormHostLayout">
|
||||
|
||||
<AutoCompleteTextView
|
||||
android:id="@+id/loginFormSymbol"
|
||||
style="@style/Widget.MaterialComponents.TextInputEditText.OutlinedBox"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:imeActionLabel="@string/login_sign_in"
|
||||
android:imeOptions="actionDone"
|
||||
android:importantForAutofill="no"
|
||||
android:inputType="textAutoComplete|textNoSuggestions"
|
||||
android:maxLines="1"
|
||||
tools:ignore="LabelFor" />
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/loginFormAdvancedButton"
|
||||
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
|
||||
@ -229,7 +259,7 @@
|
||||
app:layout_constraintBottom_toBottomOf="@id/loginFormSignIn"
|
||||
app:layout_constraintEnd_toStartOf="@+id/loginFormSignIn"
|
||||
app:layout_constraintHorizontal_bias="0.0"
|
||||
app:layout_constraintStart_toStartOf="@id/loginFormHostLayout"
|
||||
app:layout_constraintStart_toStartOf="@id/loginFormSymbolLayout"
|
||||
app:layout_constraintTop_toTopOf="@+id/loginFormSignIn" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
@ -244,7 +274,7 @@
|
||||
android:text="@string/login_sign_in"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/loginFormHostLayout" />
|
||||
app:layout_constraintTop_toBottomOf="@+id/loginFormSymbolLayout" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/loginFormPrivacyLink"
|
||||
|
@ -20,7 +20,7 @@
|
||||
android:layout_height="match_parent"
|
||||
android:fillViewport="true"
|
||||
android:scrollbars="none"
|
||||
tools:visibility="invisible">
|
||||
tools:visibility="visible">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/loginRecoverFormContainer"
|
||||
@ -113,7 +113,7 @@
|
||||
android:layout_marginTop="24dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:layout_marginRight="24dp"
|
||||
android:hint="@string/login_symbol_hint_optional"
|
||||
android:hint="@string/login_symbol_hint"
|
||||
app:errorEnabled="true"
|
||||
app:layout_constraintBottom_toTopOf="@+id/loginRecoverButton"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
@ -220,7 +220,7 @@
|
||||
android:fillViewport="true"
|
||||
android:scrollbars="none"
|
||||
android:visibility="invisible"
|
||||
tools:visibility="visible">
|
||||
tools:visibility="invisible">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
|
@ -31,9 +31,8 @@
|
||||
<string name="login_email_hint">Email</string>
|
||||
<string name="login_login_pesel_email_hint">Login, PESEL lub e-mail</string>
|
||||
<string name="login_password_hint">Hasło</string>
|
||||
<string name="login_host_hint">Dziennik</string>
|
||||
<string name="login_host_hint">Dziennik UONET+</string>
|
||||
<string name="login_symbol_hint">Symbol</string>
|
||||
<string name="login_symbol_hint_optional">Symbol (opcjonalnie)</string>
|
||||
<string name="login_type_api">Mobilne API</string>
|
||||
<string name="login_type_scrapper">Scraper</string>
|
||||
<string name="login_type_hybrid">Hybrydowe</string>
|
||||
|
@ -32,7 +32,7 @@
|
||||
<string name="login_email_hint">Электронная почта</string>
|
||||
<string name="login_login_pesel_email_hint">Логин, PESEL или электронная почта</string>
|
||||
<string name="login_password_hint">Пароль</string>
|
||||
<string name="login_host_hint">Дневник</string>
|
||||
<string name="login_host_hint">Дневник UONET+</string>
|
||||
<string name="login_type_api">Мобильный API</string>
|
||||
<string name="login_type_scrapper">Scraper</string>
|
||||
<string name="login_type_hybrid">Гибрид</string>
|
||||
@ -40,7 +40,6 @@
|
||||
<string name="login_pin_hint">PIN</string>
|
||||
<string name="login_api_key_hint">клавиша API</string>
|
||||
<string name="login_symbol_hint">Symbol</string>
|
||||
<string name="login_symbol_hint_optional">Символ (необязательно)</string>
|
||||
<string name="login_sign_in">Войти</string>
|
||||
<string name="login_invalid_password">Слишком короткий пароль</string>
|
||||
<string name="login_incorrect_password">Указаны неверные данные</string>
|
||||
|
@ -1,7 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string-array name="hosts_keys">
|
||||
<item>Vulcan</item>
|
||||
<item>Vulcan - standardowy</item>
|
||||
<item>Vulcan - niestandardowy</item>
|
||||
<item>Opolska eSzkoła</item>
|
||||
<item>Gdańska Platforma Edukacyjna</item>
|
||||
<item>Lubelski Portal Oświatowy</item>
|
||||
@ -10,12 +11,23 @@
|
||||
<item>Fakelog</item>
|
||||
</string-array>
|
||||
<string-array name="hosts_values">
|
||||
<item>https://vulcan.net.pl</item>
|
||||
<item>https://vulcan.net.pl/?standard</item>
|
||||
<item>https://vulcan.net.pl/?adfs</item>
|
||||
<item>https://eszkola.opolskie.pl</item>
|
||||
<item>https://edu.gdansk.pl</item>
|
||||
<item>https://edu.lublin.eu</item>
|
||||
<item>https://umt.tarnow.pl</item>
|
||||
<item>https://resman.pl</item>
|
||||
<item>http://fakelog.cf</item>
|
||||
<item>http://fakelog.cf/?standard</item>
|
||||
</string-array>
|
||||
<string-array name="hosts_symbols">
|
||||
<item>Default</item>
|
||||
<item />
|
||||
<item>opole</item>
|
||||
<item>gdansk</item>
|
||||
<item>lublin</item>
|
||||
<item>tarnow</item>
|
||||
<item>rzeszow</item>
|
||||
<item>Default</item>
|
||||
</string-array>
|
||||
</resources>
|
||||
|
@ -32,7 +32,7 @@
|
||||
<string name="login_email_hint">Email</string>
|
||||
<string name="login_login_pesel_email_hint">Login, PESEL or e-mail</string>
|
||||
<string name="login_password_hint">Password</string>
|
||||
<string name="login_host_hint">Register</string>
|
||||
<string name="login_host_hint">UONET+ Register</string>
|
||||
<string name="login_type_api">Mobile API</string>
|
||||
<string name="login_type_scrapper">Scraper</string>
|
||||
<string name="login_type_hybrid">Hybrid</string>
|
||||
@ -40,7 +40,6 @@
|
||||
<string name="login_pin_hint">PIN</string>
|
||||
<string name="login_api_key_hint">API key</string>
|
||||
<string name="login_symbol_hint">Symbol</string>
|
||||
<string name="login_symbol_hint_optional">Symbol (optional)</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</string>
|
||||
|
@ -92,6 +92,8 @@ class LoginFormPresenterTest {
|
||||
`when`(loginFormView.formUsernameValue).thenReturn("@")
|
||||
`when`(loginFormView.formPassValue).thenReturn("123456")
|
||||
`when`(loginFormView.formHostValue).thenReturn("https://fakelog.cf")
|
||||
`when`(loginFormView.formSymbolValue).thenReturn("Default")
|
||||
`when`(loginFormView.formHostSymbol).thenReturn("Default")
|
||||
presenter.onSignInClick()
|
||||
|
||||
verify(loginFormView).hideSoftKeyboard()
|
||||
@ -108,6 +110,8 @@ class LoginFormPresenterTest {
|
||||
`when`(loginFormView.formUsernameValue).thenReturn("@")
|
||||
`when`(loginFormView.formPassValue).thenReturn("123456")
|
||||
`when`(loginFormView.formHostValue).thenReturn("https://fakelog.cf")
|
||||
`when`(loginFormView.formSymbolValue).thenReturn("Default")
|
||||
`when`(loginFormView.formHostSymbol).thenReturn("Default")
|
||||
presenter.onSignInClick()
|
||||
|
||||
verify(loginFormView).hideSoftKeyboard()
|
||||
@ -124,6 +128,8 @@ class LoginFormPresenterTest {
|
||||
`when`(loginFormView.formUsernameValue).thenReturn("@")
|
||||
`when`(loginFormView.formPassValue).thenReturn("123456")
|
||||
`when`(loginFormView.formHostValue).thenReturn("https://fakelog.cf")
|
||||
`when`(loginFormView.formSymbolValue).thenReturn("Default")
|
||||
`when`(loginFormView.formHostSymbol).thenReturn("Default")
|
||||
presenter.onSignInClick()
|
||||
presenter.onSignInClick()
|
||||
|
||||
@ -141,6 +147,8 @@ class LoginFormPresenterTest {
|
||||
`when`(loginFormView.formUsernameValue).thenReturn("@")
|
||||
`when`(loginFormView.formPassValue).thenReturn("123456")
|
||||
`when`(loginFormView.formHostValue).thenReturn("https://fakelog.cf")
|
||||
`when`(loginFormView.formSymbolValue).thenReturn("Default")
|
||||
`when`(loginFormView.formHostSymbol).thenReturn("Default")
|
||||
presenter.onSignInClick()
|
||||
|
||||
verify(loginFormView).hideSoftKeyboard()
|
||||
|
Loading…
x
Reference in New Issue
Block a user