Fragment: Multiple improvements to fragments

* Use viewModels method to get ViewModel instances
* Use view binding as recommended for fragments
* Mark possible variables as private and val

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2024-03-20 12:16:55 +05:30
parent c3bae480c4
commit 5cf7fa6b3c
24 changed files with 201 additions and 307 deletions

View File

@@ -61,12 +61,12 @@ class GoogleFragment : Fragment(R.layout.fragment_google) {
private val binding: FragmentGoogleBinding private val binding: FragmentGoogleBinding
get() = _binding!! get() = _binding!!
private val cookieManager = CookieManager.getInstance()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = FragmentGoogleBinding.bind(view) _binding = FragmentGoogleBinding.bind(view)
val cookieManager = CookieManager.getInstance()
binding.webview.apply { binding.webview.apply {
cookieManager.removeAllCookies(null) cookieManager.removeAllCookies(null)
cookieManager.acceptThirdPartyCookies(this) cookieManager.acceptThirdPartyCookies(this)

View File

@@ -27,7 +27,6 @@ import androidx.fragment.app.FragmentManager
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.adapter.FragmentStateAdapter
import com.aurora.gplayapi.data.models.AuthData
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.providers.AuthProvider import com.aurora.store.data.providers.AuthProvider
import com.aurora.store.databinding.ActivityGenericPagerBinding import com.aurora.store.databinding.ActivityGenericPagerBinding
@@ -42,12 +41,11 @@ class AppsGamesFragment : Fragment(R.layout.activity_generic_pager) {
private val binding: ActivityGenericPagerBinding private val binding: ActivityGenericPagerBinding
get() = _binding!! get() = _binding!!
private lateinit var authData: AuthData
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = ActivityGenericPagerBinding.bind(view) _binding = ActivityGenericPagerBinding.bind(view)
authData = AuthProvider.with(view.context).getAuthData()
val authData = AuthProvider.with(view.context).getAuthData()
// Toolbar // Toolbar
binding.layoutActionToolbar.toolbar.apply { binding.layoutActionToolbar.toolbar.apply {

View File

@@ -20,10 +20,8 @@
package com.aurora.store.view.ui.all package com.aurora.store.view.ui.all
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.databinding.FragmentAppsBinding import com.aurora.store.databinding.FragmentAppsBinding
@@ -35,10 +33,13 @@ import com.aurora.store.viewmodel.all.InstalledViewModel
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint @AndroidEntryPoint
class InstalledAppsFragment : BaseFragment() { class InstalledAppsFragment : BaseFragment(R.layout.fragment_apps) {
private lateinit var VM: InstalledViewModel private var _binding: FragmentAppsBinding? = null
private lateinit var B: FragmentAppsBinding private val binding: FragmentAppsBinding
get() = _binding!!
private val viewModel: InstalledViewModel by viewModels()
companion object { companion object {
@JvmStatic @JvmStatic
@@ -47,36 +48,24 @@ class InstalledAppsFragment : BaseFragment() {
} }
} }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
B = FragmentAppsBinding.bind(
inflater.inflate(
R.layout.fragment_apps,
container,
false
)
)
VM = ViewModelProvider(requireActivity())[InstalledViewModel::class.java]
VM.observe()
return B.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
VM.liveData.observe(viewLifecycleOwner) { _binding = FragmentAppsBinding.bind(view)
viewModel.liveData.observe(viewLifecycleOwner) {
updateController(it) updateController(it)
} }
updateController(null) updateController(null)
} }
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
private fun updateController(appList: List<App>?) { private fun updateController(appList: List<App>?) {
B.recycler.withModels { binding.recycler.withModels {
setFilterDuplicates(true) setFilterDuplicates(true)
if (appList == null) { if (appList == null) {
for (i in 1..10) { for (i in 1..10) {

View File

@@ -20,14 +20,11 @@
package com.aurora.store.view.ui.all package com.aurora.store.view.ui.all
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider
import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.data.models.StreamCluster
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.databinding.FragmentAppsBinding import com.aurora.store.databinding.FragmentAppsBinding
import com.aurora.store.databinding.FragmentUpdatesBinding
import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener
import com.aurora.store.view.epoxy.views.AppProgressViewModel_ import com.aurora.store.view.epoxy.views.AppProgressViewModel_
import com.aurora.store.view.epoxy.views.HeaderViewModel_ import com.aurora.store.view.epoxy.views.HeaderViewModel_
@@ -38,11 +35,13 @@ import com.aurora.store.viewmodel.all.LibraryAppsViewModel
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint @AndroidEntryPoint
class LibraryAppsFragment : BaseFragment() { class LibraryAppsFragment : BaseFragment(R.layout.fragment_apps) {
private lateinit var VM: LibraryAppsViewModel private var _binding: FragmentAppsBinding? = null
private lateinit var B: FragmentAppsBinding private val binding: FragmentAppsBinding
lateinit var endlessRecyclerOnScrollListener: EndlessRecyclerOnScrollListener get() = _binding!!
private val viewModel: LibraryAppsViewModel by viewModels()
companion object { companion object {
@JvmStatic @JvmStatic
@@ -53,45 +52,31 @@ class LibraryAppsFragment : BaseFragment() {
} }
} }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
B = FragmentAppsBinding.bind(
inflater.inflate(
R.layout.fragment_apps,
container,
false
)
)
VM = ViewModelProvider(requireActivity()).get(LibraryAppsViewModel::class.java)
return B.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
VM.liveData.observe(viewLifecycleOwner) { _binding = FragmentAppsBinding.bind(view)
val endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() {
override fun onLoadMore(currentPage: Int) {
viewModel.observe()
}
}
binding.recycler.addOnScrollListener(endlessRecyclerOnScrollListener)
viewModel.liveData.observe(viewLifecycleOwner) {
updateController(it) updateController(it)
} }
attachRecycler()
updateController(null) updateController(null)
} }
private fun attachRecycler() { override fun onDestroyView() {
endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() { super.onDestroyView()
override fun onLoadMore(currentPage: Int) { _binding = null
VM.observe()
}
}
B.recycler.addOnScrollListener(endlessRecyclerOnScrollListener)
} }
private fun updateController(streamCluster: StreamCluster?) { private fun updateController(streamCluster: StreamCluster?) {
B.recycler.withModels { binding.recycler.withModels {
setFilterDuplicates(true) setFilterDuplicates(true)
if (streamCluster == null) { if (streamCluster == null) {
for (i in 1..10) { for (i in 1..10) {

View File

@@ -20,10 +20,8 @@
package com.aurora.store.view.ui.all package com.aurora.store.view.ui.all
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.databinding.FragmentAppsBinding import com.aurora.store.databinding.FragmentAppsBinding
import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener
@@ -36,11 +34,13 @@ import com.aurora.store.viewmodel.all.PurchasedViewModel
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint @AndroidEntryPoint
class PurchasedAppsFragment : BaseFragment() { class PurchasedAppsFragment : BaseFragment(R.layout.fragment_apps) {
private lateinit var VM: PurchasedViewModel private var _binding: FragmentAppsBinding? = null
private lateinit var B: FragmentAppsBinding private val binding: FragmentAppsBinding
lateinit var endlessRecyclerOnScrollListener: EndlessRecyclerOnScrollListener get() = _binding!!
private val viewModel: PurchasedViewModel by viewModels()
companion object { companion object {
@JvmStatic @JvmStatic
@@ -49,48 +49,33 @@ class PurchasedAppsFragment : BaseFragment() {
} }
} }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
B = FragmentAppsBinding.bind(
inflater.inflate(
R.layout.fragment_apps,
container,
false
)
)
VM = ViewModelProvider(requireActivity())[PurchasedViewModel::class.java]
return B.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
VM.liveData.observe(viewLifecycleOwner) { _binding = FragmentAppsBinding.bind(view)
updateController(it)
val endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener(8) {
override fun onLoadMore(currentPage: Int) {
viewModel.observe()
}
} }
attachRecycler() binding.recycler.addOnScrollListener(endlessRecyclerOnScrollListener)
viewModel.liveData.observe(viewLifecycleOwner) {
updateController(it)
}
updateController(null) updateController(null)
} }
private fun attachRecycler() { override fun onDestroyView() {
val endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener(8) { super.onDestroyView()
override fun onLoadMore(currentPage: Int) { _binding = null
VM.observe()
}
}
B.recycler.addOnScrollListener(endlessRecyclerOnScrollListener)
} }
private fun updateController(paginatedAppList: PaginatedAppList?) { private fun updateController(paginatedAppList: PaginatedAppList?) {
B.recycler.withModels { binding.recycler.withModels {
setFilterDuplicates(true) setFilterDuplicates(true)
if (paginatedAppList == null) { if (paginatedAppList == null) {
for (i in 1..10) { for (i in 1..10) {

View File

@@ -22,7 +22,7 @@ package com.aurora.store.view.ui.commons
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.model.Black import com.aurora.store.data.model.Black
@@ -40,17 +40,17 @@ class BlacklistFragment : Fragment(R.layout.activity_generic_recycler) {
private val binding: ActivityGenericRecyclerBinding private val binding: ActivityGenericRecyclerBinding
get() = _binding!! get() = _binding!!
private lateinit var VM: BlacklistViewModel private val viewModel: BlacklistViewModel by viewModels()
private lateinit var blacklistProvider: BlacklistProvider private lateinit var blacklistProvider: BlacklistProvider
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = ActivityGenericRecyclerBinding.bind(view) _binding = ActivityGenericRecyclerBinding.bind(view)
VM = ViewModelProvider(this)[BlacklistViewModel::class.java]
blacklistProvider = BlacklistProvider.with(view.context) blacklistProvider = BlacklistProvider.with(view.context)
VM.liveData.observe(viewLifecycleOwner) { viewModel.liveData.observe(viewLifecycleOwner) {
updateController(it.sortedByDescending { app -> updateController(it.sortedByDescending { app ->
blacklistProvider.isBlacklisted(app.packageName) blacklistProvider.isBlacklisted(app.packageName)
}) })
@@ -67,7 +67,7 @@ class BlacklistFragment : Fragment(R.layout.activity_generic_recycler) {
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
blacklistProvider.save(VM.selected) blacklistProvider.save(viewModel.selected)
} }
override fun onDestroyView() { override fun onDestroyView() {
@@ -91,12 +91,12 @@ class BlacklistFragment : Fragment(R.layout.activity_generic_recycler) {
BlackListViewModel_() BlackListViewModel_()
.id(it.packageName.hashCode()) .id(it.packageName.hashCode())
.black(it) .black(it)
.markChecked(VM.selected.contains(it.packageName)) .markChecked(viewModel.selected.contains(it.packageName))
.checked { _, isChecked -> .checked { _, isChecked ->
if (isChecked) if (isChecked)
VM.selected.add(it.packageName) viewModel.selected.add(it.packageName)
else else
VM.selected.remove(it.packageName) viewModel.selected.remove(it.packageName)
requestModelBuild() requestModelBuild()
} }

View File

@@ -22,7 +22,7 @@ package com.aurora.store.view.ui.commons
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.Toast import android.widget.Toast
import androidx.lifecycle.ViewModelProvider import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
@@ -46,18 +46,16 @@ class CategoryBrowseFragment : BaseFragment(R.layout.activity_generic_recycler),
get() = _binding!! get() = _binding!!
private val args: CategoryBrowseFragmentArgs by navArgs() private val args: CategoryBrowseFragmentArgs by navArgs()
private val viewModel: SubCategoryClusterViewModel by viewModels()
lateinit var C: GenericCarouselController private lateinit var genericCarouselController: GenericCarouselController
lateinit var VM: SubCategoryClusterViewModel private lateinit var endlessRecyclerOnScrollListener: EndlessRecyclerOnScrollListener
lateinit var endlessRecyclerOnScrollListener: EndlessRecyclerOnScrollListener
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = ActivityGenericRecyclerBinding.bind(view) _binding = ActivityGenericRecyclerBinding.bind(view)
C = CategoryCarouselController(this) genericCarouselController = CategoryCarouselController(this)
VM = ViewModelProvider(this)[SubCategoryClusterViewModel::class.java]
// Toolbar // Toolbar
binding.layoutToolbarAction.apply { binding.layoutToolbarAction.apply {
@@ -66,9 +64,9 @@ class CategoryBrowseFragment : BaseFragment(R.layout.activity_generic_recycler),
} }
// RecyclerView // RecyclerView
binding.recycler.setController(C) binding.recycler.setController(genericCarouselController)
VM.liveData.observe(viewLifecycleOwner) { viewModel.liveData.observe(viewLifecycleOwner) {
when (it) { when (it) {
is ViewState.Empty -> { is ViewState.Empty -> {
} }
@@ -89,17 +87,16 @@ class CategoryBrowseFragment : BaseFragment(R.layout.activity_generic_recycler),
} }
} }
endlessRecyclerOnScrollListener = endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() {
object : EndlessRecyclerOnScrollListener() { override fun onLoadMore(currentPage: Int) {
override fun onLoadMore(currentPage: Int) { viewModel.observe()
VM.observe()
}
} }
}
endlessRecyclerOnScrollListener.disable() endlessRecyclerOnScrollListener.disable()
binding.recycler.addOnScrollListener(endlessRecyclerOnScrollListener) binding.recycler.addOnScrollListener(endlessRecyclerOnScrollListener)
VM.observeCategory(args.browseUrl) viewModel.observeCategory(args.browseUrl)
updateController(null) updateController(null)
} }
@@ -109,9 +106,8 @@ class CategoryBrowseFragment : BaseFragment(R.layout.activity_generic_recycler),
} }
private fun updateController(streamBundle: StreamBundle?) { private fun updateController(streamBundle: StreamBundle?) {
if (streamBundle != null) if (streamBundle != null) endlessRecyclerOnScrollListener.enable()
endlessRecyclerOnScrollListener.enable() genericCarouselController.setData(streamBundle)
C.setData(streamBundle)
} }
override fun onHeaderClicked(streamCluster: StreamCluster) { override fun onHeaderClicked(streamCluster: StreamCluster) {
@@ -127,7 +123,7 @@ class CategoryBrowseFragment : BaseFragment(R.layout.activity_generic_recycler),
} }
override fun onClusterScrolled(streamCluster: StreamCluster) { override fun onClusterScrolled(streamCluster: StreamCluster) {
VM.observeCluster(streamCluster) viewModel.observeCluster(streamCluster)
} }
override fun onAppClick(app: App) { override fun onAppClick(app: App) {

View File

@@ -38,8 +38,6 @@ class CategoryFragment : BaseFragment(R.layout.fragment_generic_recycler) {
private val viewModel: CategoryViewModel by viewModels() private val viewModel: CategoryViewModel by viewModels()
private var pageType = 0
companion object { companion object {
@JvmStatic @JvmStatic
fun newInstance(pageType: Int): CategoryFragment { fun newInstance(pageType: Int): CategoryFragment {
@@ -55,6 +53,7 @@ class CategoryFragment : BaseFragment(R.layout.fragment_generic_recycler) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = FragmentGenericRecyclerBinding.bind(view) _binding = FragmentGenericRecyclerBinding.bind(view)
var pageType = 0
val bundle = arguments val bundle = arguments
if (bundle != null) { if (bundle != null) {
pageType = bundle.getInt(Constants.PAGE_TYPE, 0) pageType = bundle.getInt(Constants.PAGE_TYPE, 0)

View File

@@ -40,8 +40,6 @@ class EditorChoiceFragment : BaseFragment(R.layout.fragment_for_you),
private val viewModel: EditorChoiceViewModel by viewModels() private val viewModel: EditorChoiceViewModel by viewModels()
private var pageType = 0
companion object { companion object {
@JvmStatic @JvmStatic
fun newInstance(pageType: Int): EditorChoiceFragment { fun newInstance(pageType: Int): EditorChoiceFragment {
@@ -57,6 +55,7 @@ class EditorChoiceFragment : BaseFragment(R.layout.fragment_for_you),
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = FragmentForYouBinding.bind(view) _binding = FragmentForYouBinding.bind(view)
var pageType = 0
val bundle = arguments val bundle = arguments
if (bundle != null) { if (bundle != null) {
pageType = bundle.getInt(Constants.PAGE_TYPE, 0) pageType = bundle.getInt(Constants.PAGE_TYPE, 0)

View File

@@ -21,7 +21,7 @@ package com.aurora.store.view.ui.commons
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.ViewModelProvider import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import com.airbnb.epoxy.EpoxyModel import com.airbnb.epoxy.EpoxyModel
@@ -46,15 +46,12 @@ class EditorStreamBrowseFragment : BaseFragment(R.layout.activity_generic_recycl
get() = _binding!! get() = _binding!!
private val args: EditorStreamBrowseFragmentArgs by navArgs() private val args: EditorStreamBrowseFragmentArgs by navArgs()
private val viewModel: EditorBrowseViewModel by viewModels()
lateinit var VM: EditorBrowseViewModel
lateinit var title: String
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = ActivityGenericRecyclerBinding.bind(view) _binding = ActivityGenericRecyclerBinding.bind(view)
VM = ViewModelProvider(this)[EditorBrowseViewModel::class.java]
// Toolbar // Toolbar
binding.layoutToolbarAction.apply { binding.layoutToolbarAction.apply {
@@ -64,11 +61,11 @@ class EditorStreamBrowseFragment : BaseFragment(R.layout.activity_generic_recycl
} }
} }
VM.liveData.observe(viewLifecycleOwner) { viewModel.liveData.observe(viewLifecycleOwner) {
updateController(it) updateController(it)
} }
VM.getEditorStreamBundle(args.browseUrl) viewModel.getEditorStreamBundle(args.browseUrl)
updateController(null) updateController(null)
} }

View File

@@ -21,7 +21,7 @@ package com.aurora.store.view.ui.commons
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.ViewModelProvider import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import com.airbnb.epoxy.EpoxyModel import com.airbnb.epoxy.EpoxyModel
@@ -46,17 +46,14 @@ class ExpandedStreamBrowseFragment : BaseFragment(R.layout.activity_generic_recy
get() = _binding!! get() = _binding!!
private val args: ExpandedStreamBrowseFragmentArgs by navArgs() private val args: ExpandedStreamBrowseFragmentArgs by navArgs()
private val viewModel: ExpandedStreamBrowseViewModel by viewModels()
lateinit var VM: ExpandedStreamBrowseViewModel private lateinit var endlessRecyclerOnScrollListener: EndlessRecyclerOnScrollListener
lateinit var endlessRecyclerOnScrollListener: EndlessRecyclerOnScrollListener private lateinit var cluster: StreamCluster
lateinit var title: String
lateinit var cluster: StreamCluster
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = ActivityGenericRecyclerBinding.bind(view) _binding = ActivityGenericRecyclerBinding.bind(view)
VM = ViewModelProvider(this)[ExpandedStreamBrowseViewModel::class.java]
// Toolbar // Toolbar
binding.layoutToolbarAction.apply { binding.layoutToolbarAction.apply {
@@ -66,7 +63,7 @@ class ExpandedStreamBrowseFragment : BaseFragment(R.layout.activity_generic_recy
} }
} }
VM.liveData.observe(viewLifecycleOwner) { viewModel.liveData.observe(viewLifecycleOwner) {
if (!::cluster.isInitialized) attachRecycler() if (!::cluster.isInitialized) attachRecycler()
cluster = it cluster = it
@@ -74,7 +71,7 @@ class ExpandedStreamBrowseFragment : BaseFragment(R.layout.activity_generic_recy
updateTitle(cluster) updateTitle(cluster)
} }
VM.getInitialCluster(args.expandedStreamUrl) viewModel.getInitialCluster(args.expandedStreamUrl)
updateController(null) updateController(null)
} }
@@ -91,7 +88,7 @@ class ExpandedStreamBrowseFragment : BaseFragment(R.layout.activity_generic_recy
private fun attachRecycler() { private fun attachRecycler() {
endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() { endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() {
override fun onLoadMore(currentPage: Int) { override fun onLoadMore(currentPage: Int) {
VM.next() viewModel.next()
} }
} }
binding.recycler.addOnScrollListener(endlessRecyclerOnScrollListener) binding.recycler.addOnScrollListener(endlessRecyclerOnScrollListener)

View File

@@ -45,11 +45,8 @@ class ForYouFragment : BaseFragment(R.layout.fragment_for_you),
private val viewModel: BaseClusterViewModel by viewModels() private val viewModel: BaseClusterViewModel by viewModels()
private lateinit var C: GenericCarouselController
private lateinit var streamBundle: StreamBundle private lateinit var streamBundle: StreamBundle
private var pageType = 0
companion object { companion object {
@JvmStatic @JvmStatic
fun newInstance(pageType: Int): ForYouFragment { fun newInstance(pageType: Int): ForYouFragment {
@@ -65,8 +62,9 @@ class ForYouFragment : BaseFragment(R.layout.fragment_for_you),
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = FragmentForYouBinding.bind(view) _binding = FragmentForYouBinding.bind(view)
C = GenericCarouselController(this) val genericCarouselController = GenericCarouselController(this)
var pageType = 0
val bundle = arguments val bundle = arguments
if (bundle != null) { if (bundle != null) {
pageType = bundle.getInt(Constants.PAGE_TYPE, 0) pageType = bundle.getInt(Constants.PAGE_TYPE, 0)
@@ -77,7 +75,7 @@ class ForYouFragment : BaseFragment(R.layout.fragment_for_you),
1 -> viewModel.getStreamBundle(Category.GAME, Type.HOME) 1 -> viewModel.getStreamBundle(Category.GAME, Type.HOME)
} }
binding.recycler.setController(C) binding.recycler.setController(genericCarouselController)
viewModel.liveData.observe(viewLifecycleOwner) { viewModel.liveData.observe(viewLifecycleOwner) {
when (it) { when (it) {
@@ -85,7 +83,7 @@ class ForYouFragment : BaseFragment(R.layout.fragment_for_you),
} }
is ViewState.Loading -> { is ViewState.Loading -> {
updateController(null) genericCarouselController.setData(null)
} }
is ViewState.Error -> { is ViewState.Error -> {
@@ -108,8 +106,7 @@ class ForYouFragment : BaseFragment(R.layout.fragment_for_you),
} }
streamBundle = it.data as StreamBundle streamBundle = it.data as StreamBundle
genericCarouselController.setData(streamBundle)
updateController(streamBundle)
} }
} }
} }
@@ -120,10 +117,6 @@ class ForYouFragment : BaseFragment(R.layout.fragment_for_you),
_binding = null _binding = null
} }
private fun updateController(streamBundle: StreamBundle?) {
C.setData(streamBundle)
}
override fun onHeaderClicked(streamCluster: StreamCluster) { override fun onHeaderClicked(streamCluster: StreamCluster) {
if (streamCluster.clusterBrowseUrl.isNotEmpty()) if (streamCluster.clusterBrowseUrl.isNotEmpty())
openStreamBrowseFragment(streamCluster.clusterBrowseUrl, streamCluster.clusterTitle) openStreamBrowseFragment(streamCluster.clusterBrowseUrl, streamCluster.clusterTitle)

View File

@@ -21,7 +21,7 @@ package com.aurora.store.view.ui.commons
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.ViewModelProvider import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.data.models.StreamCluster
@@ -42,18 +42,14 @@ class StreamBrowseFragment : BaseFragment(R.layout.activity_generic_recycler) {
get() = _binding!! get() = _binding!!
private val args: StreamBrowseFragmentArgs by navArgs() private val args: StreamBrowseFragmentArgs by navArgs()
private val viewModel: StreamBrowseViewModel by viewModels()
lateinit var VM: StreamBrowseViewModel private lateinit var endlessRecyclerOnScrollListener: EndlessRecyclerOnScrollListener
private lateinit var cluster: StreamCluster
lateinit var endlessRecyclerOnScrollListener: EndlessRecyclerOnScrollListener
lateinit var title: String
lateinit var cluster: StreamCluster
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = ActivityGenericRecyclerBinding.bind(view) _binding = ActivityGenericRecyclerBinding.bind(view)
VM = ViewModelProvider(this)[StreamBrowseViewModel::class.java]
// Toolbar // Toolbar
binding.layoutToolbarAction.apply { binding.layoutToolbarAction.apply {
@@ -63,11 +59,11 @@ class StreamBrowseFragment : BaseFragment(R.layout.activity_generic_recycler) {
} }
} }
VM.liveData.observe(viewLifecycleOwner) { viewModel.liveData.observe(viewLifecycleOwner) {
if (!::cluster.isInitialized) { if (!::cluster.isInitialized) {
endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() { endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() {
override fun onLoadMore(currentPage: Int) { override fun onLoadMore(currentPage: Int) {
VM.nextCluster() viewModel.nextCluster()
} }
} }
binding.recycler.addOnScrollListener(endlessRecyclerOnScrollListener) binding.recycler.addOnScrollListener(endlessRecyclerOnScrollListener)
@@ -79,7 +75,7 @@ class StreamBrowseFragment : BaseFragment(R.layout.activity_generic_recycler) {
binding.layoutToolbarAction.txtTitle.text = it.clusterTitle binding.layoutToolbarAction.txtTitle.text = it.clusterTitle
} }
VM.getStreamBundle(args.browseUrl) viewModel.getStreamBundle(args.browseUrl)
updateController(null) updateController(null)
} }

View File

@@ -43,9 +43,6 @@ class TopChartFragment : BaseFragment(R.layout.fragment_top_container) {
private val viewModel: TopChartViewModel by viewModels() private val viewModel: TopChartViewModel by viewModels()
private var chartType = 0
private var chartCategory = 0
companion object { companion object {
@JvmStatic @JvmStatic
fun newInstance(chartType: Int, chartCategory: Int): TopChartFragment { fun newInstance(chartType: Int, chartCategory: Int): TopChartFragment {
@@ -62,7 +59,10 @@ class TopChartFragment : BaseFragment(R.layout.fragment_top_container) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = FragmentTopContainerBinding.bind(view) _binding = FragmentTopContainerBinding.bind(view)
var chartType = 0
var chartCategory = 0
val bundle = arguments val bundle = arguments
if (bundle != null) { if (bundle != null) {
chartType = bundle.getInt(Constants.TOP_CHART_TYPE, 0) chartType = bundle.getInt(Constants.TOP_CHART_TYPE, 0)
chartCategory = bundle.getInt(Constants.TOP_CHART_CATEGORY, 0) chartCategory = bundle.getInt(Constants.TOP_CHART_CATEGORY, 0)

View File

@@ -48,7 +48,6 @@ class DetailsMoreFragment : BaseFragment(R.layout.fragment_details_more) {
get() = _binding!! get() = _binding!!
private val viewModel: DetailsMoreViewModel by viewModels() private val viewModel: DetailsMoreViewModel by viewModels()
private val args: DetailsMoreFragmentArgs by navArgs() private val args: DetailsMoreFragmentArgs by navArgs()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

View File

@@ -22,7 +22,7 @@ package com.aurora.store.view.ui.details
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import com.aurora.gplayapi.data.models.Review import com.aurora.gplayapi.data.models.Review
@@ -43,18 +43,15 @@ class DetailsReviewFragment : Fragment(R.layout.fragment_details_review) {
get() = _binding!! get() = _binding!!
private val args: DetailsReviewFragmentArgs by navArgs() private val args: DetailsReviewFragmentArgs by navArgs()
private val viewModel: ReviewViewModel by viewModels()
private lateinit var VM: ReviewViewModel
private lateinit var endlessRecyclerOnScrollListener: EndlessRecyclerOnScrollListener private lateinit var endlessRecyclerOnScrollListener: EndlessRecyclerOnScrollListener
private lateinit var filter: Review.Filter private lateinit var filter: Review.Filter
private lateinit var reviewCluster: ReviewCluster private lateinit var reviewCluster: ReviewCluster
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = FragmentDetailsReviewBinding.bind(view) _binding = FragmentDetailsReviewBinding.bind(view)
VM = ViewModelProvider(this)[ReviewViewModel::class.java]
// Toolbar // Toolbar
binding.layoutToolbarActionReview.apply { binding.layoutToolbarActionReview.apply {
@@ -64,12 +61,12 @@ class DetailsReviewFragment : Fragment(R.layout.fragment_details_review) {
} }
} }
VM.liveData.observe(viewLifecycleOwner) { viewModel.liveData.observe(viewLifecycleOwner) {
if (!::reviewCluster.isInitialized) { if (!::reviewCluster.isInitialized) {
endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() { endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() {
override fun onLoadMore(currentPage: Int) { override fun onLoadMore(currentPage: Int) {
if (::reviewCluster.isInitialized) { if (::reviewCluster.isInitialized) {
VM.next(reviewCluster.nextPageUrl) viewModel.next(reviewCluster.nextPageUrl)
} }
} }
} }
@@ -84,7 +81,7 @@ class DetailsReviewFragment : Fragment(R.layout.fragment_details_review) {
// Fetch Reviews // Fetch Reviews
filter = Review.Filter.ALL filter = Review.Filter.ALL
VM.fetchReview(args.packageName, filter) viewModel.fetchReview(args.packageName, filter)
// Chips // Chips
binding.chipGroup.setOnCheckedStateChangeListener { _, checkedIds -> binding.chipGroup.setOnCheckedStateChangeListener { _, checkedIds ->
@@ -100,7 +97,7 @@ class DetailsReviewFragment : Fragment(R.layout.fragment_details_review) {
} }
endlessRecyclerOnScrollListener.resetPageCount() endlessRecyclerOnScrollListener.resetPageCount()
VM.fetchReview(args.packageName, filter) viewModel.fetchReview(args.packageName, filter)
} }
} }

View File

@@ -21,7 +21,7 @@ package com.aurora.store.view.ui.details
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.ViewModelProvider import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import com.aurora.gplayapi.data.models.SearchBundle import com.aurora.gplayapi.data.models.SearchBundle
@@ -33,7 +33,6 @@ import com.aurora.store.view.epoxy.views.app.AppListViewModel_
import com.aurora.store.view.ui.commons.BaseFragment import com.aurora.store.view.ui.commons.BaseFragment
import com.aurora.store.viewmodel.search.SearchResultViewModel import com.aurora.store.viewmodel.search.SearchResultViewModel
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import okhttp3.internal.filterList
@AndroidEntryPoint @AndroidEntryPoint
class DevAppsFragment : BaseFragment(R.layout.activity_generic_recycler) { class DevAppsFragment : BaseFragment(R.layout.activity_generic_recycler) {
@@ -43,17 +42,13 @@ class DevAppsFragment : BaseFragment(R.layout.activity_generic_recycler) {
get() = _binding!! get() = _binding!!
private val args: DevAppsFragmentArgs by navArgs() private val args: DevAppsFragmentArgs by navArgs()
private val viewModel: SearchResultViewModel by viewModels()
private lateinit var VM: SearchResultViewModel
private lateinit var endlessRecyclerOnScrollListener: EndlessRecyclerOnScrollListener
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = ActivityGenericRecyclerBinding.bind(view) _binding = ActivityGenericRecyclerBinding.bind(view)
VM = ViewModelProvider(this)[SearchResultViewModel::class.java]
VM.liveData.observe(viewLifecycleOwner) { viewModel.liveData.observe(viewLifecycleOwner) {
updateController(it) updateController(it)
} }
@@ -66,14 +61,14 @@ class DevAppsFragment : BaseFragment(R.layout.activity_generic_recycler) {
} }
// Recycler View // Recycler View
endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() { val endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() {
override fun onLoadMore(currentPage: Int) { override fun onLoadMore(currentPage: Int) {
VM.liveData.value?.let { VM.next(it.subBundles) } viewModel.liveData.value?.let { viewModel.next(it.subBundles) }
} }
} }
binding.recycler.addOnScrollListener(endlessRecyclerOnScrollListener) binding.recycler.addOnScrollListener(endlessRecyclerOnScrollListener)
VM.observeSearchResults("pub:${args.developerName}") viewModel.observeSearchResults("pub:${args.developerName}")
} }
override fun onDestroyView() { override fun onDestroyView() {

View File

@@ -21,12 +21,11 @@ package com.aurora.store.view.ui.details
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.ViewModelProvider import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import coil.load import coil.load
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.data.models.AuthData
import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.data.models.StreamCluster
import com.aurora.gplayapi.data.models.details.DevStream import com.aurora.gplayapi.data.models.details.DevStream
import com.aurora.store.R import com.aurora.store.R
@@ -48,18 +47,14 @@ class DevProfileFragment : BaseFragment(R.layout.fragment_dev_profile),
get() = _binding!! get() = _binding!!
private val args: DevProfileFragmentArgs by navArgs() private val args: DevProfileFragmentArgs by navArgs()
private val viewModel: DevProfileViewModel by viewModels()
private lateinit var VM: DevProfileViewModel
private lateinit var C: DeveloperCarouselController
private lateinit var authData: AuthData
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = FragmentDevProfileBinding.bind(view) _binding = FragmentDevProfileBinding.bind(view)
C = DeveloperCarouselController(this) val developerCarouselController = DeveloperCarouselController(this)
VM = ViewModelProvider(this)[DevProfileViewModel::class.java] val authData = AuthProvider.with(requireContext()).getAuthData()
authData = AuthProvider.with(requireContext()).getAuthData()
// Toolbar // Toolbar
binding.layoutToolbarAction.apply { binding.layoutToolbarAction.apply {
@@ -69,9 +64,9 @@ class DevProfileFragment : BaseFragment(R.layout.fragment_dev_profile),
} }
// RecyclerView // RecyclerView
binding.recycler.setController(C) binding.recycler.setController(developerCarouselController)
VM.liveData.observe(viewLifecycleOwner) { viewModel.liveData.observe(viewLifecycleOwner) {
when (it) { when (it) {
is ViewState.Empty -> { is ViewState.Empty -> {
} }
@@ -95,14 +90,14 @@ class DevProfileFragment : BaseFragment(R.layout.fragment_dev_profile),
binding.txtDevDescription.text = description binding.txtDevDescription.text = description
binding.imgIcon.load(imgUrl) binding.imgIcon.load(imgUrl)
binding.viewFlipper.displayedChild = 0 binding.viewFlipper.displayedChild = 0
C.setData(streamBundle) developerCarouselController.setData(streamBundle)
} }
} }
} }
} }
binding.viewFlipper.displayedChild = 1 binding.viewFlipper.displayedChild = 1
VM.getStreamBundle(args.devId) viewModel.getStreamBundle(args.devId)
} }
override fun onDestroyView() { override fun onDestroyView() {
@@ -115,7 +110,7 @@ class DevProfileFragment : BaseFragment(R.layout.fragment_dev_profile),
} }
override fun onClusterScrolled(streamCluster: StreamCluster) { override fun onClusterScrolled(streamCluster: StreamCluster) {
VM.observeCluster(streamCluster) viewModel.observeCluster(streamCluster)
} }
override fun onAppClick(app: App) { override fun onAppClick(app: App) {

View File

@@ -50,7 +50,8 @@ class DownloadFragment : BaseFragment(R.layout.fragment_download) {
@Inject @Inject
lateinit var downloadWorkerUtil: DownloadWorkerUtil lateinit var downloadWorkerUtil: DownloadWorkerUtil
lateinit var downloadList: List<Download>
private lateinit var downloadList: List<Download>
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)

View File

@@ -21,7 +21,7 @@ package com.aurora.store.view.ui.sale
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.ViewModelProvider import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.databinding.ActivityGenericRecyclerBinding import com.aurora.store.databinding.ActivityGenericRecyclerBinding
@@ -43,30 +43,27 @@ class AppSalesFragment : BaseFragment(R.layout.activity_generic_recycler) {
private val binding: ActivityGenericRecyclerBinding private val binding: ActivityGenericRecyclerBinding
get() = _binding!! get() = _binding!!
lateinit var VM: AppSalesViewModel private val viewModel: AppSalesViewModel by viewModels()
lateinit var endlessRecyclerOnScrollListener: EndlessRecyclerOnScrollListener
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = ActivityGenericRecyclerBinding.bind(view) _binding = ActivityGenericRecyclerBinding.bind(view)
VM = ViewModelProvider(this)[AppSalesViewModel::class.java]
binding.layoutToolbarAction.txtTitle.text = getString(R.string.title_apps_sale) binding.layoutToolbarAction.txtTitle.text = getString(R.string.title_apps_sale)
binding.layoutToolbarAction.imgActionPrimary.setOnClickListener { binding.layoutToolbarAction.imgActionPrimary.setOnClickListener {
findNavController().navigateUp() findNavController().navigateUp()
} }
endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() { val endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() {
override fun onLoadMore(currentPage: Int) { override fun onLoadMore(currentPage: Int) {
VM.observe() viewModel.observe()
} }
} }
binding.recycler.addOnScrollListener(endlessRecyclerOnScrollListener) binding.recycler.addOnScrollListener(endlessRecyclerOnScrollListener)
updateController(null) updateController(null)
VM.liveData.observe(viewLifecycleOwner) { viewModel.liveData.observe(viewLifecycleOwner) {
updateController(it) updateController(it)
} }
} }

View File

@@ -28,7 +28,7 @@ import android.view.KeyEvent
import android.view.View import android.view.View
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import android.widget.TextView import android.widget.TextView
import androidx.lifecycle.ViewModelProvider import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.data.models.SearchBundle import com.aurora.gplayapi.data.models.SearchBundle
@@ -44,10 +44,8 @@ import com.aurora.store.view.epoxy.views.app.NoAppViewModel_
import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_ import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_
import com.aurora.store.view.ui.commons.BaseFragment import com.aurora.store.view.ui.commons.BaseFragment
import com.aurora.store.viewmodel.search.SearchResultViewModel import com.aurora.store.viewmodel.search.SearchResultViewModel
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputEditText
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
@AndroidEntryPoint @AndroidEntryPoint
class SearchResultsFragment : BaseFragment(R.layout.fragment_search_result), class SearchResultsFragment : BaseFragment(R.layout.fragment_search_result),
@@ -57,25 +55,22 @@ class SearchResultsFragment : BaseFragment(R.layout.fragment_search_result),
private val binding: FragmentSearchResultBinding private val binding: FragmentSearchResultBinding
get() = _binding!! get() = _binding!!
lateinit var VM: SearchResultViewModel private val viewModel: SearchResultViewModel by viewModels()
lateinit var endlessRecyclerOnScrollListener: EndlessRecyclerOnScrollListener private lateinit var searchView: TextInputEditText
lateinit var searchView: TextInputEditText
lateinit var sharedPreferences: SharedPreferences private lateinit var sharedPreferences: SharedPreferences
lateinit var filter: Filter private lateinit var filter: Filter
var query: String? = null private var query: String? = null
var searchBundle: SearchBundle = SearchBundle() private var searchBundle: SearchBundle = SearchBundle()
private var shimmerAnimationVisible = false private var shimmerAnimationVisible = false
private var snackbar: Snackbar? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = FragmentSearchResultBinding.bind(view) _binding = FragmentSearchResultBinding.bind(view)
VM = ViewModelProvider(this)[SearchResultViewModel::class.java]
sharedPreferences = Preferences.getPrefs(view.context) sharedPreferences = Preferences.getPrefs(view.context)
sharedPreferences.registerOnSharedPreferenceChangeListener(this) sharedPreferences.registerOnSharedPreferenceChangeListener(this)
@@ -96,9 +91,9 @@ class SearchResultsFragment : BaseFragment(R.layout.fragment_search_result),
attachSearch() attachSearch()
// RecyclerView // RecyclerView
endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() { val endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() {
override fun onLoadMore(currentPage: Int) { override fun onLoadMore(currentPage: Int) {
VM.next(searchBundle.subBundles) viewModel.next(searchBundle.subBundles)
} }
} }
binding.recycler.addOnScrollListener(endlessRecyclerOnScrollListener) binding.recycler.addOnScrollListener(endlessRecyclerOnScrollListener)
@@ -108,7 +103,7 @@ class SearchResultsFragment : BaseFragment(R.layout.fragment_search_result),
findNavController().navigate(R.id.filterSheet) findNavController().navigate(R.id.filterSheet)
} }
VM.liveData.observe(viewLifecycleOwner) { viewModel.liveData.observe(viewLifecycleOwner) {
if (shimmerAnimationVisible) { if (shimmerAnimationVisible) {
endlessRecyclerOnScrollListener.resetPageCount() endlessRecyclerOnScrollListener.resetPageCount()
binding.recycler.clear() binding.recycler.clear()
@@ -148,7 +143,7 @@ class SearchResultsFragment : BaseFragment(R.layout.fragment_search_result),
if (filteredAppList.isEmpty()) { if (filteredAppList.isEmpty()) {
if (searchBundle.subBundles.isNotEmpty()) { if (searchBundle.subBundles.isNotEmpty()) {
VM.next(searchBundle.subBundles) viewModel.next(searchBundle.subBundles)
binding.recycler.withModels { binding.recycler.withModels {
setFilterDuplicates(true) setFilterDuplicates(true)
add( add(
@@ -197,7 +192,7 @@ class SearchResultsFragment : BaseFragment(R.layout.fragment_search_result),
binding.recycler.adapter?.let { binding.recycler.adapter?.let {
if (it.itemCount < 10) { if (it.itemCount < 10) {
VM.next(searchBundle.subBundles) viewModel.next(searchBundle.subBundles)
} }
} }
} }
@@ -240,7 +235,7 @@ class SearchResultsFragment : BaseFragment(R.layout.fragment_search_result),
private fun queryViewModel(query: String) { private fun queryViewModel(query: String) {
updateController(null) updateController(null)
VM.observeSearchResults(query) viewModel.observeSearchResults(query)
} }
private fun filter(appList: MutableList<App>): List<App> { private fun filter(appList: MutableList<App>): List<App> {

View File

@@ -27,7 +27,7 @@ import android.view.View
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import android.widget.TextView import android.widget.TextView
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.aurora.extensions.showKeyboard import com.aurora.extensions.showKeyboard
import com.aurora.gplayapi.SearchSuggestEntry import com.aurora.gplayapi.SearchSuggestEntry
@@ -45,16 +45,16 @@ class SearchSuggestionFragment : Fragment(R.layout.fragment_search_suggestion) {
private val binding: FragmentSearchSuggestionBinding private val binding: FragmentSearchSuggestionBinding
get() = _binding!! get() = _binding!!
lateinit var VM: SearchSuggestionViewModel private val viewModel: SearchSuggestionViewModel by viewModels()
lateinit var searchView: TextInputEditText
var query: String = String() private lateinit var searchView: TextInputEditText
private var query: String = String()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = FragmentSearchSuggestionBinding.bind(view) _binding = FragmentSearchSuggestionBinding.bind(view)
VM = ViewModelProvider(this)[SearchSuggestionViewModel::class.java]
// Toolbar // Toolbar
binding.layoutToolbarSearch.apply { binding.layoutToolbarSearch.apply {
@@ -67,7 +67,7 @@ class SearchSuggestionFragment : Fragment(R.layout.fragment_search_suggestion) {
} }
} }
VM.liveSearchSuggestions.observe(viewLifecycleOwner) { viewModel.liveSearchSuggestions.observe(viewLifecycleOwner) {
updateController(it) updateController(it)
} }
@@ -113,7 +113,7 @@ class SearchSuggestionFragment : Fragment(R.layout.fragment_search_suggestion) {
if (s.isNotEmpty()) { if (s.isNotEmpty()) {
query = s.toString() query = s.toString()
if (query.isNotEmpty()) { if (query.isNotEmpty()) {
VM.observeStreamBundles(query) viewModel.observeStreamBundles(query)
} }
} }
} }

View File

@@ -20,9 +20,7 @@
package com.aurora.store.view.ui.spoof package com.aurora.store.view.ui.spoof
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
@@ -40,15 +38,16 @@ import kotlinx.coroutines.launch
import java.util.Properties import java.util.Properties
@AndroidEntryPoint @AndroidEntryPoint
class DeviceSpoofFragment : BaseFragment() { class DeviceSpoofFragment : BaseFragment(R.layout.fragment_generic_recycler) {
private lateinit var B: FragmentGenericRecyclerBinding private var _binding: FragmentGenericRecyclerBinding? = null
private lateinit var spoofProvider: SpoofProvider private val binding get() = _binding!!
private var properties: Properties = Properties()
private val viewModel: SpoofViewModel by viewModels() private val viewModel: SpoofViewModel by viewModels()
private lateinit var spoofProvider: SpoofProvider
private lateinit var properties: Properties
companion object { companion object {
@JvmStatic @JvmStatic
fun newInstance(): DeviceSpoofFragment { fun newInstance(): DeviceSpoofFragment {
@@ -58,30 +57,16 @@ class DeviceSpoofFragment : BaseFragment() {
} }
} }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
B = FragmentGenericRecyclerBinding.bind(
inflater.inflate(
R.layout.fragment_generic_recycler,
container,
false
)
)
properties = NativeDeviceInfoProvider(requireContext()).getNativeDeviceProperties()
spoofProvider = SpoofProvider(requireContext())
return B.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = FragmentGenericRecyclerBinding.bind(view)
if (spoofProvider.isDeviceSpoofEnabled()) spoofProvider = SpoofProvider(requireContext())
properties = spoofProvider.getSpoofDeviceProperties() properties = if (spoofProvider.isDeviceSpoofEnabled()) {
spoofProvider.getSpoofDeviceProperties()
} else {
NativeDeviceInfoProvider(requireContext()).getNativeDeviceProperties()
}
viewLifecycleOwner.lifecycleScope.launch { viewLifecycleOwner.lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) { repeatOnLifecycle(Lifecycle.State.STARTED) {
@@ -91,8 +76,13 @@ class DeviceSpoofFragment : BaseFragment() {
viewModel.fetchAvailableDevices(view.context) viewModel.fetchAvailableDevices(view.context)
} }
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
private fun updateController(locales: List<Properties>) { private fun updateController(locales: List<Properties>) {
B.recycler.withModels { binding.recycler.withModels {
setFilterDuplicates(true) setFilterDuplicates(true)
locales locales
.sortedBy { it.getProperty("UserReadableName") } .sortedBy { it.getProperty("UserReadableName") }

View File

@@ -21,9 +21,7 @@ package com.aurora.store.view.ui.spoof
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import com.aurora.extensions.toast import com.aurora.extensions.toast
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.providers.SpoofProvider import com.aurora.store.data.providers.SpoofProvider
@@ -34,15 +32,16 @@ import dagger.hilt.android.AndroidEntryPoint
import java.util.Locale import java.util.Locale
@AndroidEntryPoint @AndroidEntryPoint
class LocaleSpoofFragment : BaseFragment() { class LocaleSpoofFragment : BaseFragment(R.layout.fragment_generic_recycler) {
private lateinit var B: FragmentGenericRecyclerBinding
private lateinit var spoofProvider: SpoofProvider
private var locale: Locale = Locale.getDefault()
private val TAG = LocaleSpoofFragment::class.java.simpleName private val TAG = LocaleSpoofFragment::class.java.simpleName
private var _binding: FragmentGenericRecyclerBinding? = null
private val binding get() = _binding!!
private lateinit var spoofProvider: SpoofProvider
private lateinit var locale: Locale
companion object { companion object {
@JvmStatic @JvmStatic
fun newInstance(): LocaleSpoofFragment { fun newInstance(): LocaleSpoofFragment {
@@ -52,29 +51,16 @@ class LocaleSpoofFragment : BaseFragment() {
} }
} }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
B = FragmentGenericRecyclerBinding.bind(
inflater.inflate(
R.layout.fragment_generic_recycler,
container,
false
)
)
spoofProvider = SpoofProvider(requireContext())
return B.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = FragmentGenericRecyclerBinding.bind(view)
if (spoofProvider.isLocaleSpoofEnabled()) spoofProvider = SpoofProvider(requireContext())
locale = spoofProvider.getSpoofLocale() locale = if (spoofProvider.isLocaleSpoofEnabled()) {
spoofProvider.getSpoofLocale()
} else {
Locale.getDefault()
}
try { try {
updateController(fetchAvailableLocales()) updateController(fetchAvailableLocales())
@@ -83,8 +69,13 @@ class LocaleSpoofFragment : BaseFragment() {
} }
} }
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
private fun updateController(locales: List<Locale>) { private fun updateController(locales: List<Locale>) {
B.recycler.withModels { binding.recycler.withModels {
setFilterDuplicates(true) setFilterDuplicates(true)
locales locales
.sortedBy { it.displayName } .sortedBy { it.displayName }