diff --git a/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt b/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt
index b83e6bc33..7afa7804e 100644
--- a/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt
+++ b/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt
@@ -29,7 +29,8 @@ object PreferenceKeys {
const val THEME_MODE = "theme_toggle"
const val PURE_THEME = "pure_theme"
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 APP_ICON = "icon_change"
const val LEGACY_SUBSCRIPTIONS = "legacy_subscriptions"
diff --git a/app/src/main/java/com/github/libretube/extensions/Int.kt b/app/src/main/java/com/github/libretube/extensions/Int.kt
new file mode 100644
index 000000000..3e6af313f
--- /dev/null
+++ b/app/src/main/java/com/github/libretube/extensions/Int.kt
@@ -0,0 +1,5 @@
+package com.github.libretube.extensions
+
+import kotlin.math.ceil
+
+fun Int.ceilHalf() = ceil((toDouble() / 2)).toInt()
\ No newline at end of file
diff --git a/app/src/main/java/com/github/libretube/ui/adapters/VideosAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/VideosAdapter.kt
index ca77c9bde..6d8cf2a72 100644
--- a/app/src/main/java/com/github/libretube/ui/adapters/VideosAdapter.kt
+++ b/app/src/main/java/com/github/libretube/ui/adapters/VideosAdapter.kt
@@ -9,7 +9,6 @@ import androidx.core.os.bundleOf
import androidx.core.view.isGone
import androidx.core.view.updateLayoutParams
import androidx.recyclerview.widget.GridLayoutManager
-import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.LayoutManager
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.TrendingRowBinding
import com.github.libretube.databinding.VideoRowBinding
+import com.github.libretube.extensions.ceilHalf
import com.github.libretube.extensions.dpToPx
import com.github.libretube.extensions.formatShort
import com.github.libretube.extensions.toID
@@ -219,21 +219,15 @@ class VideosAdapter(
RELATED_COLUMN
}
- fun getLayout(context: Context): LayoutManager {
+ fun getLayout(context: Context, gridItems: Int): LayoutManager {
return if (PreferenceHelper.getBoolean(
PreferenceKeys.ALTERNATIVE_VIDEOS_LAYOUT,
false
)
) {
- LinearLayoutManager(context)
+ GridLayoutManager(context, gridItems.ceilHalf())
} else {
- GridLayoutManager(
- context,
- PreferenceHelper.getString(
- PreferenceKeys.GRID_COLUMNS,
- context.resources.getInteger(R.integer.grid_items).toString()
- ).toInt()
- )
+ GridLayoutManager(context, gridItems)
}
}
diff --git a/app/src/main/java/com/github/libretube/ui/base/DynamicLayoutManagerFragment.kt b/app/src/main/java/com/github/libretube/ui/base/DynamicLayoutManagerFragment.kt
new file mode 100644
index 000000000..6b599b248
--- /dev/null
+++ b/app/src/main/java/com/github/libretube/ui/base/DynamicLayoutManagerFragment.kt
@@ -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))
+ }
+}
diff --git a/app/src/main/java/com/github/libretube/ui/fragments/ChannelFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/ChannelFragment.kt
index d4fd73fc8..6a422fa86 100644
--- a/app/src/main/java/com/github/libretube/ui/fragments/ChannelFragment.kt
+++ b/app/src/main/java/com/github/libretube/ui/fragments/ChannelFragment.kt
@@ -9,9 +9,8 @@ import androidx.core.os.bundleOf
import androidx.core.view.children
import androidx.core.view.isGone
import androidx.core.view.isVisible
-import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
-import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.GridLayoutManager
import com.github.libretube.R
import com.github.libretube.api.RetrofitInstance
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.ui.adapters.SearchAdapter
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.extensions.setupSubscriptionButton
import com.github.libretube.ui.sheets.AddChannelToGroupSheet
@@ -37,8 +37,9 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import retrofit2.HttpException
import java.io.IOException
+import kotlin.math.ceil
-class ChannelFragment : Fragment() {
+class ChannelFragment : DynamicLayoutManagerFragment() {
private var _binding: FragmentChannelBinding? = null
private val binding get() = _binding!!
@@ -77,11 +78,15 @@ class ChannelFragment : Fragment() {
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?) {
super.onViewCreated(view, savedInstanceState)
- binding.channelRecView.layoutManager = LinearLayoutManager(context)
-
binding.channelRefresh.setOnRefreshListener {
fetchChannel()
}
diff --git a/app/src/main/java/com/github/libretube/ui/fragments/DownloadsFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/DownloadsFragment.kt
index cf84b2f76..57010b820 100644
--- a/app/src/main/java/com/github/libretube/ui/fragments/DownloadsFragment.kt
+++ b/app/src/main/java/com/github/libretube/ui/fragments/DownloadsFragment.kt
@@ -11,21 +11,22 @@ import android.view.View
import android.view.ViewGroup
import androidx.core.view.isGone
import androidx.core.view.isVisible
-import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
+import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.ItemTouchHelper
-import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.github.libretube.R
import com.github.libretube.databinding.FragmentDownloadsBinding
import com.github.libretube.db.DatabaseHolder.Database
import com.github.libretube.db.obj.DownloadWithItems
+import com.github.libretube.extensions.ceilHalf
import com.github.libretube.extensions.formatAsFileSize
import com.github.libretube.helpers.DownloadHelper
import com.github.libretube.obj.DownloadStatus
import com.github.libretube.receivers.DownloadReceiver
import com.github.libretube.services.DownloadService
import com.github.libretube.ui.adapters.DownloadsAdapter
+import com.github.libretube.ui.base.DynamicLayoutManagerFragment
import com.github.libretube.ui.viewholders.DownloadsViewHolder
import kotlin.io.path.fileSize
import kotlinx.coroutines.Dispatchers
@@ -34,7 +35,7 @@ import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
-class DownloadsFragment : Fragment() {
+class DownloadsFragment : DynamicLayoutManagerFragment() {
private var _binding: FragmentDownloadsBinding? = null
private val binding get() = _binding!!
@@ -72,6 +73,10 @@ class DownloadsFragment : Fragment() {
return binding.root
}
+ override fun setLayoutManagers(gridItems: Int) {
+ _binding?.downloads?.layoutManager = GridLayoutManager(context, gridItems.ceilHalf())
+ }
+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -85,8 +90,6 @@ class DownloadsFragment : Fragment() {
binding.downloadsEmpty.isGone = true
binding.downloads.isVisible = true
- binding.downloads.layoutManager = LinearLayoutManager(context)
-
val adapter = DownloadsAdapter(requireContext(), downloads) {
var isDownloading = false
val ids = it.downloadItems
diff --git a/app/src/main/java/com/github/libretube/ui/fragments/LibraryFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/LibraryFragment.kt
index d7ebcb6aa..80bfe2be8 100644
--- a/app/src/main/java/com/github/libretube/ui/fragments/LibraryFragment.kt
+++ b/app/src/main/java/com/github/libretube/ui/fragments/LibraryFragment.kt
@@ -10,13 +10,12 @@ import android.widget.Toast
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
-import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.fragment.findNavController
-import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.github.libretube.R
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.db.DatabaseHolder
import com.github.libretube.extensions.TAG
+import com.github.libretube.extensions.ceilHalf
import com.github.libretube.extensions.dpToPx
import com.github.libretube.helpers.NavBarHelper
import com.github.libretube.helpers.PreferenceHelper
import com.github.libretube.ui.adapters.PlaylistBookmarkAdapter
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.Companion.CREATE_PLAYLIST_DIALOG_REQUEST_KEY
import com.github.libretube.ui.models.PlayerViewModel
@@ -39,7 +40,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
-class LibraryFragment : Fragment() {
+class LibraryFragment : DynamicLayoutManagerFragment() {
private var _binding: FragmentLibraryBinding? = null
private val binding get() = _binding!!
@@ -54,13 +55,14 @@ class LibraryFragment : Fragment() {
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?) {
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
playerViewModel.isMiniPlayerVisible.observe(viewLifecycleOwner) {
updateFABMargin(it)
diff --git a/app/src/main/java/com/github/libretube/ui/fragments/PlaylistFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/PlaylistFragment.kt
index aec529949..472364d70 100644
--- a/app/src/main/java/com/github/libretube/ui/fragments/PlaylistFragment.kt
+++ b/app/src/main/java/com/github/libretube/ui/fragments/PlaylistFragment.kt
@@ -11,11 +11,10 @@ import androidx.core.text.parseAsHtml
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
-import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
+import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.ItemTouchHelper
-import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.github.libretube.R
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.enums.PlaylistType
import com.github.libretube.extensions.TAG
+import com.github.libretube.extensions.ceilHalf
import com.github.libretube.extensions.dpToPx
import com.github.libretube.extensions.serializable
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.adapters.PlaylistAdapter
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.sheets.BaseBottomSheet
import com.github.libretube.ui.sheets.PlaylistOptionsBottomSheet
@@ -47,7 +48,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
-class PlaylistFragment : Fragment() {
+class PlaylistFragment : DynamicLayoutManagerFragment() {
private var _binding: FragmentPlaylistBinding? = null
private val binding get() = _binding!!
@@ -89,10 +90,13 @@ class PlaylistFragment : Fragment() {
return binding.root
}
+ override fun setLayoutManagers(gridItems: Int) {
+ _binding?.playlistRecView?.layoutManager = GridLayoutManager(context, gridItems.ceilHalf())
+ }
+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- binding.playlistRecView.layoutManager = LinearLayoutManager(context)
binding.playlistProgress.isVisible = true
isBookmarked = runBlocking(Dispatchers.IO) {
diff --git a/app/src/main/java/com/github/libretube/ui/fragments/SearchResultFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/SearchResultFragment.kt
index 9c748cfa0..45aaa33f5 100644
--- a/app/src/main/java/com/github/libretube/ui/fragments/SearchResultFragment.kt
+++ b/app/src/main/java/com/github/libretube/ui/fragments/SearchResultFragment.kt
@@ -7,9 +7,8 @@ import android.view.View
import android.view.ViewGroup
import androidx.core.view.isGone
import androidx.core.view.isVisible
-import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
-import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.GridLayoutManager
import com.github.libretube.R
import com.github.libretube.api.RetrofitInstance
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.obj.SearchHistoryItem
import com.github.libretube.extensions.TAG
+import com.github.libretube.extensions.ceilHalf
import com.github.libretube.extensions.hideKeyboard
import com.github.libretube.extensions.toastFromMainDispatcher
import com.github.libretube.helpers.PreferenceHelper
import com.github.libretube.ui.activities.MainActivity
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.util.TextUtils
import com.github.libretube.util.TextUtils.toTimeInSeconds
@@ -31,8 +32,9 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
+import kotlin.math.ceil
-class SearchResultFragment : Fragment() {
+class SearchResultFragment : DynamicLayoutManagerFragment() {
private var _binding: FragmentSearchResultBinding? = null
private val binding get() = _binding!!
@@ -56,6 +58,10 @@ class SearchResultFragment : Fragment() {
return binding.root
}
+ override fun setLayoutManagers(gridItems: Int) {
+ _binding?.searchRecycler?.layoutManager = GridLayoutManager(context, gridItems.ceilHalf())
+ }
+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
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
(context as MainActivity).setQuerySilent(query)
- binding.searchRecycler.layoutManager = LinearLayoutManager(requireContext())
-
// add the query to the history
addToHistory(query)
diff --git a/app/src/main/java/com/github/libretube/ui/fragments/SearchFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/SearchSuggestionsFragment.kt
similarity index 93%
rename from app/src/main/java/com/github/libretube/ui/fragments/SearchFragment.kt
rename to app/src/main/java/com/github/libretube/ui/fragments/SearchSuggestionsFragment.kt
index 4a760ca9c..8053fb05d 100644
--- a/app/src/main/java/com/github/libretube/ui/fragments/SearchFragment.kt
+++ b/app/src/main/java/com/github/libretube/ui/fragments/SearchSuggestionsFragment.kt
@@ -14,7 +14,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import com.github.libretube.api.RetrofitInstance
import com.github.libretube.constants.IntentData
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.extensions.TAG
import com.github.libretube.helpers.PreferenceHelper
@@ -26,8 +26,8 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
-class SearchFragment : Fragment() {
- private var _binding: FragmentSearchBinding? = null
+class SearchSuggestionsFragment : Fragment() {
+ private var _binding: FragmentSearchSuggestionsBinding? = null
private val binding get() = _binding!!
private val viewModel: SearchViewModel by activityViewModels()
@@ -41,7 +41,7 @@ class SearchFragment : Fragment() {
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
- _binding = FragmentSearchBinding.inflate(inflater)
+ _binding = FragmentSearchSuggestionsBinding.inflate(inflater)
return binding.root
}
diff --git a/app/src/main/java/com/github/libretube/ui/fragments/SubscriptionsFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/SubscriptionsFragment.kt
index cc99835d9..3b51e92ce 100644
--- a/app/src/main/java/com/github/libretube/ui/fragments/SubscriptionsFragment.kt
+++ b/app/src/main/java/com/github/libretube/ui/fragments/SubscriptionsFragment.kt
@@ -10,7 +10,6 @@ import androidx.core.view.children
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
-import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
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.SubscriptionChannelAdapter
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.PlayerViewModel
import com.github.libretube.ui.models.SubscriptionsViewModel
@@ -40,7 +40,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
-class SubscriptionsFragment : Fragment() {
+class SubscriptionsFragment : DynamicLayoutManagerFragment() {
private var _binding: FragmentSubscriptionsBinding? = null
private val binding get() = _binding!!
@@ -72,6 +72,10 @@ class SubscriptionsFragment : Fragment() {
return binding.root
}
+ override fun setLayoutManagers(gridItems: Int) {
+ _binding?.subFeed?.layoutManager = VideosAdapter.getLayout(requireContext(), gridItems)
+ }
+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -87,8 +91,6 @@ class SubscriptionsFragment : Fragment() {
binding.subRefresh.isEnabled = true
binding.subProgress.isVisible = true
- binding.subFeed.layoutManager = VideosAdapter.getLayout(requireContext())
-
if (!isCurrentTabSubChannels && (viewModel.videoFeed.value == null || !loadFeedInBackground)) {
viewModel.videoFeed.value = null
viewModel.fetchFeed(requireContext())
diff --git a/app/src/main/java/com/github/libretube/ui/fragments/TrendsFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/TrendsFragment.kt
index 88300fb2c..1651e63b2 100644
--- a/app/src/main/java/com/github/libretube/ui/fragments/TrendsFragment.kt
+++ b/app/src/main/java/com/github/libretube/ui/fragments/TrendsFragment.kt
@@ -8,7 +8,6 @@ import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.core.view.isGone
-import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import com.github.libretube.R
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.ui.activities.SettingsActivity
import com.github.libretube.ui.adapters.VideosAdapter
+import com.github.libretube.ui.base.DynamicLayoutManagerFragment
import com.github.libretube.util.deArrow
import com.google.android.material.snackbar.Snackbar
import java.io.IOException
@@ -25,7 +25,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import retrofit2.HttpException
-class TrendsFragment : Fragment() {
+class TrendsFragment : DynamicLayoutManagerFragment() {
private var _binding: FragmentTrendsBinding? = null
private val binding get() = _binding!!
@@ -38,6 +38,10 @@ class TrendsFragment : Fragment() {
return binding.root
}
+ override fun setLayoutManagers(gridItems: Int) {
+ _binding?.recview?.layoutManager = VideosAdapter.getLayout(requireContext(), gridItems)
+ }
+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -87,7 +91,6 @@ class TrendsFragment : Fragment() {
}
binding.recview.adapter = VideosAdapter(response.toMutableList())
- binding.recview.layoutManager = VideosAdapter.getLayout(requireContext())
}
}
}
diff --git a/app/src/main/java/com/github/libretube/ui/fragments/WatchHistoryFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/WatchHistoryFragment.kt
index cba3fd72e..e200fe4db 100644
--- a/app/src/main/java/com/github/libretube/ui/fragments/WatchHistoryFragment.kt
+++ b/app/src/main/java/com/github/libretube/ui/fragments/WatchHistoryFragment.kt
@@ -10,11 +10,10 @@ import androidx.core.os.postDelayed
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
-import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
+import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.ItemTouchHelper
-import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.github.libretube.R
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.DatabaseHolder.Database
import com.github.libretube.db.obj.WatchHistoryItem
+import com.github.libretube.extensions.ceilHalf
import com.github.libretube.extensions.dpToPx
import com.github.libretube.helpers.NavigationHelper
import com.github.libretube.helpers.PreferenceHelper
import com.github.libretube.helpers.ProxyHelper
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.sheets.BaseBottomSheet
import com.github.libretube.util.PlayingQueue
@@ -36,7 +37,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
-class WatchHistoryFragment : Fragment() {
+class WatchHistoryFragment : DynamicLayoutManagerFragment() {
private var _binding: FragmentWatchHistoryBinding? = null
private val binding get() = _binding!!
@@ -70,6 +71,10 @@ class WatchHistoryFragment : Fragment() {
return binding.root
}
+ override fun setLayoutManagers(gridItems: Int) {
+ _binding?.watchHistoryRecView?.layoutManager = GridLayoutManager(context, gridItems.ceilHalf())
+ }
+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -163,7 +168,6 @@ class WatchHistoryFragment : Fragment() {
)
}
- binding.watchHistoryRecView.layoutManager = LinearLayoutManager(context)
binding.watchHistoryRecView.adapter = watchHistoryAdapter
binding.historyEmpty.isGone = true
binding.historyScrollView.isVisible = true
diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search_suggestions.xml
similarity index 94%
rename from app/src/main/res/layout/fragment_search.xml
rename to app/src/main/res/layout/fragment_search_suggestions.xml
index 60471f613..2110aa7f0 100644
--- a/app/src/main/res/layout/fragment_search.xml
+++ b/app/src/main/res/layout/fragment_search_suggestions.xml
@@ -3,7 +3,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
- tools:context=".ui.fragments.SearchFragment">
+ tools:context=".ui.fragments.SearchSuggestionsFragment">
+ tools:layout="@layout/fragment_search_suggestions" />
2
+ 4
\ No newline at end of file
diff --git a/app/src/main/res/values-xlarge/integers.xml b/app/src/main/res/values-xlarge/integers.xml
index 15fe03fa4..fe5baa395 100644
--- a/app/src/main/res/values-xlarge/integers.xml
+++ b/app/src/main/res/values-xlarge/integers.xml
@@ -1,4 +1,5 @@
- 4
+ 3
+ 6
\ No newline at end of file
diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml
index 999aec435..aa7ba3ac4 100644
--- a/app/src/main/res/values/array.xml
+++ b/app/src/main/res/values/array.xml
@@ -205,6 +205,7 @@
- 3
- 4
- 5
+ - 6
diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml
index 194e40225..f3bf88c9d 100644
--- a/app/src/main/res/values/integers.xml
+++ b/app/src/main/res/values/integers.xml
@@ -1,4 +1,5 @@
1
+ 2
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 3b9cf3457..b7fd1fd5a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -39,7 +39,8 @@
You have to enter a username and password.
This is for a Piped account.
Video resolution
- Grid columns
+ Grid columns (portrait)
+ Grid columns (landscape)
Nothing here.
Delete playlist
Delete the playlist?
diff --git a/app/src/main/res/xml/appearance_settings.xml b/app/src/main/res/xml/appearance_settings.xml
index 69e0ed9e3..9edc93256 100644
--- a/app/src/main/res/xml/appearance_settings.xml
+++ b/app/src/main/res/xml/appearance_settings.xml
@@ -94,6 +94,15 @@
app:title="@string/grid"
app:useSimpleSummaryProvider="true" />
+
+
\ No newline at end of file