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 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, Context>(::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))
}
}
}

View File

@@ -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<App> = 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) }
}
}

View File

@@ -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()
}

View File

@@ -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() {