package dev.jdtech.jellyfin.fragments import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.inputmethod.EditorInfo import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.navigation.fragment.findNavController import dagger.hilt.android.AndroidEntryPoint import dev.jdtech.jellyfin.databinding.FragmentLoginBinding import dev.jdtech.jellyfin.viewmodels.LoginViewModel import kotlinx.coroutines.launch import timber.log.Timber @AndroidEntryPoint class LoginFragment : Fragment() { private lateinit var binding: FragmentLoginBinding private val viewModel: LoginViewModel by viewModels() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentLoginBinding.inflate(inflater) binding.editTextPassword.setOnEditorActionListener { _, actionId, _ -> return@setOnEditorActionListener when (actionId) { EditorInfo.IME_ACTION_GO -> { login() true } else -> false } } binding.buttonLogin.setOnClickListener { login() } viewLifecycleOwner.lifecycleScope.launch { viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.onUiState(viewLifecycleOwner.lifecycleScope) { uiState -> Timber.d("$uiState") when(uiState) { is LoginViewModel.UiState.Normal -> bindUiStateNormal() is LoginViewModel.UiState.Error -> bindUiStateError(uiState) is LoginViewModel.UiState.Loading -> bindUiStateLoading() } } viewModel.onNavigateToMain(viewLifecycleOwner.lifecycleScope) { Timber.d("Navigate to MainActivity: $it") if (it) { navigateToMainActivity() } } } } return binding.root } private fun bindUiStateNormal() { binding.progressCircular.isVisible = false } private fun bindUiStateError(uiState: LoginViewModel.UiState.Error) { binding.progressCircular.isVisible = false binding.editTextUsernameLayout.error = uiState.message } private fun bindUiStateLoading() { binding.progressCircular.isVisible = true binding.editTextUsernameLayout.error = null } private fun login() { val username = binding.editTextUsername.text.toString() val password = binding.editTextPassword.text.toString() binding.progressCircular.visibility = View.VISIBLE viewModel.login(username, password) } private fun navigateToMainActivity() { findNavController().navigate(LoginFragmentDirections.actionLoginFragment2ToNavigationHome()) } }