android: Simplify setup in search and games fragments

This commit is contained in:
Charles Lombardo 2023-05-22 16:20:51 -04:00 committed by bunnei
parent aa8a48e94c
commit 412c95e0b0
2 changed files with 62 additions and 57 deletions

View file

@ -61,13 +61,6 @@ class SearchFragment : Fragment() {
binding.searchText.setText(savedInstanceState.getString(SEARCH_TEXT)) binding.searchText.setText(savedInstanceState.getString(SEARCH_TEXT))
} }
gamesViewModel.searchFocused.observe(viewLifecycleOwner) { searchFocused ->
if (searchFocused) {
focusSearch()
gamesViewModel.setSearchFocused(false)
}
}
binding.gridGamesSearch.apply { binding.gridGamesSearch.apply {
layoutManager = AutofitGridLayoutManager( layoutManager = AutofitGridLayoutManager(
requireContext(), requireContext(),
@ -87,8 +80,16 @@ class SearchFragment : Fragment() {
filterAndSearch() filterAndSearch()
} }
gamesViewModel.games.observe(viewLifecycleOwner) { filterAndSearch() } gamesViewModel.apply {
gamesViewModel.searchedGames.observe(viewLifecycleOwner) { searchFocused.observe(viewLifecycleOwner) { searchFocused ->
if (searchFocused) {
focusSearch()
gamesViewModel.setSearchFocused(false)
}
}
games.observe(viewLifecycleOwner) { filterAndSearch() }
searchedGames.observe(viewLifecycleOwner) {
(binding.gridGamesSearch.adapter as GameAdapter).submitList(it) (binding.gridGamesSearch.adapter as GameAdapter).submitList(it)
if (it.isEmpty()) { if (it.isEmpty()) {
binding.noResultsView.visibility = View.VISIBLE binding.noResultsView.visibility = View.VISIBLE
@ -96,6 +97,7 @@ class SearchFragment : Fragment() {
binding.noResultsView.visibility = View.GONE binding.noResultsView.visibility = View.GONE
} }
} }
}
binding.clearButton.setOnClickListener { binding.searchText.setText("") } binding.clearButton.setOnClickListener { binding.searchText.setText("") }

View file

@ -55,30 +55,41 @@ class GamesFragment : Fragment() {
adapter = GameAdapter(requireActivity() as AppCompatActivity) adapter = GameAdapter(requireActivity() as AppCompatActivity)
} }
binding.swipeRefresh.apply {
// Add swipe down to refresh gesture // Add swipe down to refresh gesture
binding.swipeRefresh.setOnRefreshListener { setOnRefreshListener {
gamesViewModel.reloadGames(false) gamesViewModel.reloadGames(false)
} }
// Set theme color to the refresh animation's background // Set theme color to the refresh animation's background
binding.swipeRefresh.setProgressBackgroundColorSchemeColor( setProgressBackgroundColorSchemeColor(
MaterialColors.getColor( MaterialColors.getColor(
binding.swipeRefresh, binding.swipeRefresh,
com.google.android.material.R.attr.colorPrimary com.google.android.material.R.attr.colorPrimary
) )
) )
binding.swipeRefresh.setColorSchemeColors( setColorSchemeColors(
MaterialColors.getColor( MaterialColors.getColor(
binding.swipeRefresh, binding.swipeRefresh,
com.google.android.material.R.attr.colorOnPrimary com.google.android.material.R.attr.colorOnPrimary
) )
) )
// Make sure the loading indicator appears even if the layout is told to refresh before being fully drawn
post {
if (_binding == null) {
return@post
}
binding.swipeRefresh.isRefreshing = gamesViewModel.isReloading.value!!
}
}
gamesViewModel.apply {
// Watch for when we get updates to any of our games lists // Watch for when we get updates to any of our games lists
gamesViewModel.isReloading.observe(viewLifecycleOwner) { isReloading -> isReloading.observe(viewLifecycleOwner) { isReloading ->
binding.swipeRefresh.isRefreshing = isReloading binding.swipeRefresh.isRefreshing = isReloading
} }
gamesViewModel.games.observe(viewLifecycleOwner) { games.observe(viewLifecycleOwner) {
(binding.gridGames.adapter as GameAdapter).submitList(it) (binding.gridGames.adapter as GameAdapter).submitList(it)
if (it.isEmpty()) { if (it.isEmpty()) {
binding.noticeText.visibility = View.VISIBLE binding.noticeText.visibility = View.VISIBLE
@ -86,8 +97,7 @@ class GamesFragment : Fragment() {
binding.noticeText.visibility = View.GONE binding.noticeText.visibility = View.GONE
} }
} }
shouldSwapData.observe(viewLifecycleOwner) { shouldSwapData ->
gamesViewModel.shouldSwapData.observe(viewLifecycleOwner) { shouldSwapData ->
if (shouldSwapData) { if (shouldSwapData) {
(binding.gridGames.adapter as GameAdapter).submitList(gamesViewModel.games.value!!) (binding.gridGames.adapter as GameAdapter).submitList(gamesViewModel.games.value!!)
gamesViewModel.setShouldSwapData(false) gamesViewModel.setShouldSwapData(false)
@ -95,22 +105,15 @@ class GamesFragment : Fragment() {
} }
// Check if the user reselected the games menu item and then scroll to top of the list // Check if the user reselected the games menu item and then scroll to top of the list
gamesViewModel.shouldScrollToTop.observe(viewLifecycleOwner) { shouldScroll -> shouldScrollToTop.observe(viewLifecycleOwner) { shouldScroll ->
if (shouldScroll) { if (shouldScroll) {
scrollToTop() scrollToTop()
gamesViewModel.setShouldScrollToTop(false) gamesViewModel.setShouldScrollToTop(false)
} }
} }
}
setInsets() setInsets()
// Make sure the loading indicator appears even if the layout is told to refresh before being fully drawn
binding.swipeRefresh.post {
if (_binding == null) {
return@post
}
binding.swipeRefresh.isRefreshing = gamesViewModel.isReloading.value!!
}
} }
override fun onDestroyView() { override fun onDestroyView() {