diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/addaccount/AddAccountActivity.kt b/app/src/main/java/gq/kirmanak/mealient/ui/addaccount/AddAccountActivity.kt new file mode 100644 index 0000000..c96b43b --- /dev/null +++ b/app/src/main/java/gq/kirmanak/mealient/ui/addaccount/AddAccountActivity.kt @@ -0,0 +1,19 @@ +package gq.kirmanak.mealient.ui.addaccount + +import android.os.Bundle +import android.os.PersistableBundle +import androidx.activity.viewModels +import androidx.appcompat.app.AppCompatActivity +import dagger.hilt.android.AndroidEntryPoint +import gq.kirmanak.mealient.R + +@AndroidEntryPoint +class AddAccountActivity : AppCompatActivity() { + + private val viewModel by viewModels() + + override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { + super.onCreate(savedInstanceState, persistentState) + supportActionBar?.title = getString(R.string.app_name) + } +} \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/addaccount/AddAccountFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/addaccount/AddAccountFragment.kt new file mode 100644 index 0000000..8509a2c --- /dev/null +++ b/app/src/main/java/gq/kirmanak/mealient/ui/addaccount/AddAccountFragment.kt @@ -0,0 +1,64 @@ +package gq.kirmanak.mealient.ui.addaccount + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels +import androidx.lifecycle.lifecycleScope +import by.kirich1409.viewbindingdelegate.viewBinding +import dagger.hilt.android.AndroidEntryPoint +import gq.kirmanak.mealient.R +import gq.kirmanak.mealient.data.network.NetworkError +import gq.kirmanak.mealient.databinding.FragmentAuthenticationBinding +import gq.kirmanak.mealient.extensions.checkIfInputIsEmpty +import kotlinx.coroutines.launch +import timber.log.Timber + +@AndroidEntryPoint +class AddAccountFragment : Fragment(R.layout.fragment_authentication) { + + private val binding by viewBinding(FragmentAuthenticationBinding::bind) + private val viewModel by activityViewModels() + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + Timber.v("onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState") + binding.button.setOnClickListener { onLoginClicked() } + } + + private fun onLoginClicked(): Unit = with(binding) { + Timber.v("onLoginClicked() called") + + val email: String = emailInput.checkIfInputIsEmpty( + inputLayout = emailInputLayout, + lifecycleOwner = viewLifecycleOwner, + stringId = R.string.fragment_authentication_email_input_empty, + ) ?: return + + val pass: String = passwordInput.checkIfInputIsEmpty( + inputLayout = passwordInputLayout, + lifecycleOwner = viewLifecycleOwner, + stringId = R.string.fragment_authentication_password_input_empty, + trim = false, + ) ?: return + + button.isClickable = false + viewLifecycleOwner.lifecycleScope.launch { + onAuthenticationResult(viewModel.authenticate(email, pass)) + } + } + + private fun onAuthenticationResult(result: Result) { + Timber.v("onAuthenticationResult() called with: result = $result") + if (result.isSuccess) { + TODO("Implement authentication success") + } + + binding.passwordInputLayout.error = when (result.exceptionOrNull()) { + is NetworkError.Unauthorized -> getString(R.string.fragment_authentication_credentials_incorrect) + else -> null + } + + binding.button.isClickable = true + } +} \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/addaccount/AddAccountViewModel.kt b/app/src/main/java/gq/kirmanak/mealient/ui/addaccount/AddAccountViewModel.kt new file mode 100644 index 0000000..8e87894 --- /dev/null +++ b/app/src/main/java/gq/kirmanak/mealient/ui/addaccount/AddAccountViewModel.kt @@ -0,0 +1,20 @@ +package gq.kirmanak.mealient.ui.addaccount + +import androidx.lifecycle.ViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import gq.kirmanak.mealient.data.auth.AuthRepo +import gq.kirmanak.mealient.extensions.runCatchingExceptCancel +import timber.log.Timber + +@HiltViewModel +class AddAccountViewModel( + private val authRepo: AuthRepo, +) : ViewModel() { + + suspend fun authenticate(username: String, password: String) = runCatchingExceptCancel { + Timber.v("authenticate() called with: username = $username, password = $password") + authRepo.authenticate(username, password) + }.onFailure { + Timber.e(it, "authenticate: can't authenticate") + } +} \ No newline at end of file