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:
@@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user