From 7bdc7f3a7487af8134cb21548cd26524751d1361 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Sun, 27 Nov 2022 19:51:30 +0100 Subject: [PATCH] Indicator the the feed got caught up for subscriptions --- .../github/libretube/api/obj/ContentItem.kt | 2 ++ .../github/libretube/api/obj/StreamItem.kt | 4 ++- .../libretube/constants/PreferenceKeys.kt | 7 +++- .../libretube/ui/adapters/SearchAdapter.kt | 8 ++--- .../libretube/ui/adapters/VideosAdapter.kt | 11 +++++- .../ui/fragments/SubscriptionsFragment.kt | 12 +++++++ .../ui/viewholders/VideosViewHolder.kt | 6 ++++ .../github/libretube/util/PreferenceHelper.kt | 17 +++++++++ app/src/main/res/drawable/ic_done.xml | 18 ++++++++++ app/src/main/res/layout/all_caught_up_row.xml | 35 +++++++++++++++++++ app/src/main/res/values/strings.xml | 2 ++ 11 files changed, 115 insertions(+), 7 deletions(-) create mode 100644 app/src/main/res/drawable/ic_done.xml create mode 100644 app/src/main/res/layout/all_caught_up_row.xml diff --git a/app/src/main/java/com/github/libretube/api/obj/ContentItem.kt b/app/src/main/java/com/github/libretube/api/obj/ContentItem.kt index af7181e5c..9d6f33652 100644 --- a/app/src/main/java/com/github/libretube/api/obj/ContentItem.kt +++ b/app/src/main/java/com/github/libretube/api/obj/ContentItem.kt @@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties @JsonIgnoreProperties(ignoreUnknown = true) data class ContentItem( var url: String? = null, + val type: String? = null, var thumbnail: String? = null, var uploaderName: String? = null, var uploaded: Long? = null, @@ -16,6 +17,7 @@ data class ContentItem( var uploadedDate: String? = null, var duration: Long? = null, var views: Long? = null, + var isShort: Boolean? = null, var uploaderVerified: Boolean? = null, // Channel and Playlist attributes var name: String? = null, diff --git a/app/src/main/java/com/github/libretube/api/obj/StreamItem.kt b/app/src/main/java/com/github/libretube/api/obj/StreamItem.kt index ad612a9fc..9363fbabd 100644 --- a/app/src/main/java/com/github/libretube/api/obj/StreamItem.kt +++ b/app/src/main/java/com/github/libretube/api/obj/StreamItem.kt @@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties @JsonIgnoreProperties(ignoreUnknown = true) data class StreamItem( var url: String? = null, + val type: String? = null, var title: String? = null, var thumbnail: String? = null, var uploaderName: String? = null, @@ -15,5 +16,6 @@ data class StreamItem( var views: Long? = null, var uploaderVerified: Boolean? = null, var uploaded: Long? = null, - var shortDescription: String? = null + var shortDescription: String? = null, + val isShort: Boolean = false ) 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 905379e7d..b12ddee17 100644 --- a/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt +++ b/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt @@ -100,12 +100,17 @@ object PreferenceKeys { const val NOTIFICATION_ENABLED = "notification_toggle" const val CHECKING_FREQUENCY = "checking_frequency" const val REQUIRED_NETWORK = "required_network" - const val LAST_STREAM_VIDEO_ID = "last_stream_video_id" const val IGNORED_NOTIFICATION_CHANNELS = "ignored_notification_channels" const val NOTIFICATION_TIME_ENABLED = "notification_time" const val NOTIFICATION_START_TIME = "notification_start_time" const val NOTIFICATION_END_TIME = "notification_end_time" + /** + * Subscriptions + */ + const val LAST_STREAM_VIDEO_ID = "last_stream_video_id" + const val LAST_WATCHED_FEED_TIME = "last_watched_feed_time" + /** * Advanced */ diff --git a/app/src/main/java/com/github/libretube/ui/adapters/SearchAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/SearchAdapter.kt index 671efeade..4f8a4e141 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/SearchAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/SearchAdapter.kt @@ -71,10 +71,10 @@ class SearchAdapter( } override fun getItemViewType(position: Int): Int { - return when { - searchItems[position].url!!.startsWith("/watch", false) -> 0 - searchItems[position].url!!.startsWith("/channel", false) -> 1 - searchItems[position].url!!.startsWith("/playlist", false) -> 2 + return when (searchItems[position].type) { + "stream" -> 0 + "channel" -> 1 + "playlist" -> 2 else -> 3 } } 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 55175357d..f67dff7fb 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 @@ -13,6 +13,7 @@ import androidx.recyclerview.widget.RecyclerView.LayoutManager import com.github.libretube.R import com.github.libretube.api.obj.StreamItem 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.formatShort @@ -44,6 +45,10 @@ class VideosAdapter( } } + override fun getItemViewType(position: Int): Int { + return if (streamItems[position].type == "caught") CAUGHT_UP_TYPE else NORMAL_TYPE + } + fun updateItems() { val oldSize = index index += 10 @@ -59,6 +64,7 @@ class VideosAdapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VideosViewHolder { val layoutInflater = LayoutInflater.from(parent.context) return when { + viewType == CAUGHT_UP_TYPE -> VideosViewHolder(AllCaughtUpRowBinding.inflate(layoutInflater, parent, false)) forceMode in listOf(ForceMode.TRENDING, ForceMode.RELATED, ForceMode.HOME) -> VideosViewHolder(TrendingRowBinding.inflate(layoutInflater, parent, false)) forceMode == ForceMode.CHANNEL -> VideosViewHolder(VideoRowBinding.inflate(layoutInflater, parent, false)) PreferenceHelper.getBoolean( @@ -74,7 +80,7 @@ class VideosAdapter( val video = streamItems[position] // hide the item if there was an extractor error - if (video.title == null) { + if (video.title == null && video.type != "caught") { holder.itemView.visibility = View.GONE holder.itemView.layoutParams = RecyclerView.LayoutParams(0, 0) return @@ -191,5 +197,8 @@ class VideosAdapter( ) } } + + private const val NORMAL_TYPE = 0 + private const val CAUGHT_UP_TYPE = 1 } } 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 55d1e918b..0f75acd23 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,6 +10,7 @@ import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import com.github.libretube.R +import com.github.libretube.api.obj.StreamItem import com.github.libretube.constants.PreferenceKeys import com.github.libretube.databinding.FragmentSubscriptionsBinding import com.github.libretube.ui.adapters.LegacySubscriptionAdapter @@ -144,6 +145,15 @@ class SubscriptionsFragment : BaseFragment() { 4 -> feed.sortedBy { it.uploaderName } 5 -> feed.sortedBy { it.uploaderName }.reversed() else -> feed + }.toMutableList() + + // add an "all caught up item" + if (sortOrder == 0) { + val lastCheckedFeedTime = PreferenceHelper.getLastCheckedFeedTime() + val caughtUpIndex = feed.indexOfFirst { (it.uploaded ?: 0L) / 1000 < lastCheckedFeedTime } + if (caughtUpIndex > 0) { + sortedFeed.add(caughtUpIndex, StreamItem(type = "caught")) + } } binding.subChannelsContainer.visibility = View.GONE @@ -158,6 +168,8 @@ class SubscriptionsFragment : BaseFragment() { showAllAtOnce = false ) binding.subFeed.adapter = subscriptionAdapter + + PreferenceHelper.updateLastFeedWatchedTime() } private fun showSubscriptions() { diff --git a/app/src/main/java/com/github/libretube/ui/viewholders/VideosViewHolder.kt b/app/src/main/java/com/github/libretube/ui/viewholders/VideosViewHolder.kt index 0b5d293c8..2f1a285c2 100644 --- a/app/src/main/java/com/github/libretube/ui/viewholders/VideosViewHolder.kt +++ b/app/src/main/java/com/github/libretube/ui/viewholders/VideosViewHolder.kt @@ -1,12 +1,14 @@ package com.github.libretube.ui.viewholders import androidx.recyclerview.widget.RecyclerView +import com.github.libretube.databinding.AllCaughtUpRowBinding import com.github.libretube.databinding.TrendingRowBinding import com.github.libretube.databinding.VideoRowBinding class VideosViewHolder : RecyclerView.ViewHolder { var trendingRowBinding: TrendingRowBinding? = null var videoRowBinding: VideoRowBinding? = null + var allCaughtUpBinding: AllCaughtUpRowBinding? = null constructor(binding: TrendingRowBinding) : super(binding.root) { trendingRowBinding = binding @@ -15,4 +17,8 @@ class VideosViewHolder : RecyclerView.ViewHolder { constructor(binding: VideoRowBinding) : super(binding.root) { videoRowBinding = binding } + + constructor(binding: AllCaughtUpRowBinding) : super(binding.root) { + allCaughtUpBinding = binding + } } diff --git a/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt b/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt index f5f378134..ecfaa9c26 100644 --- a/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt +++ b/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.SharedPreferences import androidx.preference.PreferenceManager import com.github.libretube.constants.PreferenceKeys +import java.time.Instant object PreferenceHelper { /** @@ -45,6 +46,10 @@ object PreferenceHelper { editor.putFloat(key, value).commit() } + fun putLong(key: String, value: Long) { + editor.putLong(key, value).commit() + } + fun getString(key: String?, defValue: String): String { return settings.getString(key, defValue) ?: defValue } @@ -57,6 +62,10 @@ object PreferenceHelper { return settings.getInt(key, defValue) } + fun getLong(key: String?, defValue: Long): Long { + return settings.getLong(key, defValue) + } + fun getFloat(key: String?, defValue: Float): Float { return settings.getFloat(key, defValue) } @@ -89,6 +98,14 @@ object PreferenceHelper { return getString(PreferenceKeys.LAST_STREAM_VIDEO_ID, "") } + fun updateLastFeedWatchedTime() { + putLong(PreferenceKeys.LAST_WATCHED_FEED_TIME, Instant.now().epochSecond) + } + + fun getLastCheckedFeedTime(): Long { + return getLong(PreferenceKeys.LAST_WATCHED_FEED_TIME, 0) + } + fun saveErrorLog(log: String) { editor.putString(PreferenceKeys.ERROR_LOG, log).commit() } diff --git a/app/src/main/res/drawable/ic_done.xml b/app/src/main/res/drawable/ic_done.xml new file mode 100644 index 000000000..98c38381c --- /dev/null +++ b/app/src/main/res/drawable/ic_done.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/layout/all_caught_up_row.xml b/app/src/main/res/layout/all_caught_up_row.xml new file mode 100644 index 000000000..0ea7c35d0 --- /dev/null +++ b/app/src/main/res/layout/all_caught_up_row.xml @@ -0,0 +1,35 @@ + + + + + + + + + + \ 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 fba7adf02..a229cf42b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -401,6 +401,8 @@ Captions size Double tap to seek Tap twice at the left or right to rewind or forward the player position. + You\'re all caught up + You\'ve seen all new videos Download Service