diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationFragment.kt index 5536b0b..584d62e 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationFragment.kt @@ -8,10 +8,11 @@ import android.widget.EditText import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.Observer -import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import com.google.android.material.textfield.TextInputLayout import dagger.hilt.android.AndroidEntryPoint +import gq.kirmanak.mealient.R +import gq.kirmanak.mealient.data.auth.impl.AuthenticationError.* import gq.kirmanak.mealient.databinding.FragmentAuthenticationBinding import timber.log.Timber @@ -59,30 +60,35 @@ class AuthenticationFragment : Fragment() { findNavController().navigate(AuthenticationFragmentDirections.actionAuthenticationFragmentToRecipesFragment()) } - private fun onLoginClicked() { + private fun onLoginClicked(): Unit = with(binding) { Timber.v("onLoginClicked() called") - val email: String - val pass: String - val url: String - with(binding) { - email = checkIfInputIsEmpty(emailInput, emailInputLayout) { - "Email is empty" - } ?: return - pass = checkIfInputIsEmpty(passwordInput, passwordInputLayout) { - "Pass is empty" - } ?: return - url = checkIfInputIsEmpty(urlInput, urlInputLayout) { - "URL is empty" - } ?: return - } - binding.button.isClickable = false - viewLifecycleOwner.lifecycleScope.launchWhenResumed { - runCatching { - viewModel.authenticate(email, pass, url) - }.onFailure { - Timber.e(it, "Can't authenticate") + + val email: String = checkIfInputIsEmpty(emailInput, emailInputLayout) { + getString(R.string.fragment_authentication_email_input_empty) + } ?: return + + val pass: String = checkIfInputIsEmpty(passwordInput, passwordInputLayout) { + getString(R.string.fragment_authentication_password_input_empty) + } ?: return + + val url: String = checkIfInputIsEmpty(urlInput, urlInputLayout) { + getString(R.string.fragment_authentication_url_input_empty) + } ?: return + + button.isClickable = false + viewModel.authenticate(email, pass, url).observe(viewLifecycleOwner) { + Timber.d("onLoginClicked: result $it") + passwordInputLayout.error = when (it.exceptionOrNull()) { + is Unauthorized -> getString(R.string.fragment_authentication_credentials_incorrect) + else -> null } - binding.button.isClickable = true + urlInputLayout.error = when (it.exceptionOrNull()) { + is NoServerConnection -> getString(R.string.fragment_authentication_no_connection) + is NotMealie -> getString(R.string.fragment_authentication_unexpected_response) + is Unauthorized, null -> null + else -> getString(R.string.fragment_authentication_unknown_error) + } + button.isClickable = true } } diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationViewModel.kt b/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationViewModel.kt index 9849100..9a846cd 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationViewModel.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationViewModel.kt @@ -1,9 +1,6 @@ package gq.kirmanak.mealient.ui.auth -import androidx.lifecycle.LiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.asLiveData -import androidx.lifecycle.viewModelScope +import androidx.lifecycle.* import dagger.hilt.android.lifecycle.HiltViewModel import gq.kirmanak.mealient.data.auth.AuthRepo import gq.kirmanak.mealient.data.recipes.RecipeRepo @@ -16,13 +13,22 @@ class AuthenticationViewModel @Inject constructor( private val authRepo: AuthRepo, private val recipeRepo: RecipeRepo ) : ViewModel() { - init { - Timber.v("constructor called") - } - suspend fun authenticate(username: String, password: String, baseUrl: String) { + fun authenticate(username: String, password: String, baseUrl: String): LiveData> { Timber.v("authenticate() called with: username = $username, password = $password, baseUrl = $baseUrl") - authRepo.authenticate(username, password, baseUrl) + val result = MutableLiveData>() + viewModelScope.launch { + runCatching { + authRepo.authenticate(username, password, baseUrl) + }.onFailure { + Timber.e(it, "authenticate: can't authenticate") + result.value = Result.failure(it) + }.onSuccess { + Timber.d("authenticate: authenticated") + result.value = Result.success(Unit) + } + } + return result } fun authenticationStatuses(): LiveData { diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c54f186..211f70a 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -14,4 +14,11 @@ Хорошо ДИСКЛЕЙМЕР Этот проект разрабатывается независимо от основного проекта Meale. Он не связан с разработчиками Mealie. О любых проблемах следует писать в репозиторий Mealient, НЕ в репозиторий Mealie. + E-mail не может быть пустым + Пароль не может быть пустым + URL не может быть пустым + E-mail или пароль не подходит. + Ошибка подключения, проверьте адрес. + Неожиданный ответ. Это Mealie? + Что-то пошло не так, попробуйте еще раз. \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fd7a1ed..40880ac 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -16,4 +16,11 @@ DISCLAIMER Okay Step: %d + E-mail can\'t be empty + Password can\'t be empty + URL can\'t be empty + E-mail or password is incorrect. + Can\'t connect, check address. + Unexpected response. Is it Mealie? + Something went wrong, please try again. \ No newline at end of file