From 29ba176b9b49f57c1ce9e4f9e60328d4e0bf2040 Mon Sep 17 00:00:00 2001 From: v228a Date: Wed, 19 Feb 2025 18:56:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=D0=B8=20=D1=8D=D0=BA=D1=80=D0=B0=D0=BD=D1=8B=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=B0=D0=B4=D0=BC=D0=B8=D0=BD=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/myitschool/work/ui/RootActivity.kt | 3 + .../work/ui/profile/ProfileFragment.kt | 2 +- .../work/ui/searchuser/SearchUserFragment.kt | 50 ++++++++--- .../work/ui/searchuser/SearchUserViewModel.kt | 16 +++- .../work/ui/userInfo/UserInfoDestination.kt | 6 ++ .../work/ui/userInfo/UserInfoFragment.kt | 58 ++++++++++++ .../work/ui/userInfo/UserInfoViewModel.kt | 28 ++++++ .../main/res/layout/fragment_user_info.xml | 90 +++++++++++++++++++ 8 files changed, 238 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/ru/myitschool/work/ui/userInfo/UserInfoDestination.kt create mode 100644 app/src/main/java/ru/myitschool/work/ui/userInfo/UserInfoFragment.kt create mode 100644 app/src/main/java/ru/myitschool/work/ui/userInfo/UserInfoViewModel.kt create mode 100644 app/src/main/res/layout/fragment_user_info.xml 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 cc4d2ff..80d4a05 100644 --- a/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt +++ b/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt @@ -23,6 +23,8 @@ import ru.myitschool.work.ui.searchuser.SearchUserDestination import ru.myitschool.work.ui.searchuser.SearchUserFragment import ru.myitschool.work.ui.splash.SplashDestination import ru.myitschool.work.ui.splash.SplashFragment +import ru.myitschool.work.ui.userInfo.UserInfoDestination +import ru.myitschool.work.ui.userInfo.UserInfoFragment @AndroidEntryPoint class RootActivity : AppCompatActivity() { @@ -45,6 +47,7 @@ class RootActivity : AppCompatActivity() { fragment() fragment() fragment() + fragment() } } 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 e76fdee..b38f857 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 @@ -99,7 +99,7 @@ class ProfileFragment : Fragment(R.layout.fragment_profile) { is ProfileViewModel.Action.OpenSearch -> { findNavController().navigate(SearchUserDestination) { - popUpTo { inclusive = true } + popUpTo { inclusive = true } } } diff --git a/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserFragment.kt b/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserFragment.kt index 28d07db..c4b60cb 100644 --- a/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserFragment.kt @@ -1,28 +1,52 @@ package ru.myitschool.work.ui.searchuser -import androidx.fragment.app.viewModels import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.navigation.fragment.findNavController import dagger.hilt.android.AndroidEntryPoint -import kotlinx.serialization.Serializable import ru.myitschool.work.R +import ru.myitschool.work.databinding.FragmentSearchUserBinding +import ru.myitschool.work.ui.profile.ProfileDestination +import ru.myitschool.work.utils.collectWhenStarted + -@Serializable @AndroidEntryPoint class SearchUserFragment : Fragment(R.layout.fragment_search_user) { - companion object { - fun newInstance() = SearchUserFragment() - } + private var _binding: FragmentSearchUserBinding? = null + private val binding: FragmentSearchUserBinding get() = _binding!! + private val viewModel: SearchUserViewModel by viewModels() - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + _binding = FragmentSearchUserBinding.bind(view) - // TODO: Use the ViewModel + initCallback() + subscribe() + + } + + private fun initCallback() { + binding.floatingActionButton2.setOnClickListener { viewModel.closeSearchUser() } } -} \ No newline at end of file + + private fun subscribe() { + viewModel.action.collectWhenStarted(this) { action -> + when (action) { + is SearchUserViewModel.Action.OpenProfile -> { + findNavController().navigate(ProfileDestination) { + popUpTo { inclusive = true } + } + } + } + } + } + + + } + + diff --git a/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserViewModel.kt index d6fcb7e..a0e8924 100644 --- a/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserViewModel.kt @@ -2,13 +2,27 @@ package ru.myitschool.work.ui.searchuser import android.content.Context import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.launch +import ru.myitschool.work.utils.MutablePublishFlow import javax.inject.Inject @HiltViewModel class SearchUserViewModel @Inject constructor( @ApplicationContext private val context: Context, ) : ViewModel() { - // TODO: Implement the ViewModel + private val _action = MutablePublishFlow() + val action = _action.asSharedFlow() + + fun closeSearchUser(){ + viewModelScope.launch { + _action.emit(Action.OpenProfile) + } + } + sealed interface Action { + data object OpenProfile: Action + } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/userInfo/UserInfoDestination.kt b/app/src/main/java/ru/myitschool/work/ui/userInfo/UserInfoDestination.kt new file mode 100644 index 0000000..777d288 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/userInfo/UserInfoDestination.kt @@ -0,0 +1,6 @@ +package ru.myitschool.work.ui.userInfo + +import kotlinx.serialization.Serializable + +@Serializable +data object UserInfoDestination \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/userInfo/UserInfoFragment.kt b/app/src/main/java/ru/myitschool/work/ui/userInfo/UserInfoFragment.kt new file mode 100644 index 0000000..a2d4840 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/userInfo/UserInfoFragment.kt @@ -0,0 +1,58 @@ +package ru.myitschool.work.ui.userInfo + +import ru.myitschool.work.ui.searchuser.SearchUserViewModel + + + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.navigation.fragment.findNavController +import dagger.hilt.android.AndroidEntryPoint +import ru.myitschool.work.R +import ru.myitschool.work.databinding.FragmentSearchUserBinding +import ru.myitschool.work.databinding.FragmentUserInfoBinding +import ru.myitschool.work.ui.profile.ProfileDestination +import ru.myitschool.work.ui.searchuser.SearchUserDestination +import ru.myitschool.work.utils.collectWhenStarted + + +@AndroidEntryPoint +class UserInfoFragment : Fragment(R.layout.fragment_user_info) { + + private var _binding: FragmentUserInfoBinding? = null + private val binding: FragmentUserInfoBinding get() = _binding!! + + + private val viewModel: UserInfoViewModel by viewModels() + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + _binding = FragmentUserInfoBinding.bind(view) + + initCallback() + subscribe() + + } + + private fun initCallback() { + binding.floatingActionButton2.setOnClickListener { viewModel.closeSearchUser() } + } + + private fun subscribe() { + viewModel.action.collectWhenStarted(this) { action -> + when (action) { + is UserInfoViewModel.Action.OpenProfile -> { + findNavController().navigate(SearchUserDestination) { + popUpTo { inclusive = true } + } + } + } + } + } + + +} + + diff --git a/app/src/main/java/ru/myitschool/work/ui/userInfo/UserInfoViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/userInfo/UserInfoViewModel.kt new file mode 100644 index 0000000..905159a --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/userInfo/UserInfoViewModel.kt @@ -0,0 +1,28 @@ +package ru.myitschool.work.ui.userInfo + +import android.content.Context +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.launch +import ru.myitschool.work.utils.MutablePublishFlow +import javax.inject.Inject + +@HiltViewModel +class UserInfoViewModel @Inject constructor( + @ApplicationContext private val context: Context, +) : ViewModel() { + private val _action = MutablePublishFlow() + val action = _action.asSharedFlow() + + fun closeSearchUser(){ + viewModelScope.launch { + _action.emit(Action.OpenProfile) + } + } + sealed interface Action { + data object OpenProfile: Action + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_user_info.xml b/app/src/main/res/layout/fragment_user_info.xml new file mode 100644 index 0000000..069cc52 --- /dev/null +++ b/app/src/main/res/layout/fragment_user_info.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + +