Merge pull request #3040 from Bnyro/master

Improve home page loading behavior
This commit is contained in:
Bnyro 2023-02-12 15:48:55 +01:00 committed by GitHub
commit 12bb5c7d4e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,10 +1,10 @@
package com.github.libretube.ui.fragments package com.github.libretube.ui.fragments
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
@ -14,21 +14,23 @@ import com.github.libretube.R
import com.github.libretube.api.PlaylistsHelper import com.github.libretube.api.PlaylistsHelper
import com.github.libretube.api.RetrofitInstance import com.github.libretube.api.RetrofitInstance
import com.github.libretube.api.SubscriptionHelper import com.github.libretube.api.SubscriptionHelper
import com.github.libretube.constants.PreferenceKeys
import com.github.libretube.databinding.FragmentHomeBinding import com.github.libretube.databinding.FragmentHomeBinding
import com.github.libretube.db.DatabaseHolder import com.github.libretube.db.DatabaseHolder
import com.github.libretube.extensions.awaitQuery import com.github.libretube.extensions.awaitQuery
import com.github.libretube.extensions.toastFromMainThread
import com.github.libretube.helpers.LocaleHelper import com.github.libretube.helpers.LocaleHelper
import com.github.libretube.helpers.PreferenceHelper
import com.github.libretube.ui.adapters.PlaylistBookmarkAdapter import com.github.libretube.ui.adapters.PlaylistBookmarkAdapter
import com.github.libretube.ui.adapters.PlaylistsAdapter import com.github.libretube.ui.adapters.PlaylistsAdapter
import com.github.libretube.ui.adapters.VideosAdapter import com.github.libretube.ui.adapters.VideosAdapter
import com.github.libretube.ui.base.BaseFragment import com.github.libretube.ui.base.BaseFragment
import kotlinx.coroutines.CancellationException import com.github.libretube.ui.models.SubscriptionsViewModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.withContext
class HomeFragment : BaseFragment() { class HomeFragment : BaseFragment() {
private lateinit var binding: FragmentHomeBinding private lateinit var binding: FragmentHomeBinding
private val subscriptionsViewModel: SubscriptionsViewModel by activityViewModels()
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
@ -60,20 +62,52 @@ class HomeFragment : BaseFragment() {
binding.refresh.setOnRefreshListener { binding.refresh.setOnRefreshListener {
binding.refresh.isRefreshing = true binding.refresh.isRefreshing = true
lifecycleScope.launch(Dispatchers.IO) { fetchHomeFeed()
fetchHome() }
fetchHomeFeed()
}
private fun fetchHomeFeed() {
lifecycleScope.launchWhenCreated {
withContext(Dispatchers.IO) {
loadTrending()
loadBookmarks()
}
}
lifecycleScope.launchWhenCreated {
withContext(Dispatchers.IO) {
loadFeed()
loadPlaylists()
}
} }
} }
lifecycleScope.launch(Dispatchers.IO) { private suspend fun loadTrending() {
fetchHome() val region = LocaleHelper.getTrendingRegion(requireContext())
val trending = RetrofitInstance.api.getTrending(region).take(10)
if (trending.isEmpty()) return
runOnUiThread {
makeVisible(binding.trendingRV, binding.trendingTV)
binding.trendingRV.layoutManager = GridLayoutManager(context, 2)
binding.trendingRV.adapter = VideosAdapter(
trending.toMutableList(),
forceMode = VideosAdapter.Companion.ForceMode.TRENDING
)
} }
} }
private suspend fun fetchHome() { private suspend fun loadFeed() {
runOrError { val feed = if (
val feed = SubscriptionHelper.getFeed().take(20) PreferenceHelper.getBoolean(PreferenceKeys.SAVE_FEED, false) &&
if (feed.isEmpty()) return@runOrError !subscriptionsViewModel.videoFeed.value.isNullOrEmpty()
) {
subscriptionsViewModel.videoFeed.value.orEmpty()
} else {
SubscriptionHelper.getFeed()
}.take(20)
if (feed.isEmpty()) return
runOnUiThread { runOnUiThread {
makeVisible(binding.featuredRV, binding.featuredTV) makeVisible(binding.featuredRV, binding.featuredTV)
binding.featuredRV.layoutManager = LinearLayoutManager( binding.featuredRV.layoutManager = LinearLayoutManager(
@ -88,23 +122,29 @@ class HomeFragment : BaseFragment() {
} }
} }
runOrError { private fun loadBookmarks() {
val region = LocaleHelper.getTrendingRegion(requireContext()) val bookmarkedPlaylists = awaitQuery {
val trending = RetrofitInstance.api.getTrending(region).take(10) DatabaseHolder.Database.playlistBookmarkDao().getAll()
if (trending.isEmpty()) return@runOrError }
if (bookmarkedPlaylists.isEmpty()) return
runOnUiThread { runOnUiThread {
makeVisible(binding.trendingRV, binding.trendingTV) makeVisible(binding.bookmarksTV, binding.bookmarksRV)
binding.trendingRV.layoutManager = GridLayoutManager(context, 2) binding.bookmarksRV.layoutManager = LinearLayoutManager(
binding.trendingRV.adapter = VideosAdapter( context,
trending.toMutableList(), LinearLayoutManager.HORIZONTAL,
forceMode = VideosAdapter.Companion.ForceMode.TRENDING false
)
binding.bookmarksRV.adapter = PlaylistBookmarkAdapter(
bookmarkedPlaylists,
PlaylistBookmarkAdapter.Companion.BookmarkMode.HOME
) )
} }
} }
runOrError { private suspend fun loadPlaylists() {
val playlists = PlaylistsHelper.getPlaylists().take(20) val playlists = PlaylistsHelper.getPlaylists().take(20)
if (playlists.isEmpty()) return@runOrError if (playlists.isEmpty()) return
runOnUiThread { runOnUiThread {
makeVisible(binding.playlistsRV, binding.playlistsTV) makeVisible(binding.playlistsRV, binding.playlistsTV)
binding.playlistsRV.layoutManager = LinearLayoutManager(context) binding.playlistsRV.layoutManager = LinearLayoutManager(context)
@ -125,40 +165,6 @@ class HomeFragment : BaseFragment() {
} }
} }
runOrError {
val bookmarkedPlaylists = awaitQuery {
DatabaseHolder.Database.playlistBookmarkDao().getAll()
}
if (bookmarkedPlaylists.isEmpty()) return@runOrError
runOnUiThread {
makeVisible(binding.bookmarksTV, binding.bookmarksRV)
binding.bookmarksRV.layoutManager = LinearLayoutManager(
context,
LinearLayoutManager.HORIZONTAL,
false
)
binding.bookmarksRV.adapter = PlaylistBookmarkAdapter(
bookmarkedPlaylists,
PlaylistBookmarkAdapter.Companion.BookmarkMode.HOME
)
}
}
}
private fun runOrError(action: suspend () -> Unit) {
lifecycleScope.launch(Dispatchers.IO) {
try {
action.invoke()
// Can be caused due to activity launch in front view from PiP mode.
} catch (e: CancellationException) {
Log.e("fetching home tab", e.toString())
} catch (e: Exception) {
e.localizedMessage?.let { context?.toastFromMainThread(it) }
Log.e("fetching home tab", e.toString())
}
}
}
private fun makeVisible(vararg views: View) { private fun makeVisible(vararg views: View) {
views.forEach { views.forEach {
it.visibility = View.VISIBLE it.visibility = View.VISIBLE