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 e3bd895..47758e4 100644 --- a/app/src/main/java/ru/myitschool/work/core/Constants.kt +++ b/app/src/main/java/ru/myitschool/work/core/Constants.kt @@ -1,5 +1,5 @@ package ru.myitschool.work.core // БЕРИТЕ И ИЗМЕНЯЙТЕ ХОСТ ТОЛЬКО ЗДЕСЬ И НЕ БЕРИТЕ ИЗ ДРУГИХ МЕСТ. ФАЙЛ ПЕРЕМЕЩАТЬ НЕЛЬЗЯ object Constants { - const val SERVER_ADDRESS = "http://192.168.1.145:8080" + const val SERVER_ADDRESS = "http://10.6.66.78:8080" } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/data/deleteEmployee/DeleteEmployeeRepoImpl.kt b/app/src/main/java/ru/myitschool/work/data/deleteEmployee/DeleteEmployeeRepoImpl.kt index 3d633c8..b521d74 100644 --- a/app/src/main/java/ru/myitschool/work/data/deleteEmployee/DeleteEmployeeRepoImpl.kt +++ b/app/src/main/java/ru/myitschool/work/data/deleteEmployee/DeleteEmployeeRepoImpl.kt @@ -2,8 +2,10 @@ package ru.myitschool.work.data.deleteEmployee import ru.myitschool.work.domain.deleteEmployee.DeleteEmployeeRepo -class DeleteEmployeeRepoImpl : DeleteEmployeeRepo { +class DeleteEmployeeRepoImpl( + private val networkDataSource: DeleteEmployeeNetworkDataSource +) : DeleteEmployeeRepo { override suspend fun deleteEmployee(login: String): Result { - TODO("Not yet implemented") + return networkDataSource.deleteEmployee(login) } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/data/employeeList/EmployeeListNetworkDataSource.kt b/app/src/main/java/ru/myitschool/work/data/employeeList/EmployeeListNetworkDataSource.kt index 8d00f6e..5ae03a6 100644 --- a/app/src/main/java/ru/myitschool/work/data/employeeList/EmployeeListNetworkDataSource.kt +++ b/app/src/main/java/ru/myitschool/work/data/employeeList/EmployeeListNetworkDataSource.kt @@ -21,11 +21,11 @@ class EmployeeListNetworkDataSource( private val client = NetworkModule.httpClient private val userDataStoreManager = UserDataStoreManager.getInstance(context) - suspend fun getInfo():Result = withContext(Dispatchers.IO){ + suspend fun getList(pageNum: Int, pageSize: Int):Result = withContext(Dispatchers.IO){ runCatching { val username = userDataStoreManager.usernameFlow.first() val password = userDataStoreManager.passwordFlow.first() - val result = client.get("${Constants.SERVER_ADDRESS}/api/employee/all"){ + val result = client.get("${Constants.SERVER_ADDRESS}/api/employee/all?page=$pageNum&size=$pageSize"){ headers{ basicAuth(username, password) } diff --git a/app/src/main/java/ru/myitschool/work/data/employeeList/EmployeeListRepoImpl.kt b/app/src/main/java/ru/myitschool/work/data/employeeList/EmployeeListRepoImpl.kt index e2c5460..385421c 100644 --- a/app/src/main/java/ru/myitschool/work/data/employeeList/EmployeeListRepoImpl.kt +++ b/app/src/main/java/ru/myitschool/work/data/employeeList/EmployeeListRepoImpl.kt @@ -3,8 +3,25 @@ package ru.myitschool.work.data.employeeList import ru.myitschool.work.domain.employeeList.EmployeeListRepo import ru.myitschool.work.entities.EmployeeEntity -class EmployeeListRepoImpl : EmployeeListRepo { - override suspend fun getList(): Result> { - TODO("Not yet implemented") +class EmployeeListRepoImpl( + private val networkDataSource: EmployeeListNetworkDataSource +) : EmployeeListRepo { + override suspend fun getList( + pageNum: Int, + pageSize: Int + ): Result> { + return networkDataSource.getList(pageNum, pageSize ).map { pagingDTO-> + pagingDTO.content?.mapNotNull { dto -> + EmployeeEntity( + id = dto.id ?: return@mapNotNull null, + login = dto.login ?: return@mapNotNull null , + name = dto.name ?: return@mapNotNull null, + authority = dto.authority ?: return@mapNotNull null, + photoUrl = dto.photoUrl, + position = dto.position ?: return@mapNotNull null, + qrEnabled = dto.qrEnabled ?: false + ) + } ?: return Result.failure(IllegalStateException("List parse error")) + } + } } -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/data/entrance/allEntrances/AllEntranceListRepoImpl.kt b/app/src/main/java/ru/myitschool/work/data/entrance/allEntrances/AllEntranceListRepoImpl.kt index 0e6b65d..b18f115 100644 --- a/app/src/main/java/ru/myitschool/work/data/entrance/allEntrances/AllEntranceListRepoImpl.kt +++ b/app/src/main/java/ru/myitschool/work/data/entrance/allEntrances/AllEntranceListRepoImpl.kt @@ -16,7 +16,8 @@ class AllEntranceListRepoImpl( id = dto.id ?: return@mapNotNull null, scanTime = dto.scanTime ?: return@mapNotNull null, readerName = dto.readerName ?: return@mapNotNull null, - type = dto.type ?: return@mapNotNull null + type = dto.type ?: return@mapNotNull null, + entryType = dto.entryType ?: return@mapNotNull null, ) }?: return Result.failure(IllegalStateException("List parse error")) } diff --git a/app/src/main/java/ru/myitschool/work/data/entrance/employeeEntrances/EmployeeEntranceListRepoImpl.kt b/app/src/main/java/ru/myitschool/work/data/entrance/employeeEntrances/EmployeeEntranceListRepoImpl.kt index f6aa7fc..bfce476 100644 --- a/app/src/main/java/ru/myitschool/work/data/entrance/employeeEntrances/EmployeeEntranceListRepoImpl.kt +++ b/app/src/main/java/ru/myitschool/work/data/entrance/employeeEntrances/EmployeeEntranceListRepoImpl.kt @@ -14,6 +14,7 @@ class EmployeeEntranceListRepoImpl( scanTime = dto.scanTime ?: return@mapNotNull null, readerName = dto.readerName ?: return@mapNotNull null, type = dto.type ?: return@mapNotNull null, + entryType = dto.entryType ?: return@mapNotNull null ) }?: return Result.failure(IllegalStateException("List parse error")) } diff --git a/app/src/main/java/ru/myitschool/work/data/entrance/lastEntrance/LastEntranceNetworkDataSource.kt b/app/src/main/java/ru/myitschool/work/data/entrance/lastEntrance/LastEntranceNetworkDataSource.kt index ebedb68..6500ba5 100644 --- a/app/src/main/java/ru/myitschool/work/data/entrance/lastEntrance/LastEntranceNetworkDataSource.kt +++ b/app/src/main/java/ru/myitschool/work/data/entrance/lastEntrance/LastEntranceNetworkDataSource.kt @@ -3,8 +3,7 @@ package ru.myitschool.work.data.entrance.lastEntrance import android.content.Context import io.ktor.client.call.body import io.ktor.client.request.basicAuth -import io.ktor.client.request.post -import io.ktor.client.statement.bodyAsText +import io.ktor.client.request.get import io.ktor.http.HttpStatusCode import io.ktor.http.headers import kotlinx.coroutines.Dispatchers @@ -24,7 +23,7 @@ class LastEntranceNetworkDataSource( runCatching { val username = userDataStoreManager.usernameFlow.first() val password = userDataStoreManager.passwordFlow.first() - val result = client.post("${Constants.SERVER_ADDRESS}/api/entrance/last"){ + val result = client.get("${Constants.SERVER_ADDRESS}/api/entrance/last"){ headers{ basicAuth(username, password) } @@ -32,7 +31,6 @@ class LastEntranceNetworkDataSource( if (result.status != HttpStatusCode.OK) { error("Status ${result.status}") } - println(result.bodyAsText()) result.body() } } diff --git a/app/src/main/java/ru/myitschool/work/data/entrance/lastEntrance/LastEntranceRepoImpl.kt b/app/src/main/java/ru/myitschool/work/data/entrance/lastEntrance/LastEntranceRepoImpl.kt index 451bd79..73537f0 100644 --- a/app/src/main/java/ru/myitschool/work/data/entrance/lastEntrance/LastEntranceRepoImpl.kt +++ b/app/src/main/java/ru/myitschool/work/data/entrance/lastEntrance/LastEntranceRepoImpl.kt @@ -12,7 +12,8 @@ class LastEntranceRepoImpl( id = dto.id ?: 0, scanTime = dto.scanTime, readerName = dto.readerName ?: "", - type = dto.type ?: "" + type = dto.type ?: "", + entryType = dto.entryType ) } } diff --git a/app/src/main/java/ru/myitschool/work/data/login/LoginNetworkDataSource.kt b/app/src/main/java/ru/myitschool/work/data/login/LoginNetworkDataSource.kt index a2b92f2..42cf0da 100644 --- a/app/src/main/java/ru/myitschool/work/data/login/LoginNetworkDataSource.kt +++ b/app/src/main/java/ru/myitschool/work/data/login/LoginNetworkDataSource.kt @@ -1,5 +1,6 @@ package ru.myitschool.work.data.login +import android.content.Context import io.ktor.client.call.body import io.ktor.client.request.basicAuth import io.ktor.client.request.post @@ -8,10 +9,13 @@ import io.ktor.http.HttpStatusCode import io.ktor.http.headers import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import ru.myitschool.work.R import ru.myitschool.work.core.Constants import ru.myitschool.work.utils.NetworkModule -class LoginNetworkDataSource { +class LoginNetworkDataSource( + private val context: Context +) { private val client = NetworkModule.httpClient suspend fun login(username: String, password: String):Result = withContext(Dispatchers.IO){ runCatching { @@ -21,7 +25,10 @@ class LoginNetworkDataSource { basicAuth(username, password) } } - if (result.status != HttpStatusCode.OK) { + if(result.status == HttpStatusCode.Unauthorized){ + error(context.getString(R.string.login_unauthorized)) + } + else if (result.status != HttpStatusCode.OK) { error("Status ${result.status}") } println(result.bodyAsText()) diff --git a/app/src/main/java/ru/myitschool/work/domain/employeeList/EmployeeListRepo.kt b/app/src/main/java/ru/myitschool/work/domain/employeeList/EmployeeListRepo.kt index b9f114e..803927a 100644 --- a/app/src/main/java/ru/myitschool/work/domain/employeeList/EmployeeListRepo.kt +++ b/app/src/main/java/ru/myitschool/work/domain/employeeList/EmployeeListRepo.kt @@ -3,5 +3,7 @@ package ru.myitschool.work.domain.employeeList import ru.myitschool.work.entities.EmployeeEntity interface EmployeeListRepo { - suspend fun getList() : Result> + suspend fun getList( + pageNum: Int, + pageSize: Int ) : Result> } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/employeeList/GetEmployeeListUseCase.kt b/app/src/main/java/ru/myitschool/work/domain/employeeList/GetEmployeeListUseCase.kt index 35bd974..6ab4805 100644 --- a/app/src/main/java/ru/myitschool/work/domain/employeeList/GetEmployeeListUseCase.kt +++ b/app/src/main/java/ru/myitschool/work/domain/employeeList/GetEmployeeListUseCase.kt @@ -3,5 +3,5 @@ package ru.myitschool.work.domain.employeeList class GetEmployeeListUseCase( private val repo: EmployeeListRepo ) { - suspend operator fun invoke() = repo.getList() + suspend operator fun invoke(pageNum: Int, pageSize: Int) = repo.getList(pageNum, pageSize) } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/dto/EmployeeEntranceDTO.kt b/app/src/main/java/ru/myitschool/work/dto/EmployeeEntranceDTO.kt index 53376ac..10c8aa1 100644 --- a/app/src/main/java/ru/myitschool/work/dto/EmployeeEntranceDTO.kt +++ b/app/src/main/java/ru/myitschool/work/dto/EmployeeEntranceDTO.kt @@ -10,5 +10,6 @@ data class EmployeeEntranceDTO( @SerialName("id") val id : Int?, @SerialName("entryTime") @Serializable(with = DateSerializer::class) val scanTime : Date?, @SerialName("readerName") val readerName: String?, - @SerialName("type") val type: String? + @SerialName("type") val type: String?, + @SerialName("entryType") val entryType: String? ) diff --git a/app/src/main/java/ru/myitschool/work/entities/EmployeeEntranceEntity.kt b/app/src/main/java/ru/myitschool/work/entities/EmployeeEntranceEntity.kt index 6231944..7b2fb22 100644 --- a/app/src/main/java/ru/myitschool/work/entities/EmployeeEntranceEntity.kt +++ b/app/src/main/java/ru/myitschool/work/entities/EmployeeEntranceEntity.kt @@ -2,8 +2,9 @@ package ru.myitschool.work.entities import java.util.Date data class EmployeeEntranceEntity( - val id : Int, + val id : Int?, val scanTime : Date?, - val readerName: String, - val type: String + val readerName: String?, + val type: String?, + val entryType: String? ) 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 89b273a..ad3ba5c 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 @@ -49,8 +49,10 @@ class LoginFragment : Fragment(R.layout.fragment_login) { when(state){ is LoginViewModel.State.Error -> { error.visibility = View.VISIBLE + error.text = state.message loading.visibility = View.GONE username.isEnabled = true + } is LoginViewModel.State.Idle -> { loading.visibility = View.GONE 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 75a34cc..eb4b477 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 @@ -31,7 +31,6 @@ class LoginViewModel( if(username != "" && password != "") login(username, password) } - } sealed class State { @@ -63,7 +62,9 @@ class LoginViewModel( val Factory: ViewModelProvider.Factory = object : ViewModelProvider.Factory { override fun create(modelClass: Class, extras: CreationExtras): T { val repoImpl = LoginRepoImpl( - networkDataSource = LoginNetworkDataSource() + networkDataSource = LoginNetworkDataSource( + context = extras[ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY] as Application + ) ) val useCase = LoginUseCase(repoImpl) diff --git a/app/src/main/java/ru/myitschool/work/ui/main/EmployeeEntranceListAdapter.kt b/app/src/main/java/ru/myitschool/work/ui/main/EmployeeEntranceListAdapter.kt index 0f1e3c5..3ad066b 100644 --- a/app/src/main/java/ru/myitschool/work/ui/main/EmployeeEntranceListAdapter.kt +++ b/app/src/main/java/ru/myitschool/work/ui/main/EmployeeEntranceListAdapter.kt @@ -4,9 +4,11 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.paging.PagingDataAdapter import androidx.recyclerview.widget.RecyclerView +import ru.myitschool.work.R import ru.myitschool.work.databinding.ItemVisitBinding import ru.myitschool.work.entities.EmployeeEntranceEntity -import ru.myitschool.work.utils.dateConverter +import ru.myitschool.work.utils.monthConverter +import ru.myitschool.work.utils.timeConverter class EmployeeEntranceListAdapter : PagingDataAdapter(DiffUtil) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) : ViewHolder{ @@ -27,14 +29,23 @@ class EmployeeEntranceListAdapter : PagingDataAdapter() { override fun areItemsTheSame(oldItem: EmployeeEntranceEntity, newItem: EmployeeEntranceEntity): Boolean { - return oldItem.scanTime == newItem.scanTime + return oldItem.id == newItem.id } override fun areContentsTheSame(oldItem: EmployeeEntranceEntity, newItem: EmployeeEntranceEntity): Boolean { return oldItem == newItem diff --git a/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt b/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt index 80ed4c3..b18895f 100644 --- a/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt @@ -20,6 +20,7 @@ import ru.myitschool.work.ui.qr.scan.QrScanDestination import ru.myitschool.work.utils.UserState import ru.myitschool.work.utils.collectWhenStarted import ru.myitschool.work.utils.collectWithLifecycle +import ru.myitschool.work.utils.dateTimeConverter class MainFragment : Fragment(R.layout.fragment_main) { @@ -34,6 +35,7 @@ class MainFragment : Fragment(R.layout.fragment_main) { _binding = FragmentMainBinding.bind(view) viewModel.getUserData() + viewModel.getLastEntryDate() binding.logout.setOnClickListener { logout() } binding.scan.setOnClickListener { onScanClick() } @@ -56,7 +58,30 @@ class MainFragment : Fragment(R.layout.fragment_main) { binding.loading.visibility = View.GONE binding.error.visibility = View.GONE showUserData(state.employeeEntity) - + } + } + } + viewModel.dateState.collectWhenStarted(this) { state -> + println(state) + when (state) { + is MainViewModel.DateState.Error -> { + binding.error.visibility = View.VISIBLE + binding.error.text = state.message + binding.loading.visibility = View.GONE + binding.content.visibility = View.GONE + } + is MainViewModel.DateState.Loading -> { + binding.error.visibility = View.GONE + binding.loading.visibility = View.VISIBLE + binding.lastEntry.visibility = View.GONE + binding.content.visibility = View.GONE + } + is MainViewModel.DateState.Success -> { + binding.error.visibility = View.GONE + binding.loading.visibility = View.GONE + binding.lastEntry.text = dateTimeConverter(state.data.scanTime) + binding.lastEntry.visibility = View.VISIBLE + binding.content.visibility = View.VISIBLE } } } @@ -65,11 +90,13 @@ class MainFragment : Fragment(R.layout.fragment_main) { binding.refresh.setOnClickListener { viewModel.getUserData() adapter.refresh() + viewModel.getLastEntryDate() } binding.content.adapter = adapter viewModel.listState.collectWithLifecycle(this) { data -> adapter.submitData(data) } + adapter.loadStateFlow.collectWithLifecycle(this) { loadState -> val state = loadState.refresh binding.error.visibility = if (state is LoadState.Error) View.VISIBLE else View.GONE @@ -88,10 +115,7 @@ class MainFragment : Fragment(R.layout.fragment_main) { findNavController().navigate(R.id.qrResultFragment, bundleToQrResult) } - - } - private fun logout() { lifecycleScope.launch { viewModel.clearUsername() @@ -100,8 +124,6 @@ class MainFragment : Fragment(R.layout.fragment_main) { } } - - private fun showUserData(employeeEntity: EmployeeEntity) { binding.apply { fullname.text = employeeEntity.name diff --git a/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt index ababcb0..a36de0c 100644 --- a/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt @@ -19,15 +19,24 @@ import ru.myitschool.work.data.profile.ProfileNetworkDataSource import ru.myitschool.work.data.profile.ProfileRepoImpl import ru.myitschool.work.data.entrance.employeeEntrances.EmployeeEntranceListNetworkDataSource import ru.myitschool.work.data.entrance.employeeEntrances.EmployeeEntranceListRepoImpl +import ru.myitschool.work.data.entrance.lastEntrance.LastEntranceNetworkDataSource +import ru.myitschool.work.data.entrance.lastEntrance.LastEntranceRepoImpl import ru.myitschool.work.domain.profile.GetProfileUseCase import ru.myitschool.work.domain.employeeEntrance.employeeEntrances.GetEmployeeEntranceListUseCase +import ru.myitschool.work.domain.employeeEntrance.lastEntrance.GetLastEntranceUseCase +import ru.myitschool.work.entities.EmployeeEntranceEntity import ru.myitschool.work.utils.UserState class MainViewModel( private val infoUseCase: GetProfileUseCase, private val listUseCase: GetEmployeeEntranceListUseCase, + private val lastEntranceUseCase: GetLastEntranceUseCase, application: Application ) : AndroidViewModel(application) { + private val _userState = MutableStateFlow(UserState.Loading) + val userState: StateFlow get() = _userState + private val _dateState = MutableStateFlow(DateState.Loading) + val dateState: StateFlow get() = _dateState val listState = Pager( config = PagingConfig( @@ -36,23 +45,14 @@ class MainViewModel( maxSize = 30 ) ) { - println("Creating PagingSource") EmployeeEntranceListPagingSource(listUseCase::invoke) }.flow.cachedIn(viewModelScope) - init { - viewModelScope.launch { - listState.collect { pagingData -> - if (pagingData.toString().isEmpty()) { - println("No data in paging data.") - } else { - println("Data received: $pagingData") - } - } - } - } - private val _userState = MutableStateFlow(UserState.Loading) - val userState: StateFlow get() = _userState + sealed class DateState { + data object Loading : DateState() + data class Success(val data : EmployeeEntranceEntity) : DateState() + data class Error(val message: String?) : DateState() + } private val dataStoreManager = UserDataStoreManager(application) @@ -66,6 +66,19 @@ class MainViewModel( ) } } + fun getLastEntryDate(){ + _dateState.value = DateState.Loading + viewModelScope.launch { + lastEntranceUseCase.invoke().fold( + onSuccess = { data -> + _dateState.value = DateState.Success(data) + }, + onFailure = { e -> + _dateState.value = DateState.Error(e.message) + } + ) + } + } fun clearUsername() { viewModelScope.launch{ @@ -89,12 +102,21 @@ class MainViewModel( context = extras[ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY] as Application ) ) + val lastEntranceRepoImpl = LastEntranceRepoImpl( + networkDataSource = LastEntranceNetworkDataSource( + context = extras[ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY] as Application + ) + ) val infoUseCase = GetProfileUseCase(profileRepoImpl) val listUseCase = GetEmployeeEntranceListUseCase(listInfoImpl) + val lastEntranceUseCase = GetLastEntranceUseCase(lastEntranceRepoImpl) return MainViewModel( - infoUseCase, listUseCase, extras[ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY] as Application + infoUseCase, + listUseCase, + lastEntranceUseCase, + extras[ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY] as Application ) as T } } diff --git a/app/src/main/java/ru/myitschool/work/utils/DateConverter.kt b/app/src/main/java/ru/myitschool/work/utils/DateConverter.kt index 91d7210..0f7ee34 100644 --- a/app/src/main/java/ru/myitschool/work/utils/DateConverter.kt +++ b/app/src/main/java/ru/myitschool/work/utils/DateConverter.kt @@ -1,15 +1,31 @@ package ru.myitschool.work.utils import java.text.SimpleDateFormat +import java.time.ZoneId +import java.time.format.DateTimeFormatter import java.util.Date import java.util.Locale -fun dateConverter(date: Date?) : String { +fun dateTimeConverter(date: Date?) : String { if (date != null) { - val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) - println(dateFormat.format(date).toString()) + val dateFormat = SimpleDateFormat("HH:mm • yyyy-MM-dd", Locale.getDefault()) return dateFormat.format(date).toString() - } return "" -} \ No newline at end of file +} +fun monthConverter(date: Date?) : String { + if (date != null) { + val russianLocale = Locale("ru", "RU", "variant") + val localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate() + val formatter = DateTimeFormatter.ofPattern("d MMMM yyyy", russianLocale) + return localDate.format(formatter) + } + return "" +} +fun timeConverter(date: Date?) : String { + if (date != null) { + val dateFormat = SimpleDateFormat("HH:mm", Locale.getDefault()) + return dateFormat.format(date).toString() + } + return "" +} diff --git a/app/src/main/java/ru/myitschool/work/utils/DateSerializer.kt b/app/src/main/java/ru/myitschool/work/utils/DateSerializer.kt index dfe858d..d4bb558 100644 --- a/app/src/main/java/ru/myitschool/work/utils/DateSerializer.kt +++ b/app/src/main/java/ru/myitschool/work/utils/DateSerializer.kt @@ -11,7 +11,7 @@ import java.util.Date import java.util.Locale object DateSerializer : KSerializer { - private val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm", Locale.US) override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("Date", PrimitiveKind.STRING) diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 5844dcf..116e019 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -16,4 +16,5 @@ Operation was cancelled Enter the password Visit history + Incorrect login or password \ 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 6086fa2..38701fb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -18,7 +18,7 @@ Закрыть Введите пароль История посещений - + Неправильное имя пользователя или пароль \ No newline at end of file