Merge pull request #5359 from Bnyro/master

feat: separate landscape grid columns pref + more impacted adapters
This commit is contained in:
Bnyro 2023-12-19 16:00:07 +01:00 committed by GitHub
commit a9b58d9b2a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 134 additions and 57 deletions

View File

@ -29,7 +29,8 @@ object PreferenceKeys {
const val THEME_MODE = "theme_toggle" const val THEME_MODE = "theme_toggle"
const val PURE_THEME = "pure_theme" const val PURE_THEME = "pure_theme"
const val ACCENT_COLOR = "accent_color" const val ACCENT_COLOR = "accent_color"
const val GRID_COLUMNS = "grid" const val GRID_COLUMNS_PORTRAIT = "grid"
const val GRID_COLUMNS_LANDSCAPE = "grid_landscape"
const val LABEL_VISIBILITY = "label_visibility" const val LABEL_VISIBILITY = "label_visibility"
const val APP_ICON = "icon_change" const val APP_ICON = "icon_change"
const val LEGACY_SUBSCRIPTIONS = "legacy_subscriptions" const val LEGACY_SUBSCRIPTIONS = "legacy_subscriptions"

View File

@ -0,0 +1,5 @@
package com.github.libretube.extensions
import kotlin.math.ceil
fun Int.ceilHalf() = ceil((toDouble() / 2)).toInt()

View File

@ -9,7 +9,6 @@ import androidx.core.os.bundleOf
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.updateLayoutParams import androidx.core.view.updateLayoutParams
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.LayoutManager import androidx.recyclerview.widget.RecyclerView.LayoutManager
import com.github.libretube.R import com.github.libretube.R
@ -19,6 +18,7 @@ import com.github.libretube.constants.PreferenceKeys
import com.github.libretube.databinding.AllCaughtUpRowBinding import com.github.libretube.databinding.AllCaughtUpRowBinding
import com.github.libretube.databinding.TrendingRowBinding import com.github.libretube.databinding.TrendingRowBinding
import com.github.libretube.databinding.VideoRowBinding import com.github.libretube.databinding.VideoRowBinding
import com.github.libretube.extensions.ceilHalf
import com.github.libretube.extensions.dpToPx import com.github.libretube.extensions.dpToPx
import com.github.libretube.extensions.formatShort import com.github.libretube.extensions.formatShort
import com.github.libretube.extensions.toID import com.github.libretube.extensions.toID
@ -219,21 +219,15 @@ class VideosAdapter(
RELATED_COLUMN RELATED_COLUMN
} }
fun getLayout(context: Context): LayoutManager { fun getLayout(context: Context, gridItems: Int): LayoutManager {
return if (PreferenceHelper.getBoolean( return if (PreferenceHelper.getBoolean(
PreferenceKeys.ALTERNATIVE_VIDEOS_LAYOUT, PreferenceKeys.ALTERNATIVE_VIDEOS_LAYOUT,
false false
) )
) { ) {
LinearLayoutManager(context) GridLayoutManager(context, gridItems.ceilHalf())
} else { } else {
GridLayoutManager( GridLayoutManager(context, gridItems)
context,
PreferenceHelper.getString(
PreferenceKeys.GRID_COLUMNS,
context.resources.getInteger(R.integer.grid_items).toString()
).toInt()
)
} }
} }

View File

@ -0,0 +1,36 @@
package com.github.libretube.ui.base
import android.content.res.Configuration
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import com.github.libretube.R
import com.github.libretube.constants.PreferenceKeys
import com.github.libretube.helpers.PreferenceHelper
import kotlin.math.min
abstract class DynamicLayoutManagerFragment: Fragment() {
abstract fun setLayoutManagers(gridItems: Int)
private fun getGridItemsCount(orientation: Int): Int {
val (prefKey, defaultValueRes) = when (orientation) {
Configuration.ORIENTATION_PORTRAIT -> PreferenceKeys.GRID_COLUMNS_PORTRAIT to R.integer.grid_items
else -> PreferenceKeys.GRID_COLUMNS_LANDSCAPE to R.integer.grid_items_landscape
}
val defaultValue = resources.getInteger(defaultValueRes).toString()
return PreferenceHelper.getString(prefKey, defaultValue).toInt()
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
setLayoutManagers(getGridItemsCount(newConfig.orientation))
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setLayoutManagers(getGridItemsCount(resources.configuration.orientation))
}
}

