refactor: rework view bindings (#6975)

This commit is contained in:
Thomas W. 2025-01-17 18:53:38 +01:00 committed by GitHub
parent 2b22bdcdbc
commit 6d8598e9fc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
32 changed files with 81 additions and 388 deletions

View File

@ -3,12 +3,13 @@ package com.github.libretube.ui.base
import android.content.res.Configuration
import android.os.Bundle
import android.view.View
import androidx.annotation.LayoutRes
import androidx.fragment.app.Fragment
import com.github.libretube.R
import com.github.libretube.constants.PreferenceKeys
import com.github.libretube.helpers.PreferenceHelper
abstract class DynamicLayoutManagerFragment : Fragment() {
abstract class DynamicLayoutManagerFragment(@LayoutRes layoutResId: Int) : Fragment(layoutResId) {
abstract fun setLayoutManagers(gridItems: Int)
private fun getGridItemsCount(orientation: Int): Int {

View File

@ -7,9 +7,7 @@ import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.text.format.DateUtils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.BackEventCompat
import androidx.activity.OnBackPressedCallback
import androidx.constraintlayout.motion.widget.MotionLayout
@ -65,7 +63,7 @@ import kotlinx.coroutines.launch
import kotlin.math.abs
@UnstableApi
class AudioPlayerFragment : Fragment(), AudioPlayerOptions {
class AudioPlayerFragment : Fragment(R.layout.fragment_audio_player), AudioPlayerOptions {
private var _binding: FragmentAudioPlayerBinding? = null
val binding get() = _binding!!
@ -109,17 +107,9 @@ class AudioPlayerFragment : Fragment(), AudioPlayerOptions {
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentAudioPlayerBinding.inflate(inflater)
return binding.root
}
@SuppressLint("ClickableViewAccessibility")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = FragmentAudioPlayerBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
mainActivity?.getBottomNavColor()?.let { color ->

View File

@ -4,14 +4,13 @@ import android.content.res.Configuration
import android.os.Bundle
import android.os.Parcelable
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isGone
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.github.libretube.R
import com.github.libretube.api.RetrofitInstance
import com.github.libretube.api.obj.ChannelTab
import com.github.libretube.api.obj.StreamItem
@ -29,7 +28,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class ChannelContentFragment : DynamicLayoutManagerFragment() {
class ChannelContentFragment : DynamicLayoutManagerFragment(R.layout.fragment_channel_content) {
private var _binding: FragmentChannelContentBinding? = null
private val binding get() = _binding!!
private var channelId: String? = null
@ -39,15 +38,6 @@ class ChannelContentFragment : DynamicLayoutManagerFragment() {
private var nextPage: String? = null
private var isLoading: Boolean = false
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentChannelContentBinding.inflate(inflater, container, false)
return _binding!!.root
}
override fun setLayoutManagers(gridItems: Int) {
binding.channelRecView.layoutManager = GridLayoutManager(
requireContext(),
@ -125,6 +115,7 @@ class ChannelContentFragment : DynamicLayoutManagerFragment() {
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = FragmentChannelContentBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
val arguments = requireArguments()

View File

@ -2,9 +2,7 @@ package com.github.libretube.ui.fragments
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.os.bundleOf
import androidx.core.view.isGone
import androidx.core.view.isVisible
@ -42,7 +40,7 @@ import kotlinx.coroutines.withContext
import retrofit2.HttpException
import java.io.IOException
class ChannelFragment : DynamicLayoutManagerFragment() {
class ChannelFragment : DynamicLayoutManagerFragment(R.layout.fragment_channel) {
private var _binding: FragmentChannelBinding? = null
private val binding get() = _binding!!
private val args by navArgs<ChannelFragmentArgs>()
@ -74,18 +72,10 @@ class ChannelFragment : DynamicLayoutManagerFragment() {
channelId = args.channelId
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentChannelBinding.inflate(inflater, container, false)
return binding.root
}
override fun setLayoutManagers(gridItems: Int) {}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = FragmentChannelBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
// Check if the AppBarLayout is fully expanded
binding.channelAppBar.addOnOffsetChangedListener { _, verticalOffset ->

View File

@ -1,9 +1,7 @@
package com.github.libretube.ui.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.os.bundleOf
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
@ -26,24 +24,15 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class CommentsMainFragment : Fragment() {
class CommentsMainFragment : Fragment(R.layout.fragment_comments) {
private var _binding: FragmentCommentsBinding? = null
private val binding get() = _binding!!
private val viewModel: CommentsViewModel by activityViewModels()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentCommentsBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = FragmentCommentsBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
val binding = binding
val layoutManager = LinearLayoutManager(requireContext())
binding.commentsRV.layoutManager = layoutManager
binding.commentsRV.setItemViewCacheSize(20)

View File

@ -1,9 +1,7 @@
package com.github.libretube.ui.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.os.bundleOf
import androidx.core.view.isGone
import androidx.core.view.isVisible
@ -31,29 +29,19 @@ import com.github.libretube.ui.models.sources.CommentRepliesPagingSource
import com.github.libretube.ui.sheets.CommentsSheet
import kotlinx.coroutines.launch
class CommentsRepliesFragment : Fragment() {
class CommentsRepliesFragment : Fragment(R.layout.fragment_comments) {
private var _binding: FragmentCommentsBinding? = null
private val binding get() = _binding!!
private val viewModel: CommentsViewModel by activityViewModels()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentCommentsBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = FragmentCommentsBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
val arguments = requireArguments()
val videoId = arguments.getString(IntentData.videoId, "")
val comment = arguments.parcelable<Comment>(IntentData.comment)!!
val binding = binding
val commentsSheet = parentFragment as? CommentsSheet
commentsSheet?.binding?.btnScrollToTop?.isGone = true

View File

@ -7,9 +7,7 @@ import android.content.IntentFilter
import android.content.ServiceConnection
import android.os.Bundle
import android.os.IBinder
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.core.os.bundleOf
import androidx.core.view.isGone
@ -59,20 +57,12 @@ enum class DownloadTab {
AUDIO
}
class DownloadsFragment : Fragment() {
class DownloadsFragment : Fragment(R.layout.fragment_downloads) {
private var _binding: FragmentDownloadsBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentDownloadsBinding.inflate(inflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = FragmentDownloadsBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
binding.downloadsPager.adapter = DownloadsFragmentAdapter(this)
@ -112,7 +102,7 @@ class DownloadsFragmentAdapter(fragment: Fragment) : FragmentStateAdapter(fragme
}
}
class DownloadsFragmentPage : DynamicLayoutManagerFragment() {
class DownloadsFragmentPage : DynamicLayoutManagerFragment(R.layout.fragment_download_content) {
private lateinit var adapter: DownloadsAdapter
private var _binding: FragmentDownloadContentBinding? = null
private val binding get() = _binding!!
@ -149,20 +139,12 @@ class DownloadsFragmentPage : DynamicLayoutManagerFragment() {
this.downloadTab = requireArguments().serializable(IntentData.currentPosition)!!
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentDownloadContentBinding.inflate(layoutInflater)
return binding.root
}
override fun setLayoutManagers(gridItems: Int) {
_binding?.downloadsRecView?.layoutManager = GridLayoutManager(context, gridItems.ceilHalf())
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = FragmentDownloadContentBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
var selectedSortType =

View File

@ -2,9 +2,7 @@ package com.github.libretube.ui.fragments
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
@ -35,23 +33,15 @@ import com.github.libretube.ui.models.HomeViewModel
import com.github.libretube.ui.models.SubscriptionsViewModel
import com.google.android.material.snackbar.Snackbar
class HomeFragment : Fragment() {
class HomeFragment : Fragment(R.layout.fragment_home) {
private var _binding: FragmentHomeBinding? = null
private val binding get() = _binding!!
private val subscriptionsViewModel: SubscriptionsViewModel by activityViewModels()
private val homeViewModel: HomeViewModel by activityViewModels()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentHomeBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = FragmentHomeBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
with(homeViewModel) {

View File

@ -2,9 +2,7 @@ package com.github.libretube.ui.fragments
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.ViewGroup.MarginLayoutParams
import android.widget.Toast
import androidx.core.view.isGone
@ -41,27 +39,19 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class LibraryFragment : DynamicLayoutManagerFragment() {
class LibraryFragment : DynamicLayoutManagerFragment(R.layout.fragment_library) {
private var _binding: FragmentLibraryBinding? = null
private val binding get() = _binding!!
private val commonPlayerViewModel: CommonPlayerViewModel by activityViewModels()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentLibraryBinding.inflate(inflater, container, false)
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?) {
_binding = FragmentLibraryBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
// listen for the mini player state changing

View File

@ -17,7 +17,6 @@ import android.os.Handler
import android.os.Looper
import android.os.PowerManager
import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.PixelCopy
import android.view.SurfaceView
import android.view.View
@ -121,7 +120,7 @@ import kotlin.math.ceil
@androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class)
class PlayerFragment : Fragment(), OnlinePlayerOptions {
class PlayerFragment : Fragment(R.layout.fragment_player), OnlinePlayerOptions {
private var _binding: FragmentPlayerBinding? = null
val binding get() = _binding!!
@ -385,16 +384,8 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
noFullscreenResolution = PlayerHelper.getDefaultResolution(requireContext(), false)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentPlayerBinding.inflate(inflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = FragmentPlayerBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
SoftwareKeyboardControllerCompat(view).hide()

View File

@ -6,9 +6,7 @@ import android.os.Bundle
import android.os.Parcelable
import android.text.format.DateUtils
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.os.bundleOf
import androidx.core.text.parseAsHtml
import androidx.core.view.isGone
@ -51,7 +49,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
class PlaylistFragment : DynamicLayoutManagerFragment() {
class PlaylistFragment : DynamicLayoutManagerFragment(R.layout.fragment_playlist) {
private var _binding: FragmentPlaylistBinding? = null
private val binding get() = _binding!!
private val args by navArgs<PlaylistFragmentArgs>()
@ -84,20 +82,12 @@ class PlaylistFragment : DynamicLayoutManagerFragment() {
playlistType = args.playlistType
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentPlaylistBinding.inflate(inflater, container, false)
return binding.root
}
override fun setLayoutManagers(gridItems: Int) {
_binding?.playlistRecView?.layoutManager = GridLayoutManager(context, gridItems.ceilHalf())
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = FragmentPlaylistBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
binding.playlistProgress.isVisible = true

View File

@ -3,9 +3,7 @@ package com.github.libretube.ui.fragments
import android.content.res.Configuration
import android.os.Bundle
import android.os.Parcelable
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
@ -35,7 +33,7 @@ import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
class SearchResultFragment : DynamicLayoutManagerFragment() {
class SearchResultFragment : DynamicLayoutManagerFragment(R.layout.fragment_search_result) {
private var _binding: FragmentSearchResultBinding? = null
private val binding get() = _binding!!
private val args by navArgs<SearchResultFragmentArgs>()
@ -43,20 +41,12 @@ class SearchResultFragment : DynamicLayoutManagerFragment() {
private var recyclerViewState: Parcelable? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentSearchResultBinding.inflate(inflater)
return binding.root
}
override fun setLayoutManagers(gridItems: Int) {
_binding?.searchRecycler?.layoutManager = GridLayoutManager(context, gridItems.ceilHalf())
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = FragmentSearchResultBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
// fixes a bug that the search query will stay the old one when searching for multiple

View File

@ -2,9 +2,7 @@ package com.github.libretube.ui.fragments
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
@ -12,6 +10,7 @@ import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import com.github.libretube.R
import com.github.libretube.api.RetrofitInstance
import com.github.libretube.constants.IntentData
import com.github.libretube.constants.PreferenceKeys
@ -29,7 +28,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class SearchSuggestionsFragment : Fragment() {
class SearchSuggestionsFragment : Fragment(R.layout.fragment_search_suggestions) {
private var _binding: FragmentSearchSuggestionsBinding? = null
private val binding get() = _binding!!
private val viewModel: SearchViewModel by activityViewModels()
@ -40,16 +39,8 @@ class SearchSuggestionsFragment : Fragment() {
viewModel.searchQuery.value = arguments?.getString(IntentData.query)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentSearchSuggestionsBinding.inflate(inflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = FragmentSearchSuggestionsBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
binding.suggestionsRecycler.layoutManager = LinearLayoutManager(requireContext()).apply {

View File

@ -4,9 +4,7 @@ import android.annotation.SuppressLint
import android.content.res.Configuration
import android.os.Bundle
import android.os.Parcelable
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.ViewGroup.MarginLayoutParams
import androidx.core.os.bundleOf
import androidx.core.view.children
@ -52,7 +50,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class SubscriptionsFragment : DynamicLayoutManagerFragment() {
class SubscriptionsFragment : DynamicLayoutManagerFragment(R.layout.fragment_subscriptions) {
private var _binding: FragmentSubscriptionsBinding? = null
private val binding get() = _binding!!
@ -86,20 +84,12 @@ class SubscriptionsFragment : DynamicLayoutManagerFragment() {
private var subChannelsRecyclerViewState: Parcelable? = null
private var subFeedRecyclerViewState: Parcelable? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentSubscriptionsBinding.inflate(inflater, container, false)
return binding.root
}
override fun setLayoutManagers(gridItems: Int) {
_binding?.subFeed?.layoutManager = VideosAdapter.getLayout(requireContext(), gridItems)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = FragmentSubscriptionsBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
setupSortAndFilter()

View File

@ -3,9 +3,7 @@ package com.github.libretube.ui.fragments
import android.content.Intent
import android.content.res.Configuration
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isGone
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.RecyclerView
@ -19,25 +17,17 @@ import com.github.libretube.ui.extensions.setupFragmentAnimation
import com.github.libretube.ui.models.TrendsViewModel
import com.google.android.material.snackbar.Snackbar
class TrendsFragment : DynamicLayoutManagerFragment() {
class TrendsFragment : DynamicLayoutManagerFragment(R.layout.fragment_trends) {
private var _binding: FragmentTrendsBinding? = null
private val binding get() = _binding!!
private val viewModel: TrendsViewModel by activityViewModels()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentTrendsBinding.inflate(inflater, container, false)
return binding.root
}
override fun setLayoutManagers(gridItems: Int) {
_binding?.recview?.layoutManager = VideosAdapter.getLayout(requireContext(), gridItems)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = FragmentTrendsBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
viewModel.trendingVideos.observe(viewLifecycleOwner) { videos ->

View File

@ -5,9 +5,7 @@ import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.os.Parcelable
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.os.postDelayed
import androidx.core.view.isGone
import androidx.core.view.isVisible
@ -43,7 +41,7 @@ import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import kotlin.math.ceil
class WatchHistoryFragment : DynamicLayoutManagerFragment() {
class WatchHistoryFragment : DynamicLayoutManagerFragment(R.layout.fragment_watch_history) {
private var _binding: FragmentWatchHistoryBinding? = null
private val binding get() = _binding!!
@ -69,21 +67,13 @@ class WatchHistoryFragment : DynamicLayoutManagerFragment() {
field = value
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentWatchHistoryBinding.inflate(inflater, container, false)
return binding.root
}
override fun setLayoutManagers(gridItems: Int) {
_binding?.watchHistoryRecView?.layoutManager =
GridLayoutManager(context, gridItems.ceilHalf())
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = FragmentWatchHistoryBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
commonPlayerViewModel.isMiniPlayerVisible.observe(viewLifecycleOwner) {

View File

@ -1,11 +1,10 @@
package com.github.libretube.ui.sheets
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.github.libretube.R
import com.github.libretube.constants.IntentData
import com.github.libretube.databinding.DialogAddChannelToGroupBinding
import com.github.libretube.db.DatabaseHolder
@ -14,7 +13,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class AddChannelToGroupSheet : ExpandedBottomSheet() {
class AddChannelToGroupSheet : ExpandedBottomSheet(R.layout.dialog_add_channel_to_group) {
private lateinit var channelId: String
override fun onCreate(savedInstanceState: Bundle?) {
@ -23,12 +22,9 @@ class AddChannelToGroupSheet : ExpandedBottomSheet() {
channelId = arguments?.getString(IntentData.channelId)!!
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val binding = DialogAddChannelToGroupBinding.inflate(layoutInflater)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val binding = DialogAddChannelToGroupBinding.bind(view)
binding.groupsRV.layoutManager = LinearLayoutManager(context)
binding.cancel.setOnClickListener {
@ -55,7 +51,5 @@ class AddChannelToGroupSheet : ExpandedBottomSheet() {
}
}
}
return binding.root
}
}

View File

@ -2,40 +2,29 @@ package com.github.libretube.ui.sheets
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.ViewGroup.MarginLayoutParams
import androidx.annotation.LayoutRes
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.github.libretube.R
import com.github.libretube.databinding.BottomSheetBinding
import com.github.libretube.extensions.dpToPx
import com.github.libretube.obj.BottomSheetItem
import com.github.libretube.ui.adapters.BottomSheetAdapter
import kotlinx.coroutines.launch
open class BaseBottomSheet : ExpandedBottomSheet() {
private var _binding: BottomSheetBinding? = null
private val binding get() = _binding!!
open class BaseBottomSheet(@LayoutRes layoutResId: Int = R.layout.bottom_sheet) : ExpandedBottomSheet(layoutResId) {
private var title: String? = null
private var preselectedItem: String? = null
private lateinit var items: List<BottomSheetItem>
private lateinit var listener: (index: Int) -> Unit
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = BottomSheetBinding.inflate(layoutInflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val binding = binding
val binding = BottomSheetBinding.bind(view)
if (title != null) {
binding.bottomSheetTitleLayout.isVisible = true
@ -59,11 +48,6 @@ open class BaseBottomSheet : ExpandedBottomSheet() {
binding.optionsRecycler.adapter = BottomSheetAdapter(items, listener)
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
fun setItems(items: List<BottomSheetItem>, listener: (suspend (index: Int) -> Unit)?) = apply {
this.items = items
this.listener = { index ->

View File

@ -2,12 +2,11 @@ package com.github.libretube.ui.sheets
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.github.libretube.R
import com.github.libretube.databinding.DialogSubscriptionGroupsBinding
import com.github.libretube.db.DatabaseHolder
import com.github.libretube.db.obj.SubscriptionGroup
@ -19,17 +18,14 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class ChannelGroupsSheet : ExpandedBottomSheet() {
class ChannelGroupsSheet : ExpandedBottomSheet(R.layout.dialog_subscription_groups) {
private val channelGroupsModel: EditChannelGroupsModel by activityViewModels()
@SuppressLint("NotifyDataSetChanged")
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val binding = DialogSubscriptionGroupsBinding.inflate(layoutInflater)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val binding = DialogSubscriptionGroupsBinding.inflate(layoutInflater)
binding.groupsRV.layoutManager = LinearLayoutManager(context)
val groups = channelGroupsModel.groups.value.orEmpty().toMutableList()
val adapter = SubscriptionGroupsAdapter(groups, channelGroupsModel, parentFragmentManager)
@ -59,7 +55,5 @@ class ChannelGroupsSheet : ExpandedBottomSheet() {
adapter.groups.move(from, to)
adapter.notifyItemMoved(from, to)
}
return binding.root
}
}

View File

@ -2,9 +2,7 @@ package com.github.libretube.ui.sheets
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
import androidx.core.os.bundleOf
import androidx.core.view.isVisible
@ -17,7 +15,7 @@ import com.github.libretube.databinding.BottomSheetBinding
import com.github.libretube.ui.adapters.ChaptersAdapter
import com.github.libretube.ui.models.ChaptersViewModel
class ChaptersBottomSheet : ExpandablePlayerSheet() {
class ChaptersBottomSheet : ExpandablePlayerSheet(R.layout.bottom_sheet) {
private var _binding: BottomSheetBinding? = null
private val binding get() = _binding!!
@ -29,17 +27,9 @@ class ChaptersBottomSheet : ExpandablePlayerSheet() {
duration = requireArguments().getLong(IntentData.duration, 0L)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = BottomSheetBinding.inflate(layoutInflater)
return binding.root
}
@SuppressLint("NotifyDataSetChanged")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = BottomSheetBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
binding.optionsRecycler.layoutManager = LinearLayoutManager(context)

View File

@ -1,9 +1,7 @@
package com.github.libretube.ui.sheets
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.ComponentDialog
import androidx.activity.addCallback
import androidx.core.view.isVisible
@ -16,7 +14,7 @@ import com.github.libretube.databinding.CommentsSheetBinding
import com.github.libretube.ui.fragments.CommentsMainFragment
import com.github.libretube.ui.models.CommonPlayerViewModel
class CommentsSheet : ExpandablePlayerSheet() {
class CommentsSheet : ExpandablePlayerSheet(R.layout.comments_sheet) {
private var _binding: CommentsSheetBinding? = null
val binding get() = _binding!!
@ -30,20 +28,10 @@ class CommentsSheet : ExpandablePlayerSheet() {
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = CommentsSheetBinding.inflate(layoutInflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = CommentsSheetBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
val binding = binding
childFragmentManager.setFragmentResultListener(DISMISS_SHEET_REQUEST_KEY, viewLifecycleOwner) { _, _ ->
dismiss()
}

View File

@ -1,9 +1,7 @@
package com.github.libretube.ui.sheets
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.core.widget.addTextChangedListener
import androidx.fragment.app.activityViewModels
@ -24,7 +22,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
class EditChannelGroupSheet : ExpandedBottomSheet() {
class EditChannelGroupSheet : ExpandedBottomSheet(R.layout.dialog_edit_channel_group) {
private var _binding: DialogEditChannelGroupBinding? = null
private val binding get() = _binding!!
@ -32,18 +30,8 @@ class EditChannelGroupSheet : ExpandedBottomSheet() {
private val channelGroupsModel: EditChannelGroupsModel by activityViewModels()
private var channels = listOf<Subscription>()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = DialogEditChannelGroupBinding.inflate(layoutInflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val binding = binding
_binding = DialogEditChannelGroupBinding.bind(view)
binding.groupName.setText(channelGroupsModel.groupToEdit?.name)
val oldGroupName = channelGroupsModel.groupToEdit?.name.orEmpty()
@ -109,7 +97,6 @@ class EditChannelGroupSheet : ExpandedBottomSheet() {
}
private fun showChannels(channels: List<Subscription>, query: String?) {
val binding = binding
binding.channelsRV.adapter = SubscriptionGroupChannelsAdapter(
channels.filter { query == null || it.name.lowercase().contains(query.lowercase()) },
channelGroupsModel.groupToEdit!!

View File

@ -2,10 +2,12 @@ package com.github.libretube.ui.sheets
import android.os.Bundle
import android.view.View
import androidx.annotation.LayoutRes
import androidx.fragment.app.activityViewModels
import com.github.libretube.ui.models.CommonPlayerViewModel
abstract class ExpandablePlayerSheet: UndimmedBottomSheet() {
abstract class ExpandablePlayerSheet(@LayoutRes layoutResId: Int) :
UndimmedBottomSheet(layoutResId) {
private val commonPlayerViewModel: CommonPlayerViewModel by activityViewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

View File

@ -4,6 +4,7 @@ import android.app.Dialog
import android.content.res.Configuration
import android.os.Bundle
import android.widget.FrameLayout
import androidx.annotation.LayoutRes
import androidx.fragment.app.FragmentManager
import com.google.android.material.R
import com.google.android.material.bottomsheet.BottomSheetBehavior
@ -11,7 +12,8 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior.PEEK_HEIGHT_A
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
open class ExpandedBottomSheet : BottomSheetDialogFragment() {
open class ExpandedBottomSheet(@LayoutRes layoutResId: Int) :
BottomSheetDialogFragment(layoutResId) {
private val bottomSheet: FrameLayout? get() = dialog?.findViewById(R.id.design_bottom_sheet)
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog

View File

@ -1,19 +1,18 @@
package com.github.libretube.ui.sheets
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.RadioButton
import androidx.core.os.bundleOf
import androidx.fragment.app.setFragmentResult
import com.github.libretube.R
import com.github.libretube.constants.IntentData
import com.github.libretube.databinding.FilterSortSheetBinding
import com.github.libretube.enums.ContentFilter
import com.github.libretube.extensions.parcelableArrayList
import com.github.libretube.obj.SelectableOption
class FilterSortBottomSheet : ExpandedBottomSheet() {
class FilterSortBottomSheet : ExpandedBottomSheet(R.layout.filter_sort_sheet) {
private var _binding: FilterSortSheetBinding? = null
private val binding get() = _binding!!
@ -29,16 +28,8 @@ class FilterSortBottomSheet : ExpandedBottomSheet() {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FilterSortSheetBinding.inflate(layoutInflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = FilterSortSheetBinding.bind(view)
addSortOptions()
setInitialFiltersState()

View File

@ -1,34 +1,17 @@
package com.github.libretube.ui.sheets
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.GridLayoutManager
import com.github.libretube.R
import com.github.libretube.databinding.BottomSheetBinding
import com.github.libretube.ui.adapters.IconsSheetAdapter
class IconsBottomSheet : ExpandedBottomSheet() {
private var _binding: BottomSheetBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = BottomSheetBinding.inflate(layoutInflater)
return binding.root
}
class IconsBottomSheet : ExpandedBottomSheet(R.layout.bottom_sheet) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val binding = binding
val binding = BottomSheetBinding.bind(view)
binding.optionsRecycler.layoutManager = GridLayoutManager(context, 3)
binding.optionsRecycler.adapter = IconsSheetAdapter()
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}

View File

@ -1,9 +1,7 @@
package com.github.libretube.ui.sheets
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.GridLayoutManager
import com.github.libretube.constants.IntentData
import com.github.libretube.databinding.BottomSheetBinding
@ -11,8 +9,6 @@ import com.github.libretube.helpers.IntentHelper
import com.github.libretube.ui.adapters.IntentChooserAdapter
class IntentChooserSheet : BaseBottomSheet() {
private var _binding: BottomSheetBinding? = null
private val binding get() = _binding!!
private lateinit var url: String
override fun onCreate(savedInstanceState: Bundle?) {
@ -21,24 +17,10 @@ class IntentChooserSheet : BaseBottomSheet() {
url = arguments?.getString(IntentData.url)!!
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = BottomSheetBinding.inflate(inflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val binding = binding
val binding = BottomSheetBinding.bind(view)
val packages = IntentHelper.getResolveInfo(requireContext(), url)
binding.optionsRecycler.layoutManager = GridLayoutManager(context, 3)
binding.optionsRecycler.adapter = IntentChooserAdapter(packages, url)
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}

View File

@ -1,13 +1,12 @@
package com.github.libretube.ui.sheets
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.os.bundleOf
import androidx.media3.common.PlaybackParameters
import androidx.media3.session.MediaController
import androidx.recyclerview.widget.LinearLayoutManager
import com.github.libretube.R
import com.github.libretube.constants.PreferenceKeys
import com.github.libretube.databinding.PlaybackBottomSheetBinding
import com.github.libretube.enums.PlayerCommand
@ -18,22 +17,13 @@ import com.github.libretube.ui.adapters.SliderLabelsAdapter
class PlaybackOptionsSheet(
private val player: MediaController
) : ExpandedBottomSheet() {
) : ExpandedBottomSheet(R.layout.playback_bottom_sheet) {
private var _binding: PlaybackBottomSheetBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = PlaybackBottomSheetBinding.inflate(layoutInflater)
return binding.root
}
@androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val binding = binding
_binding = PlaybackBottomSheetBinding.bind(view)
binding.speedShortcuts.layoutManager =
LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)

View File

@ -2,9 +2,7 @@ package com.github.libretube.ui.sheets
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.os.bundleOf
import androidx.fragment.app.setFragmentResult
import androidx.media3.common.Player
@ -26,21 +24,13 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class PlayingQueueSheet : ExpandedBottomSheet() {
class PlayingQueueSheet : ExpandedBottomSheet(R.layout.queue_bottom_sheet) {
private var _binding: QueueBottomSheetBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = QueueBottomSheetBinding.inflate(layoutInflater)
return binding.root
}
@SuppressLint("NotifyDataSetChanged")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = QueueBottomSheetBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
binding.optionsRecycler.layoutManager = LinearLayoutManager(context)

View File

@ -4,9 +4,7 @@ import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.text.format.DateUtils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.core.os.postDelayed
import androidx.core.view.isGone
@ -15,21 +13,13 @@ import com.github.libretube.R
import com.github.libretube.databinding.SleepTimerSheetBinding
import com.github.libretube.ui.tools.SleepTimer
class SleepTimerSheet : ExpandedBottomSheet() {
class SleepTimerSheet : ExpandedBottomSheet(R.layout.sleep_timer_sheet) {
private var _binding: SleepTimerSheetBinding? = null
private val binding get() = _binding!!
private val handler = Handler(Looper.getMainLooper())
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = SleepTimerSheetBinding.inflate(layoutInflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_binding = SleepTimerSheetBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
updateTimeLeftText()

View File

@ -1,37 +1,24 @@
package com.github.libretube.ui.sheets
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.github.libretube.R
import com.github.libretube.constants.IntentData
import com.github.libretube.databinding.DialogStatsBinding
import com.github.libretube.extensions.parcelable
import com.github.libretube.helpers.ClipboardHelper
import com.github.libretube.obj.VideoStats
class StatsSheet : ExpandedBottomSheet() {
private var _binding: DialogStatsBinding? = null
private val binding get() = _binding!!
class StatsSheet : ExpandedBottomSheet(R.layout.dialog_stats) {
private lateinit var stats: VideoStats
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = DialogStatsBinding.inflate(layoutInflater)
return binding.root
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
stats = arguments?.parcelable(IntentData.videoStats)!!
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val binding = binding
val binding = DialogStatsBinding.bind(view)
binding.videoId.setText(stats.videoId)
binding.videoIdCopy.setEndIconOnClickListener {
ClipboardHelper.save(requireContext(), "text", stats.videoId)
@ -40,9 +27,4 @@ class StatsSheet : ExpandedBottomSheet() {
binding.audioInfo.setText(stats.audioInfo)
binding.videoQuality.setText(stats.videoQuality)
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}

View File

@ -8,12 +8,13 @@ import android.view.View
import android.view.ViewTreeObserver
import android.view.WindowManager
import android.widget.FrameLayout
import androidx.annotation.LayoutRes
import androidx.core.view.updateLayoutParams
/**
* A bottom sheet that allows touches on its top/background
*/
abstract class UndimmedBottomSheet : ExpandedBottomSheet() {
abstract class UndimmedBottomSheet(@LayoutRes layoutResId: Int) : ExpandedBottomSheet(layoutResId) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)