mirror of
https://github.com/libre-tube/LibreTube.git
synced 2025-04-27 23:40:33 +05:30
Option to mark videos as watched
This commit is contained in:
parent
a5bfdba21d
commit
61334db826
@ -36,7 +36,7 @@ class PlaylistAdapter(
|
|||||||
override fun getItemCount(): Int {
|
override fun getItemCount(): Int {
|
||||||
return when (playlistType) {
|
return when (playlistType) {
|
||||||
PlaylistType.PUBLIC -> videoFeed.size
|
PlaylistType.PUBLIC -> videoFeed.size
|
||||||
else -> visibleCount
|
else -> minOf(visibleCount, videoFeed.size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ class VideosAdapter(
|
|||||||
override fun getItemCount(): Int {
|
override fun getItemCount(): Int {
|
||||||
return when {
|
return when {
|
||||||
showAllAtOnce -> streamItems.size
|
showAllAtOnce -> streamItems.size
|
||||||
else -> visibleCount
|
else -> minOf(streamItems.size, visibleCount)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,6 +63,16 @@ class VideosAdapter(
|
|||||||
notifyItemRangeInserted(feedSize, newItems.size)
|
notifyItemRangeInserted(feedSize, newItems.size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun removeItemById(videoId: String) {
|
||||||
|
val index = streamItems.indexOfFirst {
|
||||||
|
it.url?.toID() == videoId
|
||||||
|
}.takeIf { it > 0 } ?: return
|
||||||
|
streamItems.removeAt(index)
|
||||||
|
visibleCount -= 1
|
||||||
|
notifyItemRemoved(index)
|
||||||
|
notifyItemRangeChanged(index, itemCount)
|
||||||
|
}
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VideosViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VideosViewHolder {
|
||||||
val layoutInflater = LayoutInflater.from(parent.context)
|
val layoutInflater = LayoutInflater.from(parent.context)
|
||||||
return when {
|
return when {
|
||||||
|
@ -25,7 +25,7 @@ class SubscriptionsFragment : BaseFragment() {
|
|||||||
private lateinit var binding: FragmentSubscriptionsBinding
|
private lateinit var binding: FragmentSubscriptionsBinding
|
||||||
private val viewModel: SubscriptionsViewModel by activityViewModels()
|
private val viewModel: SubscriptionsViewModel by activityViewModels()
|
||||||
|
|
||||||
private var subscriptionAdapter: VideosAdapter? = null
|
var subscriptionsAdapter: VideosAdapter? = null
|
||||||
private var selectedSortOrder = PreferenceHelper.getInt(PreferenceKeys.FEED_SORT_ORDER, 0)
|
private var selectedSortOrder = PreferenceHelper.getInt(PreferenceKeys.FEED_SORT_ORDER, 0)
|
||||||
set(value) {
|
set(value) {
|
||||||
PreferenceHelper.putInt(PreferenceKeys.FEED_SORT_ORDER, value)
|
PreferenceHelper.putInt(PreferenceKeys.FEED_SORT_ORDER, value)
|
||||||
@ -141,7 +141,7 @@ class SubscriptionsFragment : BaseFragment() {
|
|||||||
// scroll view is at bottom
|
// scroll view is at bottom
|
||||||
if (viewModel.videoFeed.value == null) return@addOnScrollChangedListener
|
if (viewModel.videoFeed.value == null) return@addOnScrollChangedListener
|
||||||
binding.subRefresh.isRefreshing = true
|
binding.subRefresh.isRefreshing = true
|
||||||
subscriptionAdapter?.updateItems()
|
subscriptionsAdapter?.updateItems()
|
||||||
binding.subRefresh.isRefreshing = false
|
binding.subRefresh.isRefreshing = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -189,12 +189,12 @@ class SubscriptionsFragment : BaseFragment() {
|
|||||||
if (viewModel.videoFeed.value!!.isEmpty()) View.VISIBLE else View.GONE
|
if (viewModel.videoFeed.value!!.isEmpty()) View.VISIBLE else View.GONE
|
||||||
|
|
||||||
binding.subProgress.visibility = View.GONE
|
binding.subProgress.visibility = View.GONE
|
||||||
subscriptionAdapter = VideosAdapter(
|
subscriptionsAdapter = VideosAdapter(
|
||||||
sortedFeed.toMutableList(),
|
sortedFeed.toMutableList(),
|
||||||
showAllAtOnce = false,
|
showAllAtOnce = false,
|
||||||
hideWatched = PreferenceHelper.getBoolean(PreferenceKeys.HIDE_WATCHED_FROM_FEED, false)
|
hideWatched = PreferenceHelper.getBoolean(PreferenceKeys.HIDE_WATCHED_FROM_FEED, false)
|
||||||
)
|
)
|
||||||
binding.subFeed.adapter = subscriptionAdapter
|
binding.subFeed.adapter = subscriptionsAdapter
|
||||||
|
|
||||||
PreferenceHelper.updateLastFeedWatchedTime()
|
PreferenceHelper.updateLastFeedWatchedTime()
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,25 @@
|
|||||||
package com.github.libretube.ui.sheets
|
package com.github.libretube.ui.sheets
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.util.Log
|
||||||
|
import androidx.navigation.fragment.NavHostFragment
|
||||||
import com.github.libretube.R
|
import com.github.libretube.R
|
||||||
import com.github.libretube.api.RetrofitInstance
|
import com.github.libretube.api.RetrofitInstance
|
||||||
|
import com.github.libretube.constants.PreferenceKeys
|
||||||
|
import com.github.libretube.db.DatabaseHolder
|
||||||
|
import com.github.libretube.db.obj.WatchPosition
|
||||||
import com.github.libretube.enums.ShareObjectType
|
import com.github.libretube.enums.ShareObjectType
|
||||||
|
import com.github.libretube.extensions.awaitQuery
|
||||||
import com.github.libretube.extensions.toStreamItem
|
import com.github.libretube.extensions.toStreamItem
|
||||||
import com.github.libretube.helpers.BackgroundHelper
|
import com.github.libretube.helpers.BackgroundHelper
|
||||||
|
import com.github.libretube.helpers.PlayerHelper
|
||||||
|
import com.github.libretube.helpers.PreferenceHelper
|
||||||
import com.github.libretube.obj.ShareData
|
import com.github.libretube.obj.ShareData
|
||||||
|
import com.github.libretube.ui.activities.MainActivity
|
||||||
import com.github.libretube.ui.dialogs.AddToPlaylistDialog
|
import com.github.libretube.ui.dialogs.AddToPlaylistDialog
|
||||||
import com.github.libretube.ui.dialogs.DownloadDialog
|
import com.github.libretube.ui.dialogs.DownloadDialog
|
||||||
import com.github.libretube.ui.dialogs.ShareDialog
|
import com.github.libretube.ui.dialogs.ShareDialog
|
||||||
|
import com.github.libretube.ui.fragments.SubscriptionsFragment
|
||||||
import com.github.libretube.util.PlayingQueue
|
import com.github.libretube.util.PlayingQueue
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@ -28,43 +38,46 @@ class VideoOptionsBottomSheet(
|
|||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
// List that stores the different menu options. In the future could be add more options here.
|
// List that stores the different menu options. In the future could be add more options here.
|
||||||
val optionsList = mutableListOf(
|
val optionsList = mutableListOf(
|
||||||
context?.getString(R.string.playOnBackground)!!,
|
getString(R.string.playOnBackground),
|
||||||
context?.getString(R.string.addToPlaylist)!!,
|
getString(R.string.addToPlaylist),
|
||||||
context?.getString(R.string.download)!!,
|
getString(R.string.download),
|
||||||
context?.getString(R.string.share)!!
|
getString(R.string.share)
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
// Check whether the player is running and add queue options
|
||||||
* Check whether the player is running and add queue options
|
|
||||||
*/
|
|
||||||
if (PlayingQueue.isNotEmpty()) {
|
if (PlayingQueue.isNotEmpty()) {
|
||||||
optionsList += context?.getString(R.string.play_next)!!
|
optionsList += getString(R.string.play_next)
|
||||||
optionsList += context?.getString(R.string.add_to_queue)!!
|
optionsList += getString(R.string.add_to_queue)
|
||||||
|
}
|
||||||
|
|
||||||
|
// show the mark as watched option if watch positions are enabled
|
||||||
|
if (PlayerHelper.watchPositionsEnabled) {
|
||||||
|
optionsList += getString(R.string.mark_as_watched)
|
||||||
}
|
}
|
||||||
|
|
||||||
setSimpleItems(optionsList) { which ->
|
setSimpleItems(optionsList) { which ->
|
||||||
when (optionsList[which]) {
|
when (optionsList[which]) {
|
||||||
// Start the background mode
|
// Start the background mode
|
||||||
context?.getString(R.string.playOnBackground) -> {
|
getString(R.string.playOnBackground) -> {
|
||||||
BackgroundHelper.playOnBackground(requireContext(), videoId)
|
BackgroundHelper.playOnBackground(requireContext(), videoId)
|
||||||
}
|
}
|
||||||
// Add Video to Playlist Dialog
|
// Add Video to Playlist Dialog
|
||||||
context?.getString(R.string.addToPlaylist) -> {
|
getString(R.string.addToPlaylist) -> {
|
||||||
AddToPlaylistDialog(videoId).show(
|
AddToPlaylistDialog(videoId).show(
|
||||||
parentFragmentManager,
|
parentFragmentManager,
|
||||||
AddToPlaylistDialog::class.java.name
|
AddToPlaylistDialog::class.java.name
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
context?.getString(R.string.download) -> {
|
getString(R.string.download) -> {
|
||||||
val downloadDialog = DownloadDialog(videoId)
|
val downloadDialog = DownloadDialog(videoId)
|
||||||
downloadDialog.show(parentFragmentManager, DownloadDialog::class.java.name)
|
downloadDialog.show(parentFragmentManager, DownloadDialog::class.java.name)
|
||||||
}
|
}
|
||||||
context?.getString(R.string.share) -> {
|
getString(R.string.share) -> {
|
||||||
val shareDialog = ShareDialog(videoId, ShareObjectType.VIDEO, shareData)
|
val shareDialog = ShareDialog(videoId, ShareObjectType.VIDEO, shareData)
|
||||||
// using parentFragmentManager is important here
|
// using parentFragmentManager is important here
|
||||||
shareDialog.show(parentFragmentManager, ShareDialog::class.java.name)
|
shareDialog.show(parentFragmentManager, ShareDialog::class.java.name)
|
||||||
}
|
}
|
||||||
context?.getString(R.string.play_next) -> {
|
getString(R.string.play_next) -> {
|
||||||
CoroutineScope(Dispatchers.IO).launch {
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
try {
|
try {
|
||||||
PlayingQueue.addAsNext(
|
PlayingQueue.addAsNext(
|
||||||
@ -76,7 +89,7 @@ class VideoOptionsBottomSheet(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
context?.getString(R.string.add_to_queue) -> {
|
getString(R.string.add_to_queue) -> {
|
||||||
CoroutineScope(Dispatchers.IO).launch {
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
try {
|
try {
|
||||||
PlayingQueue.add(
|
PlayingQueue.add(
|
||||||
@ -88,6 +101,29 @@ class VideoOptionsBottomSheet(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
getString(R.string.mark_as_watched) -> {
|
||||||
|
val watchPosition = WatchPosition(videoId, Long.MAX_VALUE)
|
||||||
|
awaitQuery {
|
||||||
|
DatabaseHolder.Database.watchPositionDao().insertAll(watchPosition)
|
||||||
|
}
|
||||||
|
if (PreferenceHelper.getBoolean(PreferenceKeys.HIDE_WATCHED_FROM_FEED, false)) {
|
||||||
|
// get the host fragment containing the current fragment
|
||||||
|
val navHostFragment =
|
||||||
|
(context as MainActivity).supportFragmentManager.findFragmentById(
|
||||||
|
R.id.fragment
|
||||||
|
) as NavHostFragment?
|
||||||
|
// get the current fragment
|
||||||
|
val fragment = navHostFragment?.childFragmentManager?.fragments?.firstOrNull()
|
||||||
|
Log.e(
|
||||||
|
"fragments",
|
||||||
|
navHostFragment?.childFragmentManager?.fragments.orEmpty()
|
||||||
|
.joinToString(", ") { it::class.java.name.toString() }
|
||||||
|
)
|
||||||
|
(fragment as? SubscriptionsFragment)?.subscriptionsAdapter?.removeItemById(
|
||||||
|
videoId
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -441,6 +441,7 @@
|
|||||||
<string name="help">Help</string>
|
<string name="help">Help</string>
|
||||||
<string name="faq">FAQ</string>
|
<string name="faq">FAQ</string>
|
||||||
<string name="codecs">Codecs</string>
|
<string name="codecs">Codecs</string>
|
||||||
|
<string name="mark_as_watched">Mark as watched</string>
|
||||||
|
|
||||||
<!-- Notification channel strings -->
|
<!-- Notification channel strings -->
|
||||||
<string name="download_channel_name">Download Service</string>
|
<string name="download_channel_name">Download Service</string>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user