View File

@ -9,9 +9,8 @@ import androidx.core.os.bundleOf
import androidx.core.view.children import androidx.core.view.children
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import com.github.libretube.R import com.github.libretube.R
import com.github.libretube.api.RetrofitInstance import com.github.libretube.api.RetrofitInstance
import com.github.libretube.api.SubscriptionHelper import com.github.libretube.api.SubscriptionHelper
@ -28,6 +27,7 @@ import com.github.libretube.obj.ChannelTabs
import com.github.libretube.obj.ShareData import com.github.libretube.obj.ShareData
import com.github.libretube.ui.adapters.SearchAdapter import com.github.libretube.ui.adapters.SearchAdapter
import com.github.libretube.ui.adapters.VideosAdapter import com.github.libretube.ui.adapters.VideosAdapter
import com.github.libretube.ui.base.DynamicLayoutManagerFragment
import com.github.libretube.ui.dialogs.ShareDialog import com.github.libretube.ui.dialogs.ShareDialog
import com.github.libretube.ui.extensions.setupSubscriptionButton import com.github.libretube.ui.extensions.setupSubscriptionButton
import com.github.libretube.ui.sheets.AddChannelToGroupSheet import com.github.libretube.ui.sheets.AddChannelToGroupSheet
@ -37,8 +37,9 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import retrofit2.HttpException import retrofit2.HttpException
import java.io.IOException import java.io.IOException
import kotlin.math.ceil
class ChannelFragment : Fragment() { class ChannelFragment : DynamicLayoutManagerFragment() {
private var _binding: FragmentChannelBinding? = null private var _binding: FragmentChannelBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
@ -77,11 +78,15 @@ class ChannelFragment : Fragment() {
return binding.root return binding.root
} }
override fun setLayoutManagers(gridItems: Int) {
_binding?.channelRecView?.layoutManager = GridLayoutManager(context,
ceil((gridItems.toDouble() / 2)).toInt()
)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.channelRecView.layoutManager = LinearLayoutManager(context)
binding.channelRefresh.setOnRefreshListener { binding.channelRefresh.setOnRefreshListener {
fetchChannel() fetchChannel()
} }

View File

@ -11,21 +11,22 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.github.libretube.R import com.github.libretube.R
import com.github.libretube.databinding.FragmentDownloadsBinding import com.github.libretube.databinding.FragmentDownloadsBinding
import com.github.libretube.db.DatabaseHolder.Database import com.github.libretube.db.DatabaseHolder.Database
import com.github.libretube.db.obj.DownloadWithItems import com.github.libretube.db.obj.DownloadWithItems
import com.github.libretube.extensions.ceilHalf
import com.github.libretube.extensions.formatAsFileSize import com.github.libretube.extensions.formatAsFileSize
import com.github.libretube.helpers.DownloadHelper import com.github.libretube.helpers.DownloadHelper
import com.github.libretube.obj.DownloadStatus import com.github.libretube.obj.DownloadStatus
import com.github.libretube.receivers.DownloadReceiver import com.github.libretube.receivers.DownloadReceiver
import com.github.libretube.services.DownloadService import com.github.libretube.services.DownloadService
import com.github.libretube.ui.adapters.DownloadsAdapter import com.github.libretube.ui.adapters.DownloadsAdapter
import com.github.libretube.ui.base.DynamicLayoutManagerFragment
import com.github.libretube.ui.viewholders.DownloadsViewHolder import com.github.libretube.ui.viewholders.DownloadsViewHolder
import kotlin.io.path.fileSize import kotlin.io.path.fileSize
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -34,7 +35,7 @@ import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
class DownloadsFragment : Fragment() { class DownloadsFragment : DynamicLayoutManagerFragment() {
private var _binding: FragmentDownloadsBinding? = null private var _binding: FragmentDownloadsBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
@ -72,6 +73,10 @@ class DownloadsFragment : Fragment() {
return binding.root return binding.root
} }
override fun setLayoutManagers(gridItems: Int) {
_binding?.downloads?.layoutManager = GridLayoutManager(context, gridItems.ceilHalf())
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@ -85,8 +90,6 @@ class DownloadsFragment : Fragment() {
binding.downloadsEmpty.isGone = true binding.downloadsEmpty.isGone = true
binding.downloads.isVisible = true binding.downloads.isVisible = true
binding.downloads.layoutManager = LinearLayoutManager(context)
val adapter = DownloadsAdapter(requireContext(), downloads) { val adapter = DownloadsAdapter(requireContext(), downloads) {
var isDownloading = false var isDownloading = false
val ids = it.downloadItems val ids = it.downloadItems

View File

@ -10,13 +10,12 @@ import android.widget.Toast
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams import androidx.core.view.updateLayoutParams
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.github.libretube.R import com.github.libretube.R
import com.github.libretube.api.PlaylistsHelper import com.github.libretube.api.PlaylistsHelper
@ -26,11 +25,13 @@ import com.github.libretube.constants.PreferenceKeys
import com.github.libretube.databinding.FragmentLibraryBinding import com.github.libretube.databinding.FragmentLibraryBinding
import com.github.libretube.db.DatabaseHolder import com.github.libretube.db.DatabaseHolder
import com.github.libretube.extensions.TAG import com.github.libretube.extensions.TAG
import com.github.libretube.extensions.ceilHalf
import com.github.libretube.extensions.dpToPx import com.github.libretube.extensions.dpToPx
import com.github.libretube.helpers.NavBarHelper import com.github.libretube.helpers.NavBarHelper
import com.github.libretube.helpers.PreferenceHelper 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.base.DynamicLayoutManagerFragment
import com.github.libretube.ui.dialogs.CreatePlaylistDialog import com.github.libretube.ui.dialogs.CreatePlaylistDialog
import com.github.libretube.ui.dialogs.CreatePlaylistDialog.Companion.CREATE_PLAYLIST_DIALOG_REQUEST_KEY import com.github.libretube.ui.dialogs.CreatePlaylistDialog.Companion.CREATE_PLAYLIST_DIALOG_REQUEST_KEY
import com.github.libretube.ui.models.PlayerViewModel import com.github.libretube.ui.models.PlayerViewModel
@ -39,7 +40,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
class LibraryFragment : Fragment() { class LibraryFragment : DynamicLayoutManagerFragment() {
private var _binding: FragmentLibraryBinding? = null private var _binding: FragmentLibraryBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
@ -54,13 +55,14 @@ class LibraryFragment : Fragment() {
return binding.root return binding.root
} }
override fun setLayoutManagers(gridItems: Int) {
_binding?.bookmarksRecView?.layoutManager = GridLayoutManager(context, gridItems.ceilHalf())
_binding?.playlistRecView?.layoutManager = GridLayoutManager(context, gridItems.ceilHalf())
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
// initialize the layout managers
binding.bookmarksRecView.layoutManager = LinearLayoutManager(context)
binding.playlistRecView.layoutManager = LinearLayoutManager(context)
// listen for the mini player state changing // listen for the mini player state changing
playerViewModel.isMiniPlayerVisible.observe(viewLifecycleOwner) { playerViewModel.isMiniPlayerVisible.observe(viewLifecycleOwner) {
updateFABMargin(it) updateFABMargin(it)

View File

@ -11,11 +11,10 @@ import androidx.core.text.parseAsHtml
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.github.libretube.R import com.github.libretube.R
import com.github.libretube.api.PlaylistsHelper import com.github.libretube.api.PlaylistsHelper
@ -28,6 +27,7 @@ import com.github.libretube.databinding.FragmentPlaylistBinding
import com.github.libretube.db.DatabaseHolder import com.github.libretube.db.DatabaseHolder
import com.github.libretube.enums.PlaylistType import com.github.libretube.enums.PlaylistType
import com.github.libretube.extensions.TAG import com.github.libretube.extensions.TAG
import com.github.libretube.extensions.ceilHalf
import com.github.libretube.extensions.dpToPx import com.github.libretube.extensions.dpToPx
import com.github.libretube.extensions.serializable import com.github.libretube.extensions.serializable
import com.github.libretube.extensions.toID import com.github.libretube.extensions.toID
@ -38,6 +38,7 @@ import com.github.libretube.helpers.PreferenceHelper
import com.github.libretube.ui.activities.MainActivity import com.github.libretube.ui.activities.MainActivity
import com.github.libretube.ui.adapters.PlaylistAdapter import com.github.libretube.ui.adapters.PlaylistAdapter
import com.github.libretube.ui.base.BaseActivity import com.github.libretube.ui.base.BaseActivity
import com.github.libretube.ui.base.DynamicLayoutManagerFragment
import com.github.libretube.ui.models.PlayerViewModel import com.github.libretube.ui.models.PlayerViewModel
import com.github.libretube.ui.sheets.BaseBottomSheet import com.github.libretube.ui.sheets.BaseBottomSheet
import com.github.libretube.ui.sheets.PlaylistOptionsBottomSheet import com.github.libretube.ui.sheets.PlaylistOptionsBottomSheet
@ -47,7 +48,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
class PlaylistFragment : Fragment() { class PlaylistFragment : DynamicLayoutManagerFragment() {
private var _binding: FragmentPlaylistBinding? = null private var _binding: FragmentPlaylistBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
@ -89,10 +90,13 @@ class PlaylistFragment : Fragment() {
return binding.root return binding.root
} }
override fun setLayoutManagers(gridItems: Int) {
_binding?.playlistRecView?.layoutManager = GridLayoutManager(context, gridItems.ceilHalf())
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.playlistRecView.layoutManager = LinearLayoutManager(context)
binding.playlistProgress.isVisible = true binding.playlistProgress.isVisible = true
isBookmarked = runBlocking(Dispatchers.IO) { isBookmarked = runBlocking(Dispatchers.IO) {

View File

@ -7,9 +7,8 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import com.github.libretube.R import com.github.libretube.R
import com.github.libretube.api.RetrofitInstance import com.github.libretube.api.RetrofitInstance
import com.github.libretube.constants.IntentData import com.github.libretube.constants.IntentData
@ -18,11 +17,13 @@ import com.github.libretube.databinding.FragmentSearchResultBinding
import com.github.libretube.db.DatabaseHelper import com.github.libretube.db.DatabaseHelper
import com.github.libretube.db.obj.SearchHistoryItem import com.github.libretube.db.obj.SearchHistoryItem
import com.github.libretube.extensions.TAG import com.github.libretube.extensions.TAG
import com.github.libretube.extensions.ceilHalf
import com.github.libretube.extensions.hideKeyboard import com.github.libretube.extensions.hideKeyboard
import com.github.libretube.extensions.toastFromMainDispatcher import com.github.libretube.extensions.toastFromMainDispatcher
import com.github.libretube.helpers.PreferenceHelper import com.github.libretube.helpers.PreferenceHelper
import com.github.libretube.ui.activities.MainActivity import com.github.libretube.ui.activities.MainActivity
import com.github.libretube.ui.adapters.SearchAdapter import com.github.libretube.ui.adapters.SearchAdapter
import com.github.libretube.ui.base.DynamicLayoutManagerFragment
import com.github.libretube.ui.dialogs.ShareDialog import com.github.libretube.ui.dialogs.ShareDialog
import com.github.libretube.util.TextUtils import com.github.libretube.util.TextUtils
import com.github.libretube.util.TextUtils.toTimeInSeconds import com.github.libretube.util.TextUtils.toTimeInSeconds
@ -31,8 +32,9 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import kotlin.math.ceil
class SearchResultFragment : Fragment() { class SearchResultFragment : DynamicLayoutManagerFragment() {
private var _binding: FragmentSearchResultBinding? = null private var _binding: FragmentSearchResultBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
@ -56,6 +58,10 @@ class SearchResultFragment : Fragment() {
return binding.root return binding.root
} }
override fun setLayoutManagers(gridItems: Int) {
_binding?.searchRecycler?.layoutManager = GridLayoutManager(context, gridItems.ceilHalf())
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@ -63,8 +69,6 @@ class SearchResultFragment : Fragment() {
// different queries in a row and navigating to the previous ones through back presses // different queries in a row and navigating to the previous ones through back presses
(context as MainActivity).setQuerySilent(query) (context as MainActivity).setQuerySilent(query)
binding.searchRecycler.layoutManager = LinearLayoutManager(requireContext())
// add the query to the history // add the query to the history
addToHistory(query) addToHistory(query)

View File

@ -14,7 +14,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import com.github.libretube.api.RetrofitInstance import com.github.libretube.api.RetrofitInstance
import com.github.libretube.constants.IntentData import com.github.libretube.constants.IntentData
import com.github.libretube.constants.PreferenceKeys import com.github.libretube.constants.PreferenceKeys
import com.github.libretube.databinding.FragmentSearchBinding import com.github.libretube.databinding.FragmentSearchSuggestionsBinding
import com.github.libretube.db.DatabaseHolder.Database import com.github.libretube.db.DatabaseHolder.Database
import com.github.libretube.extensions.TAG import com.github.libretube.extensions.TAG
import com.github.libretube.helpers.PreferenceHelper import com.github.libretube.helpers.PreferenceHelper
@ -26,8 +26,8 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
class SearchFragment : Fragment() { class SearchSuggestionsFragment : Fragment() {
private var _binding: FragmentSearchBinding? = null private var _binding: FragmentSearchSuggestionsBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
private val viewModel: SearchViewModel by activityViewModels() private val viewModel: SearchViewModel by activityViewModels()
@ -41,7 +41,7 @@ class SearchFragment : Fragment() {
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View { ): View {
_binding = FragmentSearchBinding.inflate(inflater) _binding = FragmentSearchSuggestionsBinding.inflate(inflater)
return binding.root return binding.root
} }

View File

@ -10,7 +10,6 @@ import androidx.core.view.children
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams import androidx.core.view.updateLayoutParams
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
@ -29,6 +28,7 @@ import com.github.libretube.helpers.PreferenceHelper
import com.github.libretube.ui.adapters.LegacySubscriptionAdapter import com.github.libretube.ui.adapters.LegacySubscriptionAdapter
import com.github.libretube.ui.adapters.SubscriptionChannelAdapter import com.github.libretube.ui.adapters.SubscriptionChannelAdapter
import com.github.libretube.ui.adapters.VideosAdapter import com.github.libretube.ui.adapters.VideosAdapter
import com.github.libretube.ui.base.DynamicLayoutManagerFragment
import com.github.libretube.ui.models.EditChannelGroupsModel import com.github.libretube.ui.models.EditChannelGroupsModel
import com.github.libretube.ui.models.PlayerViewModel import com.github.libretube.ui.models.PlayerViewModel
import com.github.libretube.ui.models.SubscriptionsViewModel import com.github.libretube.ui.models.SubscriptionsViewModel
@ -40,7 +40,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
class SubscriptionsFragment : Fragment() { class SubscriptionsFragment : DynamicLayoutManagerFragment() {
private var _binding: FragmentSubscriptionsBinding? = null private var _binding: FragmentSubscriptionsBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
@ -72,6 +72,10 @@ class SubscriptionsFragment : Fragment() {
return binding.root return binding.root
} }
override fun setLayoutManagers(gridItems: Int) {
_binding?.subFeed?.layoutManager = VideosAdapter.getLayout(requireContext(), gridItems)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@ -87,8 +91,6 @@ class SubscriptionsFragment : Fragment() {
binding.subRefresh.isEnabled = true binding.subRefresh.isEnabled = true
binding.subProgress.isVisible = true binding.subProgress.isVisible = true
binding.subFeed.layoutManager = VideosAdapter.getLayout(requireContext())
if (!isCurrentTabSubChannels && (viewModel.videoFeed.value == null || !loadFeedInBackground)) { if (!isCurrentTabSubChannels && (viewModel.videoFeed.value == null || !loadFeedInBackground)) {
viewModel.videoFeed.value = null viewModel.videoFeed.value = null
viewModel.fetchFeed(requireContext()) viewModel.fetchFeed(requireContext())

View File

@ -8,7 +8,6 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.github.libretube.R import com.github.libretube.R
import com.github.libretube.api.RetrofitInstance import com.github.libretube.api.RetrofitInstance
@ -17,6 +16,7 @@ import com.github.libretube.extensions.TAG
import com.github.libretube.helpers.LocaleHelper import com.github.libretube.helpers.LocaleHelper
import com.github.libretube.ui.activities.SettingsActivity import com.github.libretube.ui.activities.SettingsActivity
import com.github.libretube.ui.adapters.VideosAdapter import com.github.libretube.ui.adapters.VideosAdapter
import com.github.libretube.ui.base.DynamicLayoutManagerFragment
import com.github.libretube.util.deArrow import com.github.libretube.util.deArrow
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import java.io.IOException import java.io.IOException
@ -25,7 +25,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import retrofit2.HttpException import retrofit2.HttpException
class TrendsFragment : Fragment() { class TrendsFragment : DynamicLayoutManagerFragment() {
private var _binding: FragmentTrendsBinding? = null private var _binding: FragmentTrendsBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
@ -38,6 +38,10 @@ class TrendsFragment : Fragment() {
return binding.root return binding.root
} }
override fun setLayoutManagers(gridItems: Int) {
_binding?.recview?.layoutManager = VideosAdapter.getLayout(requireContext(), gridItems)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@ -87,7 +91,6 @@ class TrendsFragment : Fragment() {
} }
binding.recview.adapter = VideosAdapter(response.toMutableList()) binding.recview.adapter = VideosAdapter(response.toMutableList())
binding.recview.layoutManager = VideosAdapter.getLayout(requireContext())
} }
} }
} }

View File

@ -10,11 +10,10 @@ import androidx.core.os.postDelayed
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.github.libretube.R import com.github.libretube.R
import com.github.libretube.api.obj.StreamItem import com.github.libretube.api.obj.StreamItem
@ -23,11 +22,13 @@ import com.github.libretube.databinding.FragmentWatchHistoryBinding
import com.github.libretube.db.DatabaseHelper import com.github.libretube.db.DatabaseHelper
import com.github.libretube.db.DatabaseHolder.Database import com.github.libretube.db.DatabaseHolder.Database
import com.github.libretube.db.obj.WatchHistoryItem import com.github.libretube.db.obj.WatchHistoryItem
import com.github.libretube.extensions.ceilHalf
import com.github.libretube.extensions.dpToPx import com.github.libretube.extensions.dpToPx
import com.github.libretube.helpers.NavigationHelper import com.github.libretube.helpers.NavigationHelper
import com.github.libretube.helpers.PreferenceHelper import com.github.libretube.helpers.PreferenceHelper
import com.github.libretube.helpers.ProxyHelper import com.github.libretube.helpers.ProxyHelper
import com.github.libretube.ui.adapters.WatchHistoryAdapter import com.github.libretube.ui.adapters.WatchHistoryAdapter
import com.github.libretube.ui.base.DynamicLayoutManagerFragment
import com.github.libretube.ui.models.PlayerViewModel import com.github.libretube.ui.models.PlayerViewModel
import com.github.libretube.ui.sheets.BaseBottomSheet import com.github.libretube.ui.sheets.BaseBottomSheet
import com.github.libretube.util.PlayingQueue import com.github.libretube.util.PlayingQueue
@ -36,7 +37,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
class WatchHistoryFragment : Fragment() { class WatchHistoryFragment : DynamicLayoutManagerFragment() {
private var _binding: FragmentWatchHistoryBinding? = null private var _binding: FragmentWatchHistoryBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
@ -70,6 +71,10 @@ class WatchHistoryFragment : Fragment() {
return binding.root return binding.root
} }
override fun setLayoutManagers(gridItems: Int) {
_binding?.watchHistoryRecView?.layoutManager = GridLayoutManager(context, gridItems.ceilHalf())
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@ -163,7 +168,6 @@ class WatchHistoryFragment : Fragment() {
) )
} }
binding.watchHistoryRecView.layoutManager = LinearLayoutManager(context)
binding.watchHistoryRecView.adapter = watchHistoryAdapter binding.watchHistoryRecView.adapter = watchHistoryAdapter
binding.historyEmpty.isGone = true binding.historyEmpty.isGone = true
binding.historyScrollView.isVisible = true binding.historyScrollView.isVisible = true

View File

@ -3,7 +3,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".ui.fragments.SearchFragment"> tools:context=".ui.fragments.SearchSuggestionsFragment">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/suggestions_recycler" android:id="@+id/suggestions_recycler"

View File

@ -26,9 +26,9 @@
tools:layout="@layout/fragment_library" /> tools:layout="@layout/fragment_library" />
<fragment <fragment
android:id="@+id/searchFragment" android:id="@+id/searchFragment"
android:name="com.github.libretube.ui.fragments.SearchFragment" android:name="com.github.libretube.ui.fragments.SearchSuggestionsFragment"
android:label="fragment_search" android:label="fragment_search"
tools:layout="@layout/fragment_search" /> tools:layout="@layout/fragment_search_suggestions" />
<fragment <fragment
android:id="@+id/searchResultFragment" android:id="@+id/searchResultFragment"
android:name="com.github.libretube.ui.fragments.SearchResultFragment" android:name="com.github.libretube.ui.fragments.SearchResultFragment"

View File

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<integer name="grid_items">2</integer> <integer name="grid_items">2</integer>
<integer name="grid_items_landscape">4</integer>
</resources> </resources>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<integer name="grid_items">4</integer> <integer name="grid_items">3</integer>
<integer name="grid_items_landscape">6</integer>
</resources> </resources>

View File

@ -205,6 +205,7 @@
<item>3</item> <item>3</item>
<item>4</item> <item>4</item>
<item>5</item> <item>5</item>
<item>6</item>
</string-array> </string-array>
<string-array name="bufferingGoal"> <string-array name="bufferingGoal">

View File

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<integer name="grid_items">1</integer> <integer name="grid_items">1</integer>
<integer name="grid_items_landscape">2</integer>
</resources> </resources>

View File

@ -39,7 +39,8 @@
<string name="empty">You have to enter a username and password.</string> <string name="empty">You have to enter a username and password.</string>
<string name="notgmail">This is for a Piped account.</string> <string name="notgmail">This is for a Piped account.</string>
<string name="defres">Video resolution</string> <string name="defres">Video resolution</string>
<string name="grid">Grid columns</string> <string name="grid">Grid columns (portrait)</string>
<string name="grid_landscape">Grid columns (landscape)</string>
<string name="emptyList">Nothing here.</string> <string name="emptyList">Nothing here.</string>
<string name="deletePlaylist">Delete playlist</string> <string name="deletePlaylist">Delete playlist</string>
<string name="areYouSure">Delete the playlist?</string> <string name="areYouSure">Delete the playlist?</string>

View File

@ -94,6 +94,15 @@
app:title="@string/grid" app:title="@string/grid"
app:useSimpleSummaryProvider="true" /> app:useSimpleSummaryProvider="true" />
<ListPreference
android:icon="@drawable/ic_grid"
app:defaultValue="@integer/grid_items_landscape"
app:entries="@array/grid"
app:entryValues="@array/grid"
app:key="grid_landscape"
app:title="@string/grid_landscape"
app:useSimpleSummaryProvider="true" />
</PreferenceCategory> </PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>