diff --git a/app/src/main/java/com/aurora/store/data/providers/FilterProvider.kt b/app/src/main/java/com/aurora/store/data/providers/FilterProvider.kt index 27a26137c..880858f34 100644 --- a/app/src/main/java/com/aurora/store/data/providers/FilterProvider.kt +++ b/app/src/main/java/com/aurora/store/data/providers/FilterProvider.kt @@ -21,30 +21,28 @@ package com.aurora.store.data.providers import android.content.Context import com.aurora.store.data.Filter -import com.aurora.store.data.SingletonHolder import com.aurora.store.util.Preferences import com.google.gson.Gson -import com.google.gson.GsonBuilder -import java.lang.reflect.Modifier +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject +import javax.inject.Singleton -class FilterProvider private constructor(var context: Context) { +@Singleton +class FilterProvider @Inject constructor( + private val gson: Gson, + @ApplicationContext private val context: Context +) { - companion object : SingletonHolder(::FilterProvider) { + companion object { const val PREFERENCE_FILTER = "PREFERENCE_FILTER" } - private var gson: Gson = GsonBuilder() - .excludeFieldsWithModifiers(Modifier.TRANSIENT) - .create() - fun getSavedFilter(): Filter { - var rawFilter = Preferences.getString(context, PREFERENCE_FILTER) - if (rawFilter.isEmpty()) - rawFilter = "{}" - return gson.fromJson(rawFilter, Filter::class.java) + val rawFilter = Preferences.getString(context, PREFERENCE_FILTER) + return gson.fromJson(rawFilter.ifEmpty { "{}" }, Filter::class.java) } fun saveFilter(filter: Filter) { Preferences.putString(context, PREFERENCE_FILTER, gson.toJson(filter)) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/aurora/store/view/ui/search/SearchResultsFragment.kt b/app/src/main/java/com/aurora/store/view/ui/search/SearchResultsFragment.kt index fda9f3bc3..221df0f1c 100644 --- a/app/src/main/java/com/aurora/store/view/ui/search/SearchResultsFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/search/SearchResultsFragment.kt @@ -34,7 +34,7 @@ import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.SearchBundle import com.aurora.store.R import com.aurora.store.data.Filter -import com.aurora.store.data.providers.FilterProvider +import com.aurora.store.data.providers.FilterProvider.Companion.PREFERENCE_FILTER import com.aurora.store.databinding.FragmentSearchResultBinding import com.aurora.store.util.Preferences import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener @@ -60,7 +60,6 @@ class SearchResultsFragment : BaseFragment(R.layout.fragment_search_result), private lateinit var searchView: TextInputEditText private lateinit var sharedPreferences: SharedPreferences - private lateinit var filter: Filter private var query: String? = null private var searchBundle: SearchBundle = SearchBundle() @@ -74,7 +73,6 @@ class SearchResultsFragment : BaseFragment(R.layout.fragment_search_result), sharedPreferences = Preferences.getPrefs(view.context) sharedPreferences.registerOnSharedPreferenceChangeListener(this) - filter = FilterProvider.with(view.context).getSavedFilter() // Toolbar binding.layoutViewToolbar.apply { @@ -121,7 +119,7 @@ class SearchResultsFragment : BaseFragment(R.layout.fragment_search_result), context?.let { sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) if (Preferences.getBoolean(it, Preferences.PREFERENCE_FILTER_SEARCH)) { - FilterProvider.with(it).saveFilter(Filter()) + viewModel.filterProvider.saveFilter(Filter()) } } super.onDestroyView() @@ -242,7 +240,7 @@ class SearchResultsFragment : BaseFragment(R.layout.fragment_search_result), val tempList:MutableList = mutableListOf() tempList.addAll(appList) - filter = FilterProvider.with(requireContext()).getSavedFilter() + val filter = viewModel.filterProvider.getSavedFilter() return tempList .asSequence() .filter { it.displayName.isNotEmpty() } // Some of the apps may not have metadata @@ -255,11 +253,6 @@ class SearchResultsFragment : BaseFragment(R.layout.fragment_search_result), } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { - if (key == FilterProvider.PREFERENCE_FILTER) { - filter = FilterProvider.with(requireContext()).getSavedFilter() - query?.let { - queryViewModel(it) - } - } + if (key == PREFERENCE_FILTER) query?.let { queryViewModel(it) } } } diff --git a/app/src/main/java/com/aurora/store/view/ui/sheets/FilterSheet.kt b/app/src/main/java/com/aurora/store/view/ui/sheets/FilterSheet.kt index ef1c13217..1dd652e09 100644 --- a/app/src/main/java/com/aurora/store/view/ui/sheets/FilterSheet.kt +++ b/app/src/main/java/com/aurora/store/view/ui/sheets/FilterSheet.kt @@ -28,6 +28,7 @@ import com.aurora.store.databinding.SheetFilterBinding import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.chip.Chip import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject @AndroidEntryPoint class FilterSheet : BottomSheetDialogFragment(R.layout.sheet_filter) { @@ -35,12 +36,15 @@ class FilterSheet : BottomSheetDialogFragment(R.layout.sheet_filter) { private var _binding: SheetFilterBinding? = null private val binding get() = _binding!! + @Inject + lateinit var filterProvider: FilterProvider + private lateinit var filter: Filter override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) _binding = SheetFilterBinding.bind(view) - filter = FilterProvider.with(requireContext()).getSavedFilter() + filter = filterProvider.getSavedFilter() attachSingleChips() attachMultipleChips() @@ -54,7 +58,7 @@ class FilterSheet : BottomSheetDialogFragment(R.layout.sheet_filter) { private fun attachActions() { binding.btnPositive.setOnClickListener { - FilterProvider.with(requireContext()).saveFilter(filter) + filterProvider.saveFilter(filter) dismissAllowingStateLoss() } diff --git a/app/src/main/java/com/aurora/store/viewmodel/search/SearchResultViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/search/SearchResultViewModel.kt index 562cad72b..3e383730e 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/search/SearchResultViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/search/SearchResultViewModel.kt @@ -32,6 +32,7 @@ import com.aurora.gplayapi.helpers.SearchHelper import com.aurora.gplayapi.helpers.WebSearchHelper import com.aurora.store.data.network.HttpClient import com.aurora.store.data.providers.AuthProvider +import com.aurora.store.data.providers.FilterProvider import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject @@ -42,6 +43,7 @@ import kotlinx.coroutines.supervisorScope @HiltViewModel @SuppressLint("StaticFieldLeak") // false positive, see https://github.com/google/dagger/issues/3253 class SearchResultViewModel @Inject constructor( + val filterProvider: FilterProvider, @ApplicationContext private val context: Context ) : ViewModel() {