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 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"

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.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)
}
}

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.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()
}

View File

@ -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

View File

@ -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)

View File

@ -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) {

View File

@ -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)

View File

@ -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
}

View File

@ -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())

View File

@ -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())
}
}
}

View File

@ -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

View File

@ -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">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/suggestions_recycler"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -39,7 +39,8 @@
<string name="empty">You have to enter a username and password.</string>
<string name="notgmail">This is for a Piped account.</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="deletePlaylist">Delete playlist</string>
<string name="areYouSure">Delete the playlist?</string>

View File

@ -94,6 +94,15 @@
app:title="@string/grid"
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>
</PreferenceScreen>