From 87ad1617a4fcac49d1bd756db078ba396a58cd56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=81=D0=B5=D0=BD=D0=B8=D0=B8?= Date: Thu, 20 Feb 2025 15:04:05 +0300 Subject: [PATCH] update qr scan and navigation --- .../java/ru/myitschool/work/core/Constants.kt | 2 +- .../ru/myitschool/work/ui/RootActivity.kt | 7 +- .../myitschool/work/ui/admin/AdminFragment.kt | 50 ++++++++++ .../work/ui/admin/AdminViewModel.kt | 87 +++++++++++++++++ .../work/ui/profile/ProfileFragment.kt | 2 +- .../work/ui/qr/result/QrResultFragment.kt | 3 +- .../work/ui/qr/scan/QrScanDestination.kt | 1 + app/src/main/res/layout/activity_root.xml | 33 ++++--- app/src/main/res/layout/fragment_admin.xml | 94 +++++++++++++++++++ app/src/main/res/layout/fragment_login.xml | 4 +- .../res/navigation/main_admin_nav_graph.xml | 10 +- app/src/main/res/values/strings.xml | 2 + 12 files changed, 274 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/ru/myitschool/work/ui/admin/AdminFragment.kt create mode 100644 app/src/main/java/ru/myitschool/work/ui/admin/AdminViewModel.kt create mode 100644 app/src/main/res/layout/fragment_admin.xml 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 ffb63c1..f5ad7e8 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://10.0.2.2:8080" + const val SERVER_ADDRESS = "http://10.6.66.79:8080" } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt b/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt index 2581628..1b546cd 100644 --- a/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt +++ b/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt @@ -3,12 +3,14 @@ package ru.myitschool.work.ui import android.annotation.SuppressLint import android.os.Bundle import android.util.Log +import android.view.View import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AppCompatActivity import androidx.navigation.createGraph import androidx.navigation.findNavController import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.fragment +import androidx.navigation.ui.setupWithNavController import com.google.android.material.bottomnavigation.BottomNavigationView import dagger.hilt.android.AndroidEntryPoint import ru.myitschool.work.R @@ -33,16 +35,17 @@ class RootActivity : AppCompatActivity() { val navController = navHostFragment?.navController ?: throw IllegalStateException("NavHostFragment not found") val bottomNavigationView = findViewById(R.id.bottom_navigation) + bottomNavigationView.setupWithNavController(navController) //navController.setGraph(R.navigation.main_nav_graph) //navController.navigate(R.id.fragment_profile) Log.d("role", "$userRole") if (userRole == "ROLE_ADMIN") { - navController.setGraph(R.navigation.main_nav_graph) + navController.setGraph(R.navigation.main_admin_nav_graph) navController.navigate(R.id.fragment_profile) } else { navController.setGraph(R.navigation.main_nav_graph) - bottomNavigationView.menu.clear() + bottomNavigationView.visibility = View.GONE navController.navigate(R.id.fragment_profile) } diff --git a/app/src/main/java/ru/myitschool/work/ui/admin/AdminFragment.kt b/app/src/main/java/ru/myitschool/work/ui/admin/AdminFragment.kt new file mode 100644 index 0000000..0db8ec8 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/admin/AdminFragment.kt @@ -0,0 +1,50 @@ +package ru.myitschool.work.ui.admin + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.ViewModel +import androidx.navigation.fragment.findNavController +import com.squareup.picasso.Picasso +import ru.myitschool.work.R +import ru.myitschool.work.databinding.FragmentAdminBinding +import ru.myitschool.work.databinding.FragmentProfileBinding +import ru.myitschool.work.ui.profile.ProfileViewModel +import ru.myitschool.work.utils.collectWithLifecycle + +class AdminFragment : Fragment(R.layout.fragment_admin) { + private var _viewBinding: FragmentAdminBinding? = null + private val viewBinding: FragmentAdminBinding get() = _viewBinding!! + + private val viewModel by viewModels { AdminViewModel.Factory } + + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + _viewBinding = FragmentAdminBinding.bind(view) + super.onViewCreated(view, savedInstanceState) + + + /*viewModel.state.collectWithLifecycle(this) { state -> + + viewBinding.error.visibility = if (state is AdminViewModel.State.Error) View.VISIBLE else View.GONE + + + when(state) { + is AdminViewModel.State.Loading -> Unit + is AdminViewModel.State.GoToInfo -> { + findNavController().navigate() + } + is ProfileViewModel.State.Error -> { + viewBinding.errorText.text = state.text + } + } + + }*/ +} + +override fun onDestroyView() { + _viewBinding = null + super.onDestroyView() +} +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/admin/AdminViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/admin/AdminViewModel.kt new file mode 100644 index 0000000..49fb685 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/admin/AdminViewModel.kt @@ -0,0 +1,87 @@ +package ru.myitschool.work.ui.admin + +import android.util.Log +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import ru.myitschool.work.data.auth.AuthStorageDataSource +import ru.myitschool.work.data.user.UserNetworkDataSource +import ru.myitschool.work.data.user.UserRepoImpl +import ru.myitschool.work.domain.user.EntranceEntity +import ru.myitschool.work.domain.user.GetUserUseCase +import ru.myitschool.work.domain.user.UserEntity + +class AdminViewModel( + private val getUserUseCase: GetUserUseCase +) : ViewModel() { + private val _state = MutableStateFlow(State.Loading) + val state = _state.asStateFlow() + + init { + updateStateGet() + } + + fun clickRefresh() { + updateStateGet() + } + + fun updateStateGet() { + viewModelScope.launch { + _state.emit(State.Loading) + val entranceList : List = getUserUseCase.getEntrancesList().fold( + onSuccess = { list -> + list + }, + onFailure = { + emptyList() + } + ) + _state.emit( + getUserUseCase.invoke().fold( + onSuccess = { data -> + Log.d("uraa", "успех успех ${data.toString()}") + + State.GoToInfo(data, entranceList) + }, + onFailure = { error -> + Log.d("kaput", error.message.toString()) + State.Error(error.message.toString()) + } + ) + ) + //_state.emit(State.Error("о нет ошибка ошибка помогите")) + } + } + + + + sealed interface State { + data object Loading: State + data class GoToInfo( + val profileInfo: UserEntity, + val entrancesList : List + ) : State + data class Error( + val text: String + ) : State + } + companion object { + val Factory : ViewModelProvider.Factory = object : ViewModelProvider.Factory { + @Suppress("UNCHECKED_CAST") + override fun create(modelClass: Class): T { + return AdminViewModel( + getUserUseCase = GetUserUseCase( + repo = UserRepoImpl( + userNetworkDataSource = UserNetworkDataSource() + ), + authStorageDataSource = AuthStorageDataSource + ) + ) as T + } + } + } + +} \ 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 c4166a3..64dca72 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 @@ -56,7 +56,7 @@ class ProfileFragment : Fragment(R.layout.fragment_profile) { is ProfileViewModel.State.Show -> { viewBinding.noData.visibility = View.GONE viewBinding.name.text = state.profileInfo.name - viewBinding.position.text = "Должность: ${state.profileInfo.name}" + viewBinding.position.text = "Должность: ${state.profileInfo.position}" if (state.profileInfo.lastEntry == null) viewBinding.lastEntry.text = "Время последнего входа: Нет данных" else viewBinding.lastEntry.text = "Время последнего входа: ${state.profileInfo.lastEntry}" Picasso.get().load(state.profileInfo.avatarUrl).resize(100, 100).centerCrop().into(viewBinding.imageView) diff --git a/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResultFragment.kt b/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResultFragment.kt index 26149e0..9df7862 100644 --- a/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResultFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResultFragment.kt @@ -26,8 +26,7 @@ class QrResultFragment : Fragment(R.layout.fragment_qr_result) { super.onViewCreated(view, savedInstanceState) parentFragmentManager.setFragmentResultListener( QrScanDestination.REQUEST_KEY, viewLifecycleOwner - ) { - key, bundle -> + ) { key, bundle -> if (key == QrScanDestination.REQUEST_KEY) { val code = QrScanDestination.getDataIfExist(bundle) viewModel.sendResult(code) diff --git a/app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanDestination.kt b/app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanDestination.kt index 7e34b28..24e2171 100644 --- a/app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanDestination.kt +++ b/app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanDestination.kt @@ -23,6 +23,7 @@ data object QrScanDestination { } internal fun packToBundle(data: String): Bundle { + return bundleOf( KEY_QR_DATA to data ) diff --git a/app/src/main/res/layout/activity_root.xml b/app/src/main/res/layout/activity_root.xml index cfc3c95..b493976 100644 --- a/app/src/main/res/layout/activity_root.xml +++ b/app/src/main/res/layout/activity_root.xml @@ -1,28 +1,37 @@ - + xmlns:app="http://schemas.android.com/apk/res-auto"> + android:layout_height="0dp" + app:defaultNavHost="true" + app:layout_constraintBottom_toTopOf="@+id/bottom_navigation" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + /> - \ No newline at end of file + app:menu="@menu/bottom_menu_admin" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_admin.xml b/app/src/main/res/layout/fragment_admin.xml new file mode 100644 index 0000000..1554123 --- /dev/null +++ b/app/src/main/res/layout/fragment_admin.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml index cd83595..6930baa 100644 --- a/app/src/main/res/layout/fragment_login.xml +++ b/app/src/main/res/layout/fragment_login.xml @@ -31,8 +31,8 @@ app:layout_constraintTop_toTopOf="parent"> + android:id="@+id/admin_main_nav_graph" + app:startDestination="@id/fragment_profile"> + + + \ 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 e70158b..a033f91 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -18,4 +18,6 @@ Вход был отменён Профиль Просмотр пользователя + Найти информацию о сотруднике + Найти \ No newline at end of file