* Provide better error messages with stacktrace + clean up + fix error details popup in MediaInfoFragment * Simplify exception passing by sending complete exception to the dialog * Use viewLifecycleOwner with repeatOnLifecycle
93 lines
No EOL
3.1 KiB
Kotlin
93 lines
No EOL
3.1 KiB
Kotlin
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())
|
|
}
|
|
} |