FilterProvider: Inject and manage instances using hilt

This also switchers to default gson instance without any modifier
changes fixing issues happening with missing params.

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2024-05-20 21:12:04 +05:30
parent c23f054d3e
commit 07e09eeb18
4 changed files with 24 additions and 27 deletions

View File

@@ -21,30 +21,28 @@ package com.aurora.store.data.providers
import android.content.Context import android.content.Context
import com.aurora.store.data.Filter import com.aurora.store.data.Filter
import com.aurora.store.data.SingletonHolder
import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.GsonBuilder import dagger.hilt.android.qualifiers.ApplicationContext
import java.lang.reflect.Modifier 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, Context>(::FilterProvider) { companion object {
const val PREFERENCE_FILTER = "PREFERENCE_FILTER" const val PREFERENCE_FILTER = "PREFERENCE_FILTER"
} }
private var gson: Gson = GsonBuilder()
.excludeFieldsWithModifiers(Modifier.TRANSIENT)
.create()
fun getSavedFilter(): Filter { fun getSavedFilter(): Filter {
var rawFilter = Preferences.getString(context, PREFERENCE_FILTER) val rawFilter = Preferences.getString(context, PREFERENCE_FILTER)
if (rawFilter.isEmpty()) return gson.fromJson(rawFilter.ifEmpty { "{}" }, Filter::class.java)
rawFilter = "{}"
return gson.fromJson(rawFilter, Filter::class.java)
} }
fun saveFilter(filter: Filter) { fun saveFilter(filter: Filter) {
Preferences.putString(context, PREFERENCE_FILTER, gson.toJson(filter)) Preferences.putString(context, PREFERENCE_FILTER, gson.toJson(filter))
} }
} }

View File

@@ -34,7 +34,7 @@ import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.data.models.SearchBundle import com.aurora.gplayapi.data.models.SearchBundle
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.Filter 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.databinding.FragmentSearchResultBinding
import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences
import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener 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 searchView: TextInputEditText
private lateinit var sharedPreferences: SharedPreferences private lateinit var sharedPreferences: SharedPreferences
private lateinit var filter: Filter
private var query: String? = null private var query: String? = null
private var searchBundle: SearchBundle = SearchBundle() private var searchBundle: SearchBundle = SearchBundle()
@@ -74,7 +73,6 @@ class SearchResultsFragment : BaseFragment(R.layout.fragment_search_result),
sharedPreferences = Preferences.getPrefs(view.context) sharedPreferences = Preferences.getPrefs(view.context)
sharedPreferences.registerOnSharedPreferenceChangeListener(this) sharedPreferences.registerOnSharedPreferenceChangeListener(this)
filter = FilterProvider.with(view.context).getSavedFilter()
// Toolbar // Toolbar
binding.layoutViewToolbar.apply { binding.layoutViewToolbar.apply {
@@ -121,7 +119,7 @@ class SearchResultsFragment : BaseFragment(R.layout.fragment_search_result),
context?.let { context?.let {
sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) sharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
if (Preferences.getBoolean(it, Preferences.PREFERENCE_FILTER_SEARCH)) { if (Preferences.getBoolean(it, Preferences.PREFERENCE_FILTER_SEARCH)) {
FilterProvider.with(it).saveFilter(Filter()) viewModel.filterProvider.saveFilter(Filter())
} }
} }
super.onDestroyView() super.onDestroyView()
@@ -242,7 +240,7 @@ class SearchResultsFragment : BaseFragment(R.layout.fragment_search_result),
val tempList:MutableList<App> = mutableListOf() val tempList:MutableList<App> = mutableListOf()
tempList.addAll(appList) tempList.addAll(appList)
filter = FilterProvider.with(requireContext()).getSavedFilter() val filter = viewModel.filterProvider.getSavedFilter()
return tempList return tempList
.asSequence() .asSequence()
.filter { it.displayName.isNotEmpty() } // Some of the apps may not have metadata .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?) { override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
if (key == FilterProvider.PREFERENCE_FILTER) { if (key == PREFERENCE_FILTER) query?.let { queryViewModel(it) }
filter = FilterProvider.with(requireContext()).getSavedFilter()
query?.let {
queryViewModel(it)
}
}
} }
} }

View File

@@ -28,6 +28,7 @@ import com.aurora.store.databinding.SheetFilterBinding
import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.google.android.material.chip.Chip import com.google.android.material.chip.Chip
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class FilterSheet : BottomSheetDialogFragment(R.layout.sheet_filter) { class FilterSheet : BottomSheetDialogFragment(R.layout.sheet_filter) {
@@ -35,12 +36,15 @@ class FilterSheet : BottomSheetDialogFragment(R.layout.sheet_filter) {
private var _binding: SheetFilterBinding? = null private var _binding: SheetFilterBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
@Inject
lateinit var filterProvider: FilterProvider
private lateinit var filter: Filter private lateinit var filter: Filter
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = SheetFilterBinding.bind(view) _binding = SheetFilterBinding.bind(view)
filter = FilterProvider.with(requireContext()).getSavedFilter() filter = filterProvider.getSavedFilter()
attachSingleChips() attachSingleChips()
attachMultipleChips() attachMultipleChips()
@@ -54,7 +58,7 @@ class FilterSheet : BottomSheetDialogFragment(R.layout.sheet_filter) {
private fun attachActions() { private fun attachActions() {
binding.btnPositive.setOnClickListener { binding.btnPositive.setOnClickListener {
FilterProvider.with(requireContext()).saveFilter(filter) filterProvider.saveFilter(filter)
dismissAllowingStateLoss() dismissAllowingStateLoss()
} }

View File

@@ -32,6 +32,7 @@ import com.aurora.gplayapi.helpers.SearchHelper
import com.aurora.gplayapi.helpers.WebSearchHelper import com.aurora.gplayapi.helpers.WebSearchHelper
import com.aurora.store.data.network.HttpClient import com.aurora.store.data.network.HttpClient
import com.aurora.store.data.providers.AuthProvider import com.aurora.store.data.providers.AuthProvider
import com.aurora.store.data.providers.FilterProvider
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject import javax.inject.Inject
@@ -42,6 +43,7 @@ import kotlinx.coroutines.supervisorScope
@HiltViewModel @HiltViewModel
@SuppressLint("StaticFieldLeak") // false positive, see https://github.com/google/dagger/issues/3253 @SuppressLint("StaticFieldLeak") // false positive, see https://github.com/google/dagger/issues/3253
class SearchResultViewModel @Inject constructor( class SearchResultViewModel @Inject constructor(
val filterProvider: FilterProvider,
@ApplicationContext private val context: Context @ApplicationContext private val context: Context
) : ViewModel() { ) : ViewModel() {