From 6039b9c27c18af57eb4807fe188fa6cad2d17a04 Mon Sep 17 00:00:00 2001 From: AndreyRyabitckiy Date: Mon, 19 Aug 2024 11:08:01 +0300 Subject: [PATCH 01/12] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20ViewModel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/diploma/di/ViewModelModule.kt | 5 +++ .../viewmodels/FilterIndustryViewModel.kt | 31 +++++++++++++++++++ .../ui/fragments/FilterIndustryFragment.kt | 21 +++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt diff --git a/app/src/main/java/ru/practicum/android/diploma/di/ViewModelModule.kt b/app/src/main/java/ru/practicum/android/diploma/di/ViewModelModule.kt index dc3c1f0fd6..66e7a74f74 100644 --- a/app/src/main/java/ru/practicum/android/diploma/di/ViewModelModule.kt +++ b/app/src/main/java/ru/practicum/android/diploma/di/ViewModelModule.kt @@ -2,6 +2,7 @@ package ru.practicum.android.diploma.di import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module +import ru.practicum.android.diploma.presentation.viewmodels.FilterIndustryViewModel import ru.practicum.android.diploma.presentation.viewmodels.SearchViewModel import ru.practicum.android.diploma.presentation.viewmodels.VacancyViewModel import ru.practicum.android.diploma.presentation.viewmodels.favourites.FavouritesFragmentViewModel @@ -18,4 +19,8 @@ val viewModelModule = module { viewModel { VacancyViewModel(get(), get()) } + + viewModel{ + FilterIndustryViewModel(get()) + } } diff --git a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt new file mode 100644 index 0000000000..8d83810df7 --- /dev/null +++ b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt @@ -0,0 +1,31 @@ +package ru.practicum.android.diploma.presentation.viewmodels + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.launch +import ru.practicum.android.diploma.domain.FilterInteractor +import ru.practicum.android.diploma.domain.models.Industries +import ru.practicum.android.diploma.util.ResponseData + +class FilterIndustryViewModel( + private val interactor: FilterInteractor +) : ViewModel() { + private val _industries = MutableLiveData>() + val industries: LiveData> + get() = _industries + + fun updateListIndustries() { + viewModelScope.launch { + interactor.getIndustries().collect { list -> + when (list) { + is ResponseData.Data -> { + _industries.postValue(list.value) + } + is ResponseData.Error -> {} + } + } + } + } +} diff --git a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterIndustryFragment.kt b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterIndustryFragment.kt index 1e50e7bbff..6b8f8ee3ce 100644 --- a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterIndustryFragment.kt +++ b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterIndustryFragment.kt @@ -4,15 +4,22 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.isVisible +import androidx.core.widget.addTextChangedListener +import androidx.core.widget.doOnTextChanged import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import by.kirich1409.viewbindingdelegate.CreateMethod import by.kirich1409.viewbindingdelegate.viewBinding +import org.koin.androidx.viewmodel.ext.android.viewModel import ru.practicum.android.diploma.databinding.FragmentSelectIndustryBinding +import ru.practicum.android.diploma.domain.models.Industries +import ru.practicum.android.diploma.presentation.viewmodels.FilterIndustryViewModel class FilterIndustryFragment : Fragment() { private val binding: FragmentSelectIndustryBinding by viewBinding(CreateMethod.INFLATE) + private val viewModel: FilterIndustryViewModel by viewModel() override fun onCreateView( inflater: LayoutInflater, @@ -25,6 +32,20 @@ class FilterIndustryFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + viewModel.industries.observe(viewLifecycleOwner){ list -> + list.forEach { } + } + + binding.industrySearchQuery.doOnTextChanged { text, start, before, count -> + if (binding.industrySearchQuery.text.isNotEmpty()){ + binding.searchIconLoupe.isVisible = false + binding.clearCrossIc.isVisible = true + } else { + binding.searchIconLoupe.isVisible = true + binding.clearCrossIc.isVisible = false + } + } + binding.industryFilterToolbar.setNavigationOnClickListener { findNavController().navigateUp() } From f300b1979f2f2c3e6b88ed265502ef562a73bc72 Mon Sep 17 00:00:00 2001 From: AndreyRyabitckiy Date: Mon, 19 Aug 2024 12:23:16 +0300 Subject: [PATCH 02/12] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20ViewModel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diploma/presentation/viewmodels/FilterIndustryViewModel.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt index 8d83810df7..c09d245941 100644 --- a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt +++ b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt @@ -29,3 +29,4 @@ class FilterIndustryViewModel( } } } + From d237d5809d531def79a350f80d1689d732e608ab Mon Sep 17 00:00:00 2001 From: AndreyRyabitckiy Date: Mon, 19 Aug 2024 13:27:30 +0300 Subject: [PATCH 03/12] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20Adapter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/diploma/di/ViewModelModule.kt | 4 +++ .../viewmodels/FilterIndustryViewModel.kt | 8 +++++ .../ui/fragments/FilterIndustryFragment.kt | 18 +++++++---- .../util/adapter/industry/IndustryAdapter.kt | 30 +++++++++++++++++++ .../adapter/industry/IndustryViewHolder.kt | 17 +++++++++++ 5 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/ru/practicum/android/diploma/util/adapter/industry/IndustryAdapter.kt create mode 100644 app/src/main/java/ru/practicum/android/diploma/util/adapter/industry/IndustryViewHolder.kt diff --git a/app/src/main/java/ru/practicum/android/diploma/di/ViewModelModule.kt b/app/src/main/java/ru/practicum/android/diploma/di/ViewModelModule.kt index e00af59299..4ee69a7360 100644 --- a/app/src/main/java/ru/practicum/android/diploma/di/ViewModelModule.kt +++ b/app/src/main/java/ru/practicum/android/diploma/di/ViewModelModule.kt @@ -3,6 +3,7 @@ package ru.practicum.android.diploma.di import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module import ru.practicum.android.diploma.presentation.viewmodels.FilterCountryViewModel +import ru.practicum.android.diploma.presentation.viewmodels.FilterIndustryViewModel import ru.practicum.android.diploma.presentation.viewmodels.FilterPlaceOfWorkViewModel import ru.practicum.android.diploma.presentation.viewmodels.FilterRegionViewModel import ru.practicum.android.diploma.presentation.viewmodels.FilterViewModel @@ -35,4 +36,7 @@ val viewModelModule = module { viewModel { FilterRegionViewModel(get()) } + viewModel { + FilterIndustryViewModel(get()) + } } diff --git a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt index c09d245941..ece2cb7ebf 100644 --- a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt +++ b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt @@ -28,5 +28,13 @@ class FilterIndustryViewModel( } } } + + private fun writeSharedPrefs(industries: Industries){ + + } + + private fun readSharedPrefs(){ + + } } diff --git a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterIndustryFragment.kt b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterIndustryFragment.kt index 6b8f8ee3ce..ededf51239 100644 --- a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterIndustryFragment.kt +++ b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterIndustryFragment.kt @@ -5,7 +5,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.view.isVisible -import androidx.core.widget.addTextChangedListener import androidx.core.widget.doOnTextChanged import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController @@ -13,13 +12,20 @@ import by.kirich1409.viewbindingdelegate.CreateMethod import by.kirich1409.viewbindingdelegate.viewBinding import org.koin.androidx.viewmodel.ext.android.viewModel import ru.practicum.android.diploma.databinding.FragmentSelectIndustryBinding -import ru.practicum.android.diploma.domain.models.Industries import ru.practicum.android.diploma.presentation.viewmodels.FilterIndustryViewModel +import ru.practicum.android.diploma.util.adapter.industry.IndustryAdapter class FilterIndustryFragment : Fragment() { private val binding: FragmentSelectIndustryBinding by viewBinding(CreateMethod.INFLATE) private val viewModel: FilterIndustryViewModel by viewModel() + private val adapter by lazy { + IndustryAdapter( + onClick = { + + } + ) + } override fun onCreateView( inflater: LayoutInflater, @@ -31,13 +37,15 @@ class FilterIndustryFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + viewModel.updateListIndustries() + binding.industryRecycleView.adapter = adapter - viewModel.industries.observe(viewLifecycleOwner){ list -> - list.forEach { } + viewModel.industries.observe(viewLifecycleOwner) { list -> + adapter.industry = list } binding.industrySearchQuery.doOnTextChanged { text, start, before, count -> - if (binding.industrySearchQuery.text.isNotEmpty()){ + if (binding.industrySearchQuery.text.isNotEmpty()) { binding.searchIconLoupe.isVisible = false binding.clearCrossIc.isVisible = true } else { diff --git a/app/src/main/java/ru/practicum/android/diploma/util/adapter/industry/IndustryAdapter.kt b/app/src/main/java/ru/practicum/android/diploma/util/adapter/industry/IndustryAdapter.kt new file mode 100644 index 0000000000..fffeca7202 --- /dev/null +++ b/app/src/main/java/ru/practicum/android/diploma/util/adapter/industry/IndustryAdapter.kt @@ -0,0 +1,30 @@ +package ru.practicum.android.diploma.util.adapter.industry + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import ru.practicum.android.diploma.databinding.IndustryItemViewBinding +import ru.practicum.android.diploma.domain.models.Industries + +class IndustryAdapter( + private val onClick: (Industries) -> Unit +) : RecyclerView.Adapter() { + var industry: List = emptyList() + set(value) { + field = value + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): IndustryViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + return IndustryViewHolder(IndustryItemViewBinding.inflate(layoutInflater, parent, false), onClick) + } + + override fun getItemCount(): Int { + return industry.size + } + + override fun onBindViewHolder(holder: IndustryViewHolder, position: Int) { + holder.bind(industry[position]) + } +} diff --git a/app/src/main/java/ru/practicum/android/diploma/util/adapter/industry/IndustryViewHolder.kt b/app/src/main/java/ru/practicum/android/diploma/util/adapter/industry/IndustryViewHolder.kt new file mode 100644 index 0000000000..7ef622011a --- /dev/null +++ b/app/src/main/java/ru/practicum/android/diploma/util/adapter/industry/IndustryViewHolder.kt @@ -0,0 +1,17 @@ +package ru.practicum.android.diploma.util.adapter.industry + +import androidx.recyclerview.widget.RecyclerView +import ru.practicum.android.diploma.databinding.IndustryItemViewBinding +import ru.practicum.android.diploma.domain.models.Industries + +class IndustryViewHolder( + private val binding: IndustryItemViewBinding, + private val onClick: (Industries) -> Unit +) :RecyclerView.ViewHolder(binding.root) { + fun bind(item: Industries) { + binding.industryUnit.text = item.name + binding.root.setOnClickListener { + onClick(item) + } + } +} From b69f943a21cd230c2f385686b924b6006a45372f Mon Sep 17 00:00:00 2001 From: AndreyRyabitckiy Date: Mon, 19 Aug 2024 20:44:37 +0300 Subject: [PATCH 04/12] Fix3 --- .../data/impl/SharedPrefsRepositoryImpl.kt | 12 +++- .../android/diploma/di/ViewModelModule.kt | 4 +- .../diploma/domain/models/Industries.kt | 6 +- .../viewmodels/FilterIndustryViewModel.kt | 32 ++++++++-- .../viewmodels/FilterViewModel.kt | 60 ++++++++++++++++++- .../diploma/ui/fragments/FilterFragment.kt | 55 ++++++++++++++++- .../ui/fragments/FilterIndustryFragment.kt | 27 ++++++++- .../adapter/industry/IndustryViewHolder.kt | 3 +- .../diploma/util/extension/BundleExt.kt | 7 +++ app/src/main/res/layout/fragment_filter.xml | 1 - .../main/res/layout/industry_item_view.xml | 3 +- 11 files changed, 194 insertions(+), 16 deletions(-) create mode 100644 app/src/main/java/ru/practicum/android/diploma/util/extension/BundleExt.kt diff --git a/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt b/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt index b6f10a7f68..8f70b1cf8d 100644 --- a/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt +++ b/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt @@ -9,9 +9,17 @@ class SharedPrefsRepositoryImpl( private val sharedPreferences: SharedPreferences, private val gson: Gson ) : SharedPrefsRepository { - override suspend fun readSharedPrefs(): SaveFiltersSharedPrefs? { - val json = sharedPreferences.getString(HISTORY, null) ?: return null + override suspend fun readSharedPrefs(): SaveFiltersSharedPrefs { + val json = sharedPreferences.getString(HISTORY, null) ?: return SaveFiltersSharedPrefs( + null, + null, + null, + null, + null + ) return gson.fromJson(json, SaveFiltersSharedPrefs::class.java) + + } override suspend fun writeSharedPrefs(filters: SaveFiltersSharedPrefs) { diff --git a/app/src/main/java/ru/practicum/android/diploma/di/ViewModelModule.kt b/app/src/main/java/ru/practicum/android/diploma/di/ViewModelModule.kt index 4ee69a7360..1c359f88bb 100644 --- a/app/src/main/java/ru/practicum/android/diploma/di/ViewModelModule.kt +++ b/app/src/main/java/ru/practicum/android/diploma/di/ViewModelModule.kt @@ -25,7 +25,7 @@ val viewModelModule = module { } viewModel { - FilterViewModel() + FilterViewModel(get()) } viewModel { FilterPlaceOfWorkViewModel(get()) @@ -36,7 +36,7 @@ val viewModelModule = module { viewModel { FilterRegionViewModel(get()) } - viewModel { + viewModel { FilterIndustryViewModel(get()) } } diff --git a/app/src/main/java/ru/practicum/android/diploma/domain/models/Industries.kt b/app/src/main/java/ru/practicum/android/diploma/domain/models/Industries.kt index 618dccd9a3..ee9ab4bcb3 100644 --- a/app/src/main/java/ru/practicum/android/diploma/domain/models/Industries.kt +++ b/app/src/main/java/ru/practicum/android/diploma/domain/models/Industries.kt @@ -1,7 +1,11 @@ package ru.practicum.android.diploma.domain.models +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize data class Industries( val id: String, val name: String, val isChecked: Boolean -) +) : Parcelable diff --git a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt index ece2cb7ebf..8682fea2bc 100644 --- a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt +++ b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt @@ -16,6 +16,14 @@ class FilterIndustryViewModel( val industries: LiveData> get() = _industries + private val _hasSelected = MutableLiveData(false) + val hasSelected: LiveData + get() = _hasSelected + + private val _selectedIndustry = MutableLiveData() + val selectedIndustry: LiveData + get() = _selectedIndustry + fun updateListIndustries() { viewModelScope.launch { interactor.getIndustries().collect { list -> @@ -23,18 +31,34 @@ class FilterIndustryViewModel( is ResponseData.Data -> { _industries.postValue(list.value) } + is ResponseData.Error -> {} } } } } - private fun writeSharedPrefs(industries: Industries){ - + fun itemChecked(industries: Industries) { + val newList = ArrayList() + _industries.value?.forEach { industry -> + if (industry.id == industries.id) { + newList.add(industry.copy(isChecked = !industry.isChecked)) + _hasSelected.postValue(!industry.isChecked) + if (!industry.isChecked) + _selectedIndustry.postValue(industry) + } else { + newList.add(industry.copy(isChecked = false)) + } + } + _industries.postValue(newList) } - private fun readSharedPrefs(){ - + fun readSharedPrefs() { + viewModelScope.launch { + val industry = interactor.readSharedPrefs()?.industries + if (industry != null) + itemChecked(industry) + } } } diff --git a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterViewModel.kt b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterViewModel.kt index 502a138a39..4716a28ce4 100644 --- a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterViewModel.kt +++ b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterViewModel.kt @@ -6,18 +6,56 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import ru.practicum.android.diploma.domain.FilterInteractor +import ru.practicum.android.diploma.domain.models.Country +import ru.practicum.android.diploma.domain.models.Industries +import ru.practicum.android.diploma.domain.models.Region +import ru.practicum.android.diploma.domain.models.SaveFiltersSharedPrefs import ru.practicum.android.diploma.ui.state.FilterScreenState -class FilterViewModel : ViewModel() { +class FilterViewModel( + private val interactor: FilterInteractor +) : ViewModel() { private val screenStateLiveData = MutableLiveData() + private val _filtersSave = MutableLiveData() + val sharedPrefs: LiveData + get() = _filtersSave + + private val _country = MutableLiveData() + private val _region = MutableLiveData() + private val _currency = MutableLiveData() + private val _noCurrency = MutableLiveData() + private val _industry = MutableLiveData() + + fun readSharedPrefs() { + viewModelScope.launch { + _filtersSave.postValue(interactor.readSharedPrefs()) + } + } + + fun clearSharedPrefs() { + viewModelScope.launch { + interactor.clearSharedPrefs() + } + } + fun render(): LiveData { return screenStateLiveData } fun saveFilter() { viewModelScope.launch(Dispatchers.IO) { + interactor.writeSharedPrefs( + SaveFiltersSharedPrefs( + industries = _industry.value, + country = _country.value, + region = _region.value, + currency = _currency.value, + noCurrency = _noCurrency.value + ) + ) } } @@ -47,4 +85,24 @@ class FilterViewModel : ViewModel() { } + fun setCountrySelected(country: Country) { + _country.postValue(country) + } + + fun setRegionSelected(region: Region) { + _region.postValue(region) + } + + fun setCurrencySelected(currency: Int) { + _currency.postValue(currency) + } + + fun setNoCurrencySelected(answer: Boolean) { + _noCurrency.postValue(answer) + } + + fun setIndustrySelected(industries: Industries?) { + _industry.postValue(industries) + } + } diff --git a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt index a726784db1..56717cc6d2 100644 --- a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt +++ b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt @@ -22,8 +22,11 @@ import org.koin.androidx.viewmodel.ext.android.viewModel import ru.practicum.android.diploma.R import ru.practicum.android.diploma.databinding.FragmentFilterBinding import ru.practicum.android.diploma.domain.models.Country +import ru.practicum.android.diploma.domain.models.Industries import ru.practicum.android.diploma.domain.models.Region import ru.practicum.android.diploma.presentation.viewmodels.FilterViewModel +import ru.practicum.android.diploma.ui.fragments.FilterIndustryFragment.Companion.INDUSTRY_ITEM_KEY +import ru.practicum.android.diploma.ui.fragments.FilterIndustryFragment.Companion.INDUSTRY_KEY import ru.practicum.android.diploma.ui.fragments.FilterPlaceOfWorkFragment.Companion.PLACE_OF_WORK_COUNTRY_KEY import ru.practicum.android.diploma.ui.fragments.FilterPlaceOfWorkFragment.Companion.PLACE_OF_WORK_KEY import ru.practicum.android.diploma.ui.fragments.FilterPlaceOfWorkFragment.Companion.PLACE_OF_WORK_REGION_KEY @@ -52,6 +55,7 @@ class FilterFragment : Fragment() { binding.salary.doOnTextChanged { text, _, _, _ -> if (!text.isNullOrEmpty()) { binding.btnGroup.isVisible = true + viewModel.setCurrencySelected(text.toString().toInt()) } else { checkFields() } @@ -71,9 +75,11 @@ class FilterFragment : Fragment() { setNoIndustryEndIcon() setNoCountryEndIcon() setButtonsNotVisible() + viewModel.clearSharedPrefs() } is FilterScreenState.Industry -> { + binding.industryTextInput.setText(state.industry) setIndustryEndIcon() } @@ -91,6 +97,39 @@ class FilterFragment : Fragment() { } } + + viewModel.readSharedPrefs() + if (true) { + viewModel.sharedPrefs.observe(viewLifecycleOwner) { filters -> + if (filters.industries != null) { + viewModel.setIndustry(filters.industries.name) + viewModel.setIndustrySelected(filters.industries) + } + + if (filters.noCurrency != null) { + binding.salaryFlagCheckbox.isChecked = filters.noCurrency + viewModel.setNoCurrencySelected(filters.noCurrency) + } + + if (filters.currency != null) { + binding.salary.setText(filters.currency.toString()) + viewModel.setCurrencySelected(filters.currency) + } + + if (filters.country != null) { + val placeOfWork = StringBuilder() + placeOfWork.append(filters.country.name) + if (filters.region != null) { + placeOfWork.append(", ").append(filters.region.name) + viewModel.setRegionSelected(filters.region) + } + viewModel.setPlaceOfWork(placeOfWork.toString()) + viewModel.setCountrySelected(filters.country) + } + + } + + } } private fun checkFields() { @@ -128,17 +167,31 @@ class FilterFragment : Fragment() { placeOfWork.append(country.name) if (region.name.isNotEmpty()) { placeOfWork.append(", ").append(region.name) + viewModel.setRegionSelected(region) } viewModel.setPlaceOfWork(placeOfWork.toString()) + viewModel.setCountrySelected(country) + } + + setFragmentResultListener(INDUSTRY_KEY) { _, bundle -> + val industryJson = bundle.getString(INDUSTRY_ITEM_KEY).toString() + val type = object : TypeToken() {}.type + val industry = Gson().fromJson(industryJson, type) + viewModel.setIndustry(industry.name.toString()) + viewModel.setIndustrySelected(industry) } } private fun initButtonListeners() { binding.filterSettingsTitle.setNavigationOnClickListener { findNavController().navigateUp() } - binding.applyButton.setOnClickListener { viewModel.saveFilter() } + binding.applyButton.setOnClickListener { + viewModel.saveFilter() + findNavController().popBackStack() + } binding.clearButton.setOnClickListener { viewModel.clear() } // Пример использования Checkbox, если включена опция показа только с зарплатой binding.salaryFlagCheckbox.setOnCheckedChangeListener { _, isChecked -> // + viewModel.setNoCurrencySelected(isChecked) // viewModel.setSalaryOnlyCheckbox(isChecked) } binding.workTextInput.setOnClickListener { diff --git a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterIndustryFragment.kt b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterIndustryFragment.kt index ededf51239..c345ec3e76 100644 --- a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterIndustryFragment.kt +++ b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterIndustryFragment.kt @@ -4,12 +4,15 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.os.bundleOf import androidx.core.view.isVisible import androidx.core.widget.doOnTextChanged import androidx.fragment.app.Fragment +import androidx.fragment.app.setFragmentResult import androidx.navigation.fragment.findNavController import by.kirich1409.viewbindingdelegate.CreateMethod import by.kirich1409.viewbindingdelegate.viewBinding +import com.google.gson.Gson import org.koin.androidx.viewmodel.ext.android.viewModel import ru.practicum.android.diploma.databinding.FragmentSelectIndustryBinding import ru.practicum.android.diploma.presentation.viewmodels.FilterIndustryViewModel @@ -17,12 +20,17 @@ import ru.practicum.android.diploma.util.adapter.industry.IndustryAdapter class FilterIndustryFragment : Fragment() { + companion object { + const val INDUSTRY_KEY = "industryKey" + const val INDUSTRY_ITEM_KEY = "INDUSTRY_ITEM_KEY" + } + private val binding: FragmentSelectIndustryBinding by viewBinding(CreateMethod.INFLATE) private val viewModel: FilterIndustryViewModel by viewModel() private val adapter by lazy { IndustryAdapter( - onClick = { - + onClick = { industryList -> + viewModel.itemChecked(industryList) } ) } @@ -44,6 +52,10 @@ class FilterIndustryFragment : Fragment() { adapter.industry = list } + viewModel.hasSelected.observe(viewLifecycleOwner) { + binding.applyButton.isVisible = it + } + binding.industrySearchQuery.doOnTextChanged { text, start, before, count -> if (binding.industrySearchQuery.text.isNotEmpty()) { binding.searchIconLoupe.isVisible = false @@ -54,9 +66,20 @@ class FilterIndustryFragment : Fragment() { } } + binding.clearCrossIc.setOnClickListener { + binding.industrySearchQuery.setText("") + } + binding.industryFilterToolbar.setNavigationOnClickListener { findNavController().navigateUp() } + + binding.applyButton.setOnClickListener { + val json = Gson().toJson(viewModel.selectedIndustry.value) + setFragmentResult(INDUSTRY_KEY, bundleOf(INDUSTRY_ITEM_KEY to json)) + findNavController().popBackStack() + } + viewModel.readSharedPrefs() } } diff --git a/app/src/main/java/ru/practicum/android/diploma/util/adapter/industry/IndustryViewHolder.kt b/app/src/main/java/ru/practicum/android/diploma/util/adapter/industry/IndustryViewHolder.kt index 7ef622011a..156b3c3d09 100644 --- a/app/src/main/java/ru/practicum/android/diploma/util/adapter/industry/IndustryViewHolder.kt +++ b/app/src/main/java/ru/practicum/android/diploma/util/adapter/industry/IndustryViewHolder.kt @@ -7,9 +7,10 @@ import ru.practicum.android.diploma.domain.models.Industries class IndustryViewHolder( private val binding: IndustryItemViewBinding, private val onClick: (Industries) -> Unit -) :RecyclerView.ViewHolder(binding.root) { +) : RecyclerView.ViewHolder(binding.root) { fun bind(item: Industries) { binding.industryUnit.text = item.name + binding.roundButton.isChecked = item.isChecked binding.root.setOnClickListener { onClick(item) } diff --git a/app/src/main/java/ru/practicum/android/diploma/util/extension/BundleExt.kt b/app/src/main/java/ru/practicum/android/diploma/util/extension/BundleExt.kt new file mode 100644 index 0000000000..6b9927a5a0 --- /dev/null +++ b/app/src/main/java/ru/practicum/android/diploma/util/extension/BundleExt.kt @@ -0,0 +1,7 @@ +package ru.practicum.android.diploma.util.extension + +import android.os.Bundle +import androidx.core.os.BundleCompat + +inline fun Bundle.parcelable(key: String): T? = + BundleCompat.getParcelable(this, key, T::class.java) diff --git a/app/src/main/res/layout/fragment_filter.xml b/app/src/main/res/layout/fragment_filter.xml index 4e26d65535..778c7d06ad 100644 --- a/app/src/main/res/layout/fragment_filter.xml +++ b/app/src/main/res/layout/fragment_filter.xml @@ -78,7 +78,6 @@ android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/margin_size_16" android:layout_marginTop="@dimen/margin_size_24" - android:hint="@string/salary_expectation" app:cursorColor="@color/blue" app:endIconDrawable="@drawable/ic_close_cross_14px" diff --git a/app/src/main/res/layout/industry_item_view.xml b/app/src/main/res/layout/industry_item_view.xml index 1db3bc7261..e208f9137e 100644 --- a/app/src/main/res/layout/industry_item_view.xml +++ b/app/src/main/res/layout/industry_item_view.xml @@ -26,8 +26,9 @@ android:id="@+id/round_button" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:gravity="center" android:buttonTint="@color/blue" + android:clickable="false" + android:gravity="center" app:layout_constraintBottom_toBottomOf="@id/industry_unit" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/industry_unit" /> From b5b0d0c2fcff2c10fe01f24fd0eb2f7c5e581701 Mon Sep 17 00:00:00 2001 From: AndreyRyabitckiy Date: Mon, 19 Aug 2024 22:44:47 +0300 Subject: [PATCH 05/12] Fix4 --- .../data/impl/SharedPrefsRepositoryImpl.kt | 10 ++++- .../viewmodels/FilterIndustryViewModel.kt | 40 ++++++++++++++---- .../viewmodels/FilterPlaceOfWorkViewModel.kt | 24 +++++++++++ .../viewmodels/FilterViewModel.kt | 42 ++++++++++++------- .../diploma/ui/fragments/FilterFragment.kt | 10 ++--- .../ui/fragments/FilterIndustryFragment.kt | 3 +- .../ui/fragments/FilterPlaceOfWorkFragment.kt | 19 +++++++++ 7 files changed, 117 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt b/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt index 8f70b1cf8d..7db63a213a 100644 --- a/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt +++ b/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt @@ -23,7 +23,15 @@ class SharedPrefsRepositoryImpl( } override suspend fun writeSharedPrefs(filters: SaveFiltersSharedPrefs) { - sharedPreferences.edit().putString(HISTORY, gson.toJson(filters)).apply() + val oldShared = readSharedPrefs() + val newShared = oldShared.copy( + industries = filters.industries ?: oldShared.industries, + country = filters.country ?: oldShared.country, + region = filters.region ?: oldShared.region, + currency = filters.currency ?: oldShared.currency, + noCurrency = filters.noCurrency ?: oldShared.noCurrency, + ) + sharedPreferences.edit().putString(HISTORY, gson.toJson(newShared)).apply() } override suspend fun clearSharedPrefs() { diff --git a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt index 8682fea2bc..4b1551c098 100644 --- a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt +++ b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt @@ -7,6 +7,7 @@ import androidx.lifecycle.viewModelScope import kotlinx.coroutines.launch import ru.practicum.android.diploma.domain.FilterInteractor import ru.practicum.android.diploma.domain.models.Industries +import ru.practicum.android.diploma.domain.models.SaveFiltersSharedPrefs import ru.practicum.android.diploma.util.ResponseData class FilterIndustryViewModel( @@ -26,10 +27,25 @@ class FilterIndustryViewModel( fun updateListIndustries() { viewModelScope.launch { + val industry = interactor.readSharedPrefs()?.industries interactor.getIndustries().collect { list -> when (list) { is ResponseData.Data -> { - _industries.postValue(list.value) + if (industry != null) { + val newList = ArrayList() + list.value.forEach { industryItem -> + if (industryItem.id == industry.id) { + newList.add(industryItem.copy(isChecked = true)) + _selectedIndustry.postValue(industryItem) + _hasSelected.postValue(true) + } else { + newList.add(industryItem) + } + } + _industries.postValue(newList) + } else { + _industries.postValue(list.value) + } } is ResponseData.Error -> {} @@ -38,6 +54,20 @@ class FilterIndustryViewModel( } } + fun writeSharedPrefs() { + viewModelScope.launch { + interactor.writeSharedPrefs( + SaveFiltersSharedPrefs( + industries = _selectedIndustry.value, + null, + null, + null, + null + ) + ) + } + } + fun itemChecked(industries: Industries) { val newList = ArrayList() _industries.value?.forEach { industry -> @@ -52,13 +82,5 @@ class FilterIndustryViewModel( } _industries.postValue(newList) } - - fun readSharedPrefs() { - viewModelScope.launch { - val industry = interactor.readSharedPrefs()?.industries - if (industry != null) - itemChecked(industry) - } - } } diff --git a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterPlaceOfWorkViewModel.kt b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterPlaceOfWorkViewModel.kt index fe63a30e48..f646d92805 100644 --- a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterPlaceOfWorkViewModel.kt +++ b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterPlaceOfWorkViewModel.kt @@ -9,6 +9,7 @@ import kotlinx.coroutines.launch import ru.practicum.android.diploma.domain.FilterInteractor import ru.practicum.android.diploma.domain.models.Country import ru.practicum.android.diploma.domain.models.Region +import ru.practicum.android.diploma.domain.models.SaveFiltersSharedPrefs import ru.practicum.android.diploma.ui.state.PlaceOfWorkScreenState import ru.practicum.android.diploma.util.ResponseData @@ -17,6 +18,9 @@ class FilterPlaceOfWorkViewModel( ) : ViewModel() { private val screenStateLiveData = MutableLiveData() + private val _filtersSave = MutableLiveData() + val sharedPrefs: LiveData + get() = _filtersSave fun render(): LiveData { return screenStateLiveData @@ -42,6 +46,20 @@ class FilterPlaceOfWorkViewModel( } } + fun saveSharedPrefs(country: Country?, region: Region?) { + viewModelScope.launch { + filterInteractor.writeSharedPrefs( + SaveFiltersSharedPrefs( + industries = null, + country = country, + region = region, + currency = null, + noCurrency = null + ) + ) + } + } + fun saveFields(country: Country, region: Region) { if (country.name.isEmpty()) { getCountryName(region, true) @@ -77,4 +95,10 @@ class FilterPlaceOfWorkViewModel( private fun setState(state: PlaceOfWorkScreenState) { screenStateLiveData.postValue(state) } + + fun readSharedPrefs() { + viewModelScope.launch { + _filtersSave.postValue(filterInteractor.readSharedPrefs()) + } + } } diff --git a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterViewModel.kt b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterViewModel.kt index 4716a28ce4..06eba53342 100644 --- a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterViewModel.kt +++ b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterViewModel.kt @@ -45,20 +45,6 @@ class FilterViewModel( return screenStateLiveData } - fun saveFilter() { - viewModelScope.launch(Dispatchers.IO) { - interactor.writeSharedPrefs( - SaveFiltersSharedPrefs( - industries = _industry.value, - country = _country.value, - region = _region.value, - currency = _currency.value, - noCurrency = _noCurrency.value - ) - ) - } - } - fun clear() { setState(FilterScreenState.ClearState) } @@ -97,6 +83,34 @@ class FilterViewModel( _currency.postValue(currency) } + fun saveSharedPrefsCurrency(currency: Int) { + viewModelScope.launch(Dispatchers.IO) { + interactor.writeSharedPrefs( + SaveFiltersSharedPrefs( + industries = null, + country = null, + region = null, + currency = currency, + noCurrency = null + ) + ) + } + } + + fun saveSharedPrefsNoCurrency(noCurrency: Boolean) { + viewModelScope.launch(Dispatchers.IO) { + interactor.writeSharedPrefs( + SaveFiltersSharedPrefs( + industries = null, + country = null, + region = null, + currency = null, + noCurrency = noCurrency + ) + ) + } + } + fun setNoCurrencySelected(answer: Boolean) { _noCurrency.postValue(answer) } diff --git a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt index 56717cc6d2..dd3dde21a7 100644 --- a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt +++ b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt @@ -36,7 +36,7 @@ class FilterFragment : Fragment() { private val binding: FragmentFilterBinding by viewBinding(CreateMethod.INFLATE) private val viewModel by viewModel() - + private var init = true private var regionId = "" override fun onCreateView( inflater: LayoutInflater, @@ -56,6 +56,7 @@ class FilterFragment : Fragment() { if (!text.isNullOrEmpty()) { binding.btnGroup.isVisible = true viewModel.setCurrencySelected(text.toString().toInt()) + viewModel.saveSharedPrefsCurrency(text.toString().toInt()) } else { checkFields() } @@ -99,7 +100,7 @@ class FilterFragment : Fragment() { viewModel.readSharedPrefs() - if (true) { + if (init) { viewModel.sharedPrefs.observe(viewLifecycleOwner) { filters -> if (filters.industries != null) { viewModel.setIndustry(filters.industries.name) @@ -126,9 +127,8 @@ class FilterFragment : Fragment() { viewModel.setPlaceOfWork(placeOfWork.toString()) viewModel.setCountrySelected(filters.country) } - } - + init = false } } @@ -185,12 +185,12 @@ class FilterFragment : Fragment() { private fun initButtonListeners() { binding.filterSettingsTitle.setNavigationOnClickListener { findNavController().navigateUp() } binding.applyButton.setOnClickListener { - viewModel.saveFilter() findNavController().popBackStack() } binding.clearButton.setOnClickListener { viewModel.clear() } // Пример использования Checkbox, если включена опция показа только с зарплатой binding.salaryFlagCheckbox.setOnCheckedChangeListener { _, isChecked -> // + viewModel.saveSharedPrefsNoCurrency(isChecked) viewModel.setNoCurrencySelected(isChecked) // viewModel.setSalaryOnlyCheckbox(isChecked) } diff --git a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterIndustryFragment.kt b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterIndustryFragment.kt index c345ec3e76..43bdd093e9 100644 --- a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterIndustryFragment.kt +++ b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterIndustryFragment.kt @@ -77,9 +77,8 @@ class FilterIndustryFragment : Fragment() { binding.applyButton.setOnClickListener { val json = Gson().toJson(viewModel.selectedIndustry.value) setFragmentResult(INDUSTRY_KEY, bundleOf(INDUSTRY_ITEM_KEY to json)) + viewModel.writeSharedPrefs() findNavController().popBackStack() } - viewModel.readSharedPrefs() } - } diff --git a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterPlaceOfWorkFragment.kt b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterPlaceOfWorkFragment.kt index 981717a824..f757db0032 100644 --- a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterPlaceOfWorkFragment.kt +++ b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterPlaceOfWorkFragment.kt @@ -45,6 +45,7 @@ class FilterPlaceOfWorkFragment : Fragment() { private var countryId = "" private var country = Country("", "") private var region = Region("", "", null) + private var init = true override fun onCreateView( @@ -58,6 +59,21 @@ class FilterPlaceOfWorkFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + viewModel.readSharedPrefs() + if (init) { + viewModel.sharedPrefs.observe(viewLifecycleOwner) { filters -> + if (filters.country != null) { + viewModel.setCountryName(country) + if (filters.region != null) { + region = filters.region + viewModel.setRegionName(filters.region.name) + getCountryName(region) + } + } + } + init = false + } + initButtonListeners() initTextBehaviour() initResultListeners() @@ -124,6 +140,8 @@ class FilterPlaceOfWorkFragment : Fragment() { country = Gson().fromJson(json, type) countryId = country.id viewModel.setCountryName(country) + setNoRegionEndIcon() + binding.regionTextInput.setText("") } setFragmentResultListener(REGION_REQUEST_KEY) { _, bundle -> @@ -172,6 +190,7 @@ class FilterPlaceOfWorkFragment : Fragment() { } private fun saveFilters() { + viewModel.saveSharedPrefs(country, region) viewModel.saveFields(country, region) } From 569d7533ef8ec3bc16784aa2455ede541842765f Mon Sep 17 00:00:00 2001 From: AndreyRyabitckiy Date: Mon, 19 Aug 2024 23:06:54 +0300 Subject: [PATCH 06/12] Fix4.1 --- .../practicum/android/diploma/ui/fragments/FilterFragment.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt index dd3dde21a7..645ea7b728 100644 --- a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt +++ b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt @@ -120,8 +120,8 @@ class FilterFragment : Fragment() { if (filters.country != null) { val placeOfWork = StringBuilder() placeOfWork.append(filters.country.name) - if (filters.region != null) { - placeOfWork.append(", ").append(filters.region.name) + if (filters.region?.name ?: "" != "") { + placeOfWork.append(", ").append(filters.region!!.name ) viewModel.setRegionSelected(filters.region) } viewModel.setPlaceOfWork(placeOfWork.toString()) From efc9f8e825739ae9df746d1cdbf2542a134f0185 Mon Sep 17 00:00:00 2001 From: AndreyRyabitckiy Date: Mon, 19 Aug 2024 23:12:56 +0300 Subject: [PATCH 07/12] Fix4.2 --- .../data/impl/SharedPrefsRepositoryImpl.kt | 2 -- .../viewmodels/FilterIndustryViewModel.kt | 19 +++++++++---------- .../diploma/ui/fragments/FilterFragment.kt | 3 +-- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt b/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt index 7db63a213a..216c9ac677 100644 --- a/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt +++ b/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt @@ -18,8 +18,6 @@ class SharedPrefsRepositoryImpl( null ) return gson.fromJson(json, SaveFiltersSharedPrefs::class.java) - - } override suspend fun writeSharedPrefs(filters: SaveFiltersSharedPrefs) { diff --git a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt index 4b1551c098..93cff6af8d 100644 --- a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt +++ b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt @@ -17,14 +17,6 @@ class FilterIndustryViewModel( val industries: LiveData> get() = _industries - private val _hasSelected = MutableLiveData(false) - val hasSelected: LiveData - get() = _hasSelected - - private val _selectedIndustry = MutableLiveData() - val selectedIndustry: LiveData - get() = _selectedIndustry - fun updateListIndustries() { viewModelScope.launch { val industry = interactor.readSharedPrefs()?.industries @@ -54,6 +46,14 @@ class FilterIndustryViewModel( } } + private val _hasSelected = MutableLiveData(false) + val hasSelected: LiveData + get() = _hasSelected + + private val _selectedIndustry = MutableLiveData() + val selectedIndustry: LiveData + get() = _selectedIndustry + fun writeSharedPrefs() { viewModelScope.launch { interactor.writeSharedPrefs( @@ -74,8 +74,7 @@ class FilterIndustryViewModel( if (industry.id == industries.id) { newList.add(industry.copy(isChecked = !industry.isChecked)) _hasSelected.postValue(!industry.isChecked) - if (!industry.isChecked) - _selectedIndustry.postValue(industry) + if (!industry.isChecked) _selectedIndustry.postValue(industry) } else { newList.add(industry.copy(isChecked = false)) } diff --git a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt index 645ea7b728..73580133b4 100644 --- a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt +++ b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt @@ -98,7 +98,6 @@ class FilterFragment : Fragment() { } } - viewModel.readSharedPrefs() if (init) { viewModel.sharedPrefs.observe(viewLifecycleOwner) { filters -> @@ -121,7 +120,7 @@ class FilterFragment : Fragment() { val placeOfWork = StringBuilder() placeOfWork.append(filters.country.name) if (filters.region?.name ?: "" != "") { - placeOfWork.append(", ").append(filters.region!!.name ) + placeOfWork.append(", ").append(filters.region!!.name) viewModel.setRegionSelected(filters.region) } viewModel.setPlaceOfWork(placeOfWork.toString()) From 971195a743db33706572845c98de7bdb7a528dbb Mon Sep 17 00:00:00 2001 From: AndreyRyabitckiy Date: Mon, 19 Aug 2024 23:18:39 +0300 Subject: [PATCH 08/12] Fix4.3 --- .../viewmodels/FilterIndustryViewModel.kt | 62 ++++++++++--------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt index 93cff6af8d..5e9cb58c48 100644 --- a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt +++ b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterIndustryViewModel.kt @@ -17,35 +17,6 @@ class FilterIndustryViewModel( val industries: LiveData> get() = _industries - fun updateListIndustries() { - viewModelScope.launch { - val industry = interactor.readSharedPrefs()?.industries - interactor.getIndustries().collect { list -> - when (list) { - is ResponseData.Data -> { - if (industry != null) { - val newList = ArrayList() - list.value.forEach { industryItem -> - if (industryItem.id == industry.id) { - newList.add(industryItem.copy(isChecked = true)) - _selectedIndustry.postValue(industryItem) - _hasSelected.postValue(true) - } else { - newList.add(industryItem) - } - } - _industries.postValue(newList) - } else { - _industries.postValue(list.value) - } - } - - is ResponseData.Error -> {} - } - } - } - } - private val _hasSelected = MutableLiveData(false) val hasSelected: LiveData get() = _hasSelected @@ -81,5 +52,38 @@ class FilterIndustryViewModel( } _industries.postValue(newList) } + + fun updateListIndustries() { + viewModelScope.launch { + val industry = interactor.readSharedPrefs()?.industries + interactor.getIndustries().collect { list -> + when (list) { + is ResponseData.Data -> { + whenList(industry, list) + } + + is ResponseData.Error -> {} + } + } + } + } + + fun whenList(industry: Industries?, list: ResponseData.Data>) { + if (industry != null) { + val newList = ArrayList() + list.value.forEach { industryItem -> + if (industryItem.id == industry.id) { + newList.add(industryItem.copy(isChecked = true)) + _selectedIndustry.postValue(industryItem) + _hasSelected.postValue(true) + } else { + newList.add(industryItem) + } + } + _industries.postValue(newList) + } else { + _industries.postValue(list.value) + } + } } From 95397e9be8cea74a1eb3568dcf77194b64d29ab7 Mon Sep 17 00:00:00 2001 From: Elchin Gasymov Date: Tue, 20 Aug 2024 13:30:40 +0300 Subject: [PATCH 09/12] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=84=D0=BB=D0=B8=D0=BA=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/practicum/android/diploma/ui/fragments/FilterFragment.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt index 35ef9e01de..fa6c543962 100644 --- a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt +++ b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt @@ -185,8 +185,6 @@ class FilterFragment : Fragment() { return placeOfWork.toString() } - - private fun initButtonListeners() { binding.filterSettingsTitle.setNavigationOnClickListener { findNavController().navigateUp() } binding.applyButton.setOnClickListener { saveFilterSettings() } From 4c83d95a42b97ebae12bf0dd20cb3b116d701524 Mon Sep 17 00:00:00 2001 From: Vitaliy Molodanov <53826004+Logomann@users.noreply.github.com> Date: Tue, 20 Aug 2024 15:39:57 +0300 Subject: [PATCH 10/12] search fix2 --- .../data/impl/SharedPrefsRepositoryImpl.kt | 13 ++-- .../viewmodels/FilterViewModel.kt | 61 ------------------- .../diploma/ui/fragments/FilterFragment.kt | 9 +-- .../practicum/android/diploma/util/Options.kt | 20 +++--- 4 files changed, 24 insertions(+), 79 deletions(-) diff --git a/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt b/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt index 56cd365c4a..52b641d2df 100644 --- a/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt +++ b/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt @@ -3,6 +3,9 @@ package ru.practicum.android.diploma.data.impl import android.content.SharedPreferences import com.google.gson.Gson import ru.practicum.android.diploma.domain.SharedPrefsRepository +import ru.practicum.android.diploma.domain.models.Country +import ru.practicum.android.diploma.domain.models.Industries +import ru.practicum.android.diploma.domain.models.Region import ru.practicum.android.diploma.domain.models.SaveFiltersSharedPrefs class SharedPrefsRepositoryImpl( @@ -11,10 +14,10 @@ class SharedPrefsRepositoryImpl( ) : SharedPrefsRepository { override suspend fun readSharedPrefs(): SaveFiltersSharedPrefs { val json = sharedPreferences.getString(HISTORY, null) ?: return SaveFiltersSharedPrefs( - null, - null, - null, - null, + Industries("","",false), + Country("",""), + Region("","",null), + "", false ) return gson.fromJson(json, SaveFiltersSharedPrefs::class.java) @@ -27,7 +30,7 @@ class SharedPrefsRepositoryImpl( country = filters.country ?: oldShared.country, region = filters.region ?: oldShared.region, currency = filters.currency ?: oldShared.currency, - noCurrency = filters.noCurrency ?: oldShared.noCurrency, + noCurrency = filters.noCurrency ) sharedPreferences.edit().putString(HISTORY, gson.toJson(newShared)).apply() } diff --git a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterViewModel.kt b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterViewModel.kt index c1cec57640..3b616c98f3 100644 --- a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterViewModel.kt +++ b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterViewModel.kt @@ -8,9 +8,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import ru.practicum.android.diploma.domain.FilterInteractor import ru.practicum.android.diploma.domain.models.SaveFiltersSharedPrefs -import ru.practicum.android.diploma.domain.models.Country import ru.practicum.android.diploma.domain.models.Industries -import ru.practicum.android.diploma.domain.models.Region import ru.practicum.android.diploma.ui.state.FilterScreenState class FilterViewModel( @@ -19,28 +17,9 @@ class FilterViewModel( private val screenStateLiveData = MutableLiveData() - private val _filtersSave = MutableLiveData() - val sharedPrefs: LiveData - get() = _filtersSave - - private val _country = MutableLiveData() - private val _region = MutableLiveData() - private val _currency = MutableLiveData() private val _noCurrency = MutableLiveData() private val _industry = MutableLiveData() - fun readSharedPrefs() { - viewModelScope.launch { - _filtersSave.postValue(filterInteractor.readSharedPrefs()) - } - } - - fun clearSharedPrefs() { - viewModelScope.launch { - filterInteractor.clearSharedPrefs() - } - } - fun render(): LiveData { return screenStateLiveData } @@ -92,48 +71,8 @@ class FilterViewModel( } else { setState(FilterScreenState.NoPlaceOfWork) } - - } - - fun setCountrySelected(country: Country) { - _country.postValue(country) - } - - fun setRegionSelected(region: Region) { - _region.postValue(region) - } - - fun setCurrencySelected(currency: Int) { - _currency.postValue(currency) - } - - fun saveSharedPrefsCurrency(currency: Int) { - viewModelScope.launch(Dispatchers.IO) { - filterInteractor.writeSharedPrefs( - SaveFiltersSharedPrefs( - industries = null, - country = null, - region = null, - currency = currency.toString(), - noCurrency = false - ) - ) - } } - fun saveSharedPrefsNoCurrency(noCurrency: Boolean) { - viewModelScope.launch(Dispatchers.IO) { - filterInteractor.writeSharedPrefs( - SaveFiltersSharedPrefs( - industries = null, - country = null, - region = null, - currency = null, - noCurrency = noCurrency - ) - ) - } - } fun setNoCurrencySelected(answer: Boolean) { _noCurrency.postValue(answer) diff --git a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt index fa6c543962..386303bcc1 100644 --- a/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt +++ b/app/src/main/java/ru/practicum/android/diploma/ui/fragments/FilterFragment.kt @@ -67,8 +67,7 @@ class FilterFragment : Fragment() { binding.salary.doOnTextChanged { text, _, _, _ -> if (!text.isNullOrEmpty()) { binding.btnGroup.isVisible = true - viewModel.setCurrencySelected(text.toString().toInt()) - viewModel.saveSharedPrefsCurrency(text.toString().toInt()) + viewModel.saveFilter(makeFilterSettings()) } else { checkFields() } @@ -101,6 +100,7 @@ class FilterFragment : Fragment() { binding.industryTextInput.text?.clear() setNoIndustryEndIcon() checkFields() + industries = Industries("", "", false) } FilterScreenState.NoPlaceOfWork -> { @@ -169,7 +169,8 @@ class FilterFragment : Fragment() { val industryJson = bundle.getString(INDUSTRY_ITEM_KEY).toString() val type = object : TypeToken() {}.type val industry = Gson().fromJson(industryJson, type) - viewModel.setIndustry(industry.name.toString()) + industries = industry + viewModel.setIndustry(industry.name) viewModel.setIndustrySelected(industry) } } @@ -191,7 +192,7 @@ class FilterFragment : Fragment() { binding.clearButton.setOnClickListener { viewModel.clear() } // Пример использования Checkbox, если включена опция показа только с зарплатой binding.salaryFlagCheckbox.setOnCheckedChangeListener { _, isChecked -> // - viewModel.saveSharedPrefsNoCurrency(isChecked) + viewModel.saveFilter(makeFilterSettings()) viewModel.setNoCurrencySelected(isChecked) // viewModel.setSalaryOnlyCheckbox(isChecked) } diff --git a/app/src/main/java/ru/practicum/android/diploma/util/Options.kt b/app/src/main/java/ru/practicum/android/diploma/util/Options.kt index 01a5f32383..b87e137cc8 100644 --- a/app/src/main/java/ru/practicum/android/diploma/util/Options.kt +++ b/app/src/main/java/ru/practicum/android/diploma/util/Options.kt @@ -11,15 +11,17 @@ data class Options( ) { companion object { fun toMap(options: Options): Map = with(options) { - listOfNotNull( - "text" to searchText, - "per_page" to itemsPerPage.toString(), - "page" to page.toString(), - if (area?.isNotEmpty() == true) "area" to area.toString() else null, - if (industry?.isNotEmpty() == true) "industry" to area.toString() else null, - if (salary?.isNotEmpty() == true) "salary" to area.toString() else null, - "only_with_salary" to withSalary.toString() - ).toMap() + buildMap { + put("text", searchText) + put("per_page", itemsPerPage.toString()) + put("page", page.toString()) + if (area?.isNotEmpty() == true) { + put("area", area.toString()) + } + if (industry?.isNotEmpty() == true) put("industry", industry.toString()) + if (salary?.isNotEmpty() == true) put("salary", salary.toString()) + put("only_with_salary", withSalary.toString()) + } } } } From 4cdf0a93701f4bd6ea8b7ae9ef529298e1d9ccc6 Mon Sep 17 00:00:00 2001 From: Vitaliy Molodanov <53826004+Logomann@users.noreply.github.com> Date: Tue, 20 Aug 2024 15:43:20 +0300 Subject: [PATCH 11/12] search fix3 --- .../android/diploma/data/impl/SharedPrefsRepositoryImpl.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt b/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt index 52b641d2df..22a82308d1 100644 --- a/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt +++ b/app/src/main/java/ru/practicum/android/diploma/data/impl/SharedPrefsRepositoryImpl.kt @@ -14,9 +14,9 @@ class SharedPrefsRepositoryImpl( ) : SharedPrefsRepository { override suspend fun readSharedPrefs(): SaveFiltersSharedPrefs { val json = sharedPreferences.getString(HISTORY, null) ?: return SaveFiltersSharedPrefs( - Industries("","",false), - Country("",""), - Region("","",null), + Industries("", "", false), + Country("", ""), + Region("", "", null), "", false ) From d339196321a1e9fa74ee6be90c92edd6498caad0 Mon Sep 17 00:00:00 2001 From: Vitaliy Molodanov <53826004+Logomann@users.noreply.github.com> Date: Tue, 20 Aug 2024 15:45:45 +0300 Subject: [PATCH 12/12] search fix4 --- .../android/diploma/presentation/viewmodels/FilterViewModel.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterViewModel.kt b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterViewModel.kt index 3b616c98f3..2769935ea5 100644 --- a/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterViewModel.kt +++ b/app/src/main/java/ru/practicum/android/diploma/presentation/viewmodels/FilterViewModel.kt @@ -73,7 +73,6 @@ class FilterViewModel( } } - fun setNoCurrencySelected(answer: Boolean) { _noCurrency.postValue(answer) } @@ -81,5 +80,4 @@ class FilterViewModel( fun setIndustrySelected(industries: Industries?) { _industry.postValue(industries) } - }