diff --git a/app/src/main/java/ru/myitschool/work/core/Constants.kt b/app/src/main/java/ru/myitschool/work/core/Constants.kt index fb4da22..2938c61 100644 --- a/app/src/main/java/ru/myitschool/work/core/Constants.kt +++ b/app/src/main/java/ru/myitschool/work/core/Constants.kt @@ -1,6 +1,6 @@ package ru.myitschool.work.core // БЕРИТЕ И ИЗМЕНЯЙТЕ ХОСТ ТОЛЬКО ЗДЕСЬ И НЕ БЕРИТЕ ИЗ ДРУГИХ МЕСТ. ФАЙЛ ПЕРЕМЕЩАТЬ НЕЛЬЗЯ object Constants { - const val SERVER_ADDRESS = "http://localhost:8090/api/" + const val SERVER_ADDRESS = "http://10.0.2.2:8090/api/" //const val SERVER_ADDRESS = "http://192.168.1.73:8080/api/" } diff --git a/app/src/main/java/ru/myitschool/work/di/AppModule.kt b/app/src/main/java/ru/myitschool/work/di/AppModule.kt index c1b73f0..407056b 100644 --- a/app/src/main/java/ru/myitschool/work/di/AppModule.kt +++ b/app/src/main/java/ru/myitschool/work/di/AppModule.kt @@ -37,11 +37,21 @@ object AppModule { @Singleton class DataStoreManager @Inject constructor(@ApplicationContext appContext: Context) { private val settingsDataStore = appContext.dataStore + private val lastUsernameKey = stringPreferencesKey("last_username") + + private val lastPasswordKey = stringPreferencesKey("last_password") + val lastUsername: Flow get() = settingsDataStore.data.map { it[lastUsernameKey].orEmpty() } + val lastPassword: Flow + get() = settingsDataStore.data.map { it[lastPasswordKey].orEmpty() } + suspend fun setLastUsername(username: String) = settingsDataStore.edit { it[lastUsernameKey] = username } + + suspend fun setLastPassword(username: String) = + settingsDataStore.edit { it[lastPasswordKey] = username } } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt b/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt index 2b80a9c..98a48fa 100644 --- a/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt @@ -27,12 +27,12 @@ class LoginFragment : Fragment(R.layout.fragment_login) { subscribe() viewModel.initialize() binding.login.setOnClickListener { - login(binding.username.text.toString()) + login(binding.username.text.toString(), binding.password.text.toString()) } } - private fun login(username: String) { - viewModel.tryLogin(username) { + private fun login(username: String, password : String) { + viewModel.tryLogin(username, password) { findNavController().apply { popBackStack(true) navigate(MainDestination(username)) @@ -51,8 +51,10 @@ class LoginFragment : Fragment(R.layout.fragment_login) { } } viewModel.savedUsername.collectWhenStarted(this) { username -> - if (!username.isNullOrBlank()) { - login(username) + viewModel.savedPassword.collectWhenStarted(this) { password -> + if (!username.isNullOrBlank() && !password.isNullOrBlank()) { + login(username, password) + } } } } diff --git a/app/src/main/java/ru/myitschool/work/ui/login/LoginState.kt b/app/src/main/java/ru/myitschool/work/ui/login/LoginState.kt index dfe01f4..ac6c69a 100644 --- a/app/src/main/java/ru/myitschool/work/ui/login/LoginState.kt +++ b/app/src/main/java/ru/myitschool/work/ui/login/LoginState.kt @@ -3,3 +3,7 @@ package ru.myitschool.work.ui.login data class LoginState( val isLoginEnabled: Boolean = false, val error: String? = null ) + +data class PasswordState( + val isPasswordEnabled: Boolean = false, val error: String? = null +) diff --git a/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt index ef72a3f..649efc8 100644 --- a/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt @@ -30,20 +30,31 @@ class LoginViewModel @Inject constructor( private val _savedUsername = MutableStateFlow(null) val savedUsername = _savedUsername.asStateFlow() + private val _stateP = MutableStateFlow(PasswordState()) + val stateP = _stateP.asStateFlow() + + private val _savedPassword = MutableStateFlow(null) + val savedPassword = _savedPassword.asStateFlow() + fun initialize() { viewModelScope.launch { dataStoreManager.lastUsername.distinctUntilChanged().collect { lastUsername -> - if (lastUsername.isNotEmpty()) { - _savedUsername.update { lastUsername } - } else { - _savedUsername.update { null } - _state.update { LoginState() } + dataStoreManager.lastPassword.distinctUntilChanged().collect { lastpassword -> + if (lastUsername.isNotEmpty() && lastpassword.isNotEmpty()) { + _savedUsername.update { lastUsername } + _savedPassword.update { lastpassword } + } else { + _savedUsername.update { null } + _savedPassword.update { null } + _state.update { LoginState() } + _stateP.update { PasswordState() } + } } } } } - fun tryLogin(username: String, onSuccess: () -> Unit) { + fun tryLogin(username: String, password : String, onSuccess: () -> Unit) { viewModelScope.launch { try { val resp = api.auth(username) @@ -52,6 +63,7 @@ class LoginViewModel @Inject constructor( } Log.d("LoginViewModel", "Login success for $username") dataStoreManager.setLastUsername(username) + dataStoreManager.setLastPassword(password) onSuccess() } catch (httpExc: HttpException) { Log.e("LoginViewModel", "Login failed for $username", httpExc) diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml index 667ae5e..3387fad 100644 --- a/app/src/main/res/layout/fragment_login.xml +++ b/app/src/main/res/layout/fragment_login.xml @@ -17,6 +17,17 @@ android:inputType="text" android:visibility="visible" /> + +