From 1dd484878202f853edbbc8966fb7163e7632ad90 Mon Sep 17 00:00:00 2001 From: Denis Oleynik <oleynik.denis.2009@gmail.com> Date: Thu, 20 Feb 2025 10:31:16 +0300 Subject: [PATCH 1/2] Change visibility button for admins --- .../java/ru/myitschool/work/data/mapper/UserInfoMapper.kt | 6 ++++-- .../work/domain/profile/entities/UserInfoEntity.kt | 4 ++++ .../java/ru/myitschool/work/ui/profile/ProfileFragment.kt | 6 ++++-- .../java/ru/myitschool/work/ui/profile/ProfileViewModel.kt | 5 ++++- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/ru/myitschool/work/data/mapper/UserInfoMapper.kt b/app/src/main/java/ru/myitschool/work/data/mapper/UserInfoMapper.kt index 548b2dc..3e90287 100644 --- a/app/src/main/java/ru/myitschool/work/data/mapper/UserInfoMapper.kt +++ b/app/src/main/java/ru/myitschool/work/data/mapper/UserInfoMapper.kt @@ -14,9 +14,11 @@ class UserInfoMapper @Inject constructor() { fullname = model.fullname ?: error("fullname is null"), imageUrl = model.imageUrl ?: error("imageUrl is null"), position = model.position ?: error("position is null"), - lastEntryMillis = model.lastEntry?.let { date -> + lastEntryMillis = model.lastEntry.let { date -> simpleDateFormat.parse(date)?.time ?: error("parse lastEntry error") - } ?: error("lastEntry is null") + } ?: error("lastEntry is null"), + role = model.role, + blocked = model.blocked ) } } diff --git a/app/src/main/java/ru/myitschool/work/domain/profile/entities/UserInfoEntity.kt b/app/src/main/java/ru/myitschool/work/domain/profile/entities/UserInfoEntity.kt index 46dc55f..4e7c213 100644 --- a/app/src/main/java/ru/myitschool/work/domain/profile/entities/UserInfoEntity.kt +++ b/app/src/main/java/ru/myitschool/work/domain/profile/entities/UserInfoEntity.kt @@ -1,8 +1,12 @@ package ru.myitschool.work.domain.profile.entities +import ru.myitschool.work.data.dto.Role + class UserInfoEntity( val fullname: String, val imageUrl: String, val position: String, + val role: Role, + val blocked: Boolean, val lastEntryMillis: Long, ) \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt index b38f857..337ea6c 100644 --- a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt @@ -63,11 +63,13 @@ class ProfileFragment : Fragment(R.layout.fragment_profile) { binding.lastEntry.text = state.lastEntry binding.fullname.text = state.fullname if (state.admin){ - //TODO Приделать админские штучки binding.admin.visibility = View.VISIBLE - }else{ + } else { binding.admin.visibility = View.GONE } + if (state.blocked) { + // TODO: СДЕЛАТЬ ФОН КРАСНЫМ + } Picasso.get() .load(state.imageUrl) .error(R.drawable.ic_no_img) diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt index b4ba863..d306aaf 100644 --- a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt @@ -12,6 +12,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import ru.myitschool.work.R +import ru.myitschool.work.data.dto.Role import ru.myitschool.work.domain.auth.LogoutUseCase import ru.myitschool.work.domain.profile.GetUserInfoUseCase import ru.myitschool.work.utils.MutablePublishFlow @@ -72,7 +73,8 @@ class ProfileViewModel @Inject constructor( imageUrl = value.imageUrl, position = value.position, lastEntry = simpleDateFormat.format(Date(value.lastEntryMillis)), - admin = true + admin = value.role == Role.ADMIN, + blocked = value.blocked ) } }, @@ -100,6 +102,7 @@ class ProfileViewModel @Inject constructor( val position: String, val lastEntry: String, val admin: Boolean, + val blocked: Boolean ) : State } From 835ddd1afb5504d4fb57fcb2f162d009db8c4468 Mon Sep 17 00:00:00 2001 From: v228a <v228a@proton.me> Date: Thu, 20 Feb 2025 10:44:28 +0300 Subject: [PATCH 2/2] =?UTF-8?q?AlertDialog=20=D0=BF=D1=80=D0=B8=20=D0=B2?= =?UTF-8?q?=D1=8B=D1=85=D0=BE=D0=B4=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../work/ui/profile/ProfileFragment.kt | 57 ++++++++++++++++++- .../work/ui/profile/ProfileViewModel.kt | 9 ++- app/src/main/res/values-ru/strings.xml | 6 +- app/src/main/res/values/strings.xml | 2 + app/src/main/res/values/strings_profile.xml | 2 + 5 files changed, 73 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt index b38f857..e559731 100644 --- a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt @@ -1,8 +1,15 @@ package ru.myitschool.work.ui.profile +import android.content.DialogInterface +import android.graphics.Color +import android.graphics.Typeface import android.os.Bundle import android.util.Log import android.view.View +import android.widget.TextView +import androidx.appcompat.app.AlertDialog +import androidx.core.content.ContextCompat +import androidx.core.content.res.ResourcesCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController @@ -78,11 +85,59 @@ class ProfileFragment : Fragment(R.layout.fragment_profile) { viewModel.action.collectWhenStarted(this) { action -> when(action) { - is ProfileViewModel.Action.OpenLogin -> { + is ProfileViewModel.Action.Logout -> { findNavController().navigate(LoginDestination) { popUpTo<ProfileDestination> { inclusive = true } } } + is ProfileViewModel.Action.OpenLogin -> { + + val builder = AlertDialog.Builder(requireContext()) + + builder.setTitle(ContextCompat.getContextForLanguage(requireContext()).getString(R.string.profile_logout_dialog)); + builder.setMessage(ContextCompat.getContextForLanguage(requireContext()).getString(R.string.profile_logout_text_dialog)) + builder.setPositiveButton( + ContextCompat.getContextForLanguage(requireContext()).getString(R.string.logout), + DialogInterface.OnClickListener { dialogInterface, i -> + viewModel.logout() + dialogInterface.dismiss() + }) + builder.setNegativeButton( + ContextCompat.getContextForLanguage(requireContext()).getString(R.string.cancel), + DialogInterface.OnClickListener { dialogInterface, i -> + dialogInterface.dismiss() + + }) + + val dialog = builder.create() + + + + dialog.setOnShowListener { + val titleView = dialog.findViewById<TextView>(android.R.id.title) + val messageView = dialog.findViewById<TextView>(android.R.id.message) + + + + titleView?.setTextAppearance(R.style.Theme_UiTemplate_TextH2) + messageView?.setTextAppearance(R.style.Theme_UiTemplate_TextH4) + + + + val positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE) + val negativeButton = dialog.getButton(AlertDialog.BUTTON_NEGATIVE) + + + positiveButton.setTextColor(ContextCompat.getColor(requireContext(), R.color.ErrorRed) ) + negativeButton.setTextColor(ContextCompat.getColor(requireContext(), R.color.AccentBlue) ) + } + + // Установка кнопок + + + // Показать диалог + dialog.show() + } is ProfileViewModel.Action.OpenLog -> { findNavController().navigate(EntryListDestination) { diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt index b4ba863..e8523c0 100644 --- a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt @@ -37,11 +37,17 @@ class ProfileViewModel @Inject constructor( updateUserInfo() } + fun logout(){ + viewModelScope.launch { + logoutUseCase.get().invoke() + _action.emit(Action.Logout) + } + + } fun clickLogout() { viewModelScope.launch { - logoutUseCase.get().invoke() _action.emit(Action.OpenLogin) } } @@ -108,6 +114,7 @@ class ProfileViewModel @Inject constructor( data object OpenScan : Action data object OpenLog : Action data object OpenSearch : Action + data object Logout : Action } companion object { diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 3516fe6..e79b729 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -23,4 +23,8 @@ <string name="qr_result_status_success">Успешно</string> <string name="qr_result_status_cancel">Операция отменена</string> <string name="qr_result_status_error">Что-то пошло не так</string> -</resources> \ No newline at end of file + <string name="profile_logout_dialog">Выход</string> + <string name="profile_logout_text_dialog">Вы уверенны что хотите выйти из системы?</string> + <string name="logout">Выход</string> + <string name="cancel">Отмена</string> +</resources> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9b2b311..b0ae32e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,4 +1,6 @@ <resources> <string name="app_name">NTO Pass</string> <string name="entry_history">Entry History</string> + <string name="logout">Logout</string> + <string name="cancel">Cancel</string> </resources> \ No newline at end of file diff --git a/app/src/main/res/values/strings_profile.xml b/app/src/main/res/values/strings_profile.xml index 3f2786a..1d0f409 100644 --- a/app/src/main/res/values/strings_profile.xml +++ b/app/src/main/res/values/strings_profile.xml @@ -5,4 +5,6 @@ <string name="profile_main_textview">Home</string> <string name="profile_admin_button">Admin panel</string> <string name="profile_list_button">Entry History</string> + <string name="profile_logout_dialog">Logout</string> + <string name="profile_logout_text_dialog">Are you sure you want to log out?</string> </resources> \ No newline at end of file