From 458af7d7d44b342ce340717a329abcc8741ec993 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 1 Jul 2022 18:04:25 +0200 Subject: [PATCH 1/6] backend for watch history --- .../libretube/fragments/PlayerFragment.kt | 1 + .../github/libretube/obj/WatchHistoryItem.kt | 11 ++++++ .../github/libretube/util/PreferenceHelper.kt | 38 +++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 app/src/main/java/com/github/libretube/obj/WatchHistoryItem.kt diff --git a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt index e2575af2c..b3369fec9 100644 --- a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt @@ -455,6 +455,7 @@ class PlayerFragment : Fragment() { if (!relatedStreamsEnabled) toggleComments() // prepare for autoplay initAutoPlay() + PreferenceHelper.addToWatchHistory(requireContext(), videoId!!, response) } } } diff --git a/app/src/main/java/com/github/libretube/obj/WatchHistoryItem.kt b/app/src/main/java/com/github/libretube/obj/WatchHistoryItem.kt new file mode 100644 index 000000000..074904223 --- /dev/null +++ b/app/src/main/java/com/github/libretube/obj/WatchHistoryItem.kt @@ -0,0 +1,11 @@ +package com.github.libretube.obj + +data class WatchHistoryItem( + val videoId: String?, + val title: String?, + val uploadDate: String?, + val uploader: String?, + val uploaderUrl: String?, + val thumbnailUrl: String?, + val duration: Int? +) 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 310a02578..2540268b9 100644 --- a/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt +++ b/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt @@ -2,13 +2,18 @@ package com.github.libretube.util import android.content.Context import android.content.SharedPreferences +import android.util.Log import androidx.preference.PreferenceManager import com.github.libretube.obj.CustomInstance +import com.github.libretube.obj.Streams +import com.github.libretube.obj.WatchHistoryItem import com.google.common.reflect.TypeToken import com.google.gson.Gson import java.lang.reflect.Type object PreferenceHelper { + private val TAG = "PreferenceHelper" + fun setString(context: Context, key: String?, value: String?) { val editor = getDefaultSharedPreferencesEditor(context) editor.putString(key, value) @@ -122,6 +127,39 @@ object PreferenceHelper { editor.putStringSet("search_history", set).apply() } + fun addToWatchHistory(context: Context, videoId: String, streams: Streams) { + val editor = getDefaultSharedPreferencesEditor(context) + val gson = Gson() + + val watchHistoryItem = WatchHistoryItem( + videoId, + streams.title, + streams.uploadDate, + streams.uploader, + streams.uploaderUrl?.replace("/channel/", ""), + streams.thumbnailUrl, + streams.duration + ) + + val watchHistory = getWatchHistory(context) + watchHistory += watchHistoryItem + + val json = gson.toJson(watchHistory) + editor.putString("watch_history", json).apply() + } + + fun getWatchHistory(context: Context): ArrayList { + val settings = getDefaultSharedPreferences(context) + val gson = Gson() + val json: String = settings.getString("watch_history", "")!! + val type: Type = object : TypeToken?>() {}.type + return try { + gson.fromJson(json, type) + } catch (e: Exception) { + arrayListOf() + } + } + private fun getDefaultSharedPreferences(context: Context): SharedPreferences { return PreferenceManager.getDefaultSharedPreferences(context) } From e7e4cf7c077ef7936ecdb82a0cc89958038dd5eb Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 1 Jul 2022 18:11:12 +0200 Subject: [PATCH 2/6] add toggle --- .../github/libretube/fragments/PlayerFragment.kt | 5 ++++- .../libretube/preferences/AdvancedSettings.kt | 8 ++++++++ app/src/main/res/values/strings.xml | 3 ++- app/src/main/res/xml/advanced_settings.xml | 15 +++++++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt index b3369fec9..7549c82c5 100644 --- a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt @@ -455,7 +455,10 @@ class PlayerFragment : Fragment() { if (!relatedStreamsEnabled) toggleComments() // prepare for autoplay initAutoPlay() - PreferenceHelper.addToWatchHistory(requireContext(), videoId!!, response) + val watchHistoryEnabled = + PreferenceHelper.getBoolean(requireContext(), "Watch_history_toggle", true) + if (watchHistoryEnabled) + PreferenceHelper.addToWatchHistory(requireContext(), videoId!!, response) } } } diff --git a/app/src/main/java/com/github/libretube/preferences/AdvancedSettings.kt b/app/src/main/java/com/github/libretube/preferences/AdvancedSettings.kt index 3fb39c7e8..91a38d072 100644 --- a/app/src/main/java/com/github/libretube/preferences/AdvancedSettings.kt +++ b/app/src/main/java/com/github/libretube/preferences/AdvancedSettings.kt @@ -18,12 +18,20 @@ class AdvancedSettings : PreferenceFragmentCompat() { val settingsActivity = activity as SettingsActivity settingsActivity.binding.topBarTextView.text = getString(R.string.advanced) + // clear search history val clearHistory = findPreference("clear_history") clearHistory?.setOnPreferenceClickListener { PreferenceHelper.removePreference(requireContext(), "search_history") true } + // clear watch history + val clearWatchHistory = findPreference("clear_watch_history") + clearWatchHistory?.setOnPreferenceClickListener { + PreferenceHelper.removePreference(requireContext(), "watch_history") + true + } + val resetSettings = findPreference("reset_settings") resetSettings?.setOnPreferenceClickListener { showResetDialog() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3abd7ec36..483374be3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -79,7 +79,7 @@ OK History Search History - Clear History + Clear search history YT Music Songs YT Music Videos YT Music Albums @@ -207,4 +207,5 @@ Delete your Piped account Account Restore + Watch history \ No newline at end of file diff --git a/app/src/main/res/xml/advanced_settings.xml b/app/src/main/res/xml/advanced_settings.xml index a9e92a024..ad17cd058 100644 --- a/app/src/main/res/xml/advanced_settings.xml +++ b/app/src/main/res/xml/advanced_settings.xml @@ -46,6 +46,21 @@ + + + + + + + + Date: Fri, 1 Jul 2022 18:29:47 +0200 Subject: [PATCH 3/6] watch history fragment --- .../libretube/activities/MainActivity.kt | 22 ++++++++-------- .../libretube/adapters/CommentsAdapter.kt | 2 +- .../libretube/adapters/RepliesAdapter.kt | 2 +- .../libretube/adapters/SearchAdapter.kt | 4 +-- .../libretube/adapters/SubscriptionAdapter.kt | 2 +- .../adapters/SubscriptionChannelAdapter.kt | 2 +- .../libretube/adapters/TrendingAdapter.kt | 2 +- .../libretube/fragments/LibraryFragment.kt | 6 +++++ .../libretube/fragments/PlayerFragment.kt | 2 +- .../fragments/WatchHistoryFragment.kt | 26 +++++++++++++++++++ app/src/main/res/layout/fragment_library.xml | 22 ++++++++++++++++ .../res/layout/fragment_watch_history.xml | 18 +++++++++++++ app/src/main/res/menu/bottom_menu.xml | 6 ++--- app/src/main/res/navigation/nav.xml | 17 ++++++------ 14 files changed, 103 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt create mode 100644 app/src/main/res/layout/fragment_watch_history.xml diff --git a/app/src/main/java/com/github/libretube/activities/MainActivity.kt b/app/src/main/java/com/github/libretube/activities/MainActivity.kt index e47cc3605..eb4b5eef5 100644 --- a/app/src/main/java/com/github/libretube/activities/MainActivity.kt +++ b/app/src/main/java/com/github/libretube/activities/MainActivity.kt @@ -79,28 +79,28 @@ class MainActivity : AppCompatActivity() { // hide the trending page if enabled val hideTrendingPage = PreferenceHelper.getBoolean(this, "hide_trending_page", false) - if (hideTrendingPage) bottomNavigationView.menu.findItem(R.id.home2).isVisible = false + if (hideTrendingPage) bottomNavigationView.menu.findItem(R.id.homeFragment).isVisible = false // navigate to the default start tab when (PreferenceHelper.getString(this, "default_tab", "home")) { - "home" -> navController.navigate(R.id.home2) - "subscriptions" -> navController.navigate(R.id.subscriptions) - "library" -> navController.navigate(R.id.library) + "home" -> navController.navigate(R.id.homeFragment) + "subscriptions" -> navController.navigate(R.id.subscriptionsFragment) + "library" -> navController.navigate(R.id.libraryFragment) } binding.bottomNav.setOnItemSelectedListener { when (it.itemId) { - R.id.home2 -> { + R.id.homeFragment -> { navController.backQueue.clear() - navController.navigate(R.id.home2) + navController.navigate(R.id.homeFragment) } - R.id.subscriptions -> { + R.id.subscriptionsFragment -> { // navController.backQueue.clear() - navController.navigate(R.id.subscriptions) + navController.navigate(R.id.subscriptionsFragment) } - R.id.library -> { + R.id.libraryFragment -> { // navController.backQueue.clear() - navController.navigate(R.id.library) + navController.navigate(R.id.libraryFragment) } } false @@ -176,7 +176,7 @@ class MainActivity : AppCompatActivity() { channel = channel!!.replace("/c/", "") channel = channel.replace("/user/", "") val bundle = bundleOf("channel_id" to channel) - navController.navigate(R.id.channel, bundle) + navController.navigate(R.id.channelFragment, bundle) } else if (data.path!!.contains("/playlist")) { Log.i(TAG, "URI Type: Playlist") var playlist = data.query!! diff --git a/app/src/main/java/com/github/libretube/adapters/CommentsAdapter.kt b/app/src/main/java/com/github/libretube/adapters/CommentsAdapter.kt index b66c0a207..70ba92bd4 100644 --- a/app/src/main/java/com/github/libretube/adapters/CommentsAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/CommentsAdapter.kt @@ -69,7 +69,7 @@ class CommentsAdapter( commentorImage.setOnClickListener { val activity = holder.v.context as MainActivity val bundle = bundleOf("channel_id" to comment.commentorUrl) - activity.navController.navigate(R.id.channel, bundle) + activity.navController.navigate(R.id.channelFragment, bundle) try { val mainMotionLayout = activity.findViewById(R.id.mainMotionLayout) diff --git a/app/src/main/java/com/github/libretube/adapters/RepliesAdapter.kt b/app/src/main/java/com/github/libretube/adapters/RepliesAdapter.kt index 534ae0267..744b864ec 100644 --- a/app/src/main/java/com/github/libretube/adapters/RepliesAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/RepliesAdapter.kt @@ -61,7 +61,7 @@ class RepliesAdapter( commentorImage.setOnClickListener { val activity = holder.v.context as MainActivity val bundle = bundleOf("channel_id" to reply.commentorUrl) - activity.navController.navigate(R.id.channel, bundle) + activity.navController.navigate(R.id.channelFragment, bundle) try { val mainMotionLayout = activity.findViewById(R.id.mainMotionLayout) diff --git a/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt b/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt index 3706143eb..e57e740a8 100644 --- a/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt @@ -117,7 +117,7 @@ class SearchViewHolder( channelImage.setOnClickListener { val activity = v.context as MainActivity val bundle = bundleOf("channel_id" to item.uploaderUrl) - activity.navController.navigate(R.id.channel, bundle) + activity.navController.navigate(R.id.channelFragment, bundle) } } @@ -134,7 +134,7 @@ class SearchViewHolder( v.setOnClickListener { val activity = v.context as MainActivity val bundle = bundleOf("channel_id" to item.url) - activity.navController.navigate(R.id.channel, bundle) + activity.navController.navigate(R.id.channelFragment, bundle) } // todo sub button } diff --git a/app/src/main/java/com/github/libretube/adapters/SubscriptionAdapter.kt b/app/src/main/java/com/github/libretube/adapters/SubscriptionAdapter.kt index a0813914c..bab7f497d 100644 --- a/app/src/main/java/com/github/libretube/adapters/SubscriptionAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/SubscriptionAdapter.kt @@ -62,7 +62,7 @@ class SubscriptionAdapter( channelImage.setOnClickListener { val activity = holder.v.context as MainActivity val bundle = bundleOf("channel_id" to trending.uploaderUrl) - activity.navController.navigate(R.id.channel, bundle) + activity.navController.navigate(R.id.channelFragment, bundle) try { val mainMotionLayout = activity.findViewById(R.id.mainMotionLayout) diff --git a/app/src/main/java/com/github/libretube/adapters/SubscriptionChannelAdapter.kt b/app/src/main/java/com/github/libretube/adapters/SubscriptionChannelAdapter.kt index de1e78664..a53a7b8e2 100644 --- a/app/src/main/java/com/github/libretube/adapters/SubscriptionChannelAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/SubscriptionChannelAdapter.kt @@ -48,7 +48,7 @@ class SubscriptionChannelAdapter(private val subscriptions: MutableList(R.id.mainMotionLayout) diff --git a/app/src/main/java/com/github/libretube/fragments/LibraryFragment.kt b/app/src/main/java/com/github/libretube/fragments/LibraryFragment.kt index b66ce1fc3..62a00d7ec 100644 --- a/app/src/main/java/com/github/libretube/fragments/LibraryFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/LibraryFragment.kt @@ -8,6 +8,7 @@ import android.view.ViewGroup import android.widget.Toast import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope +import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import com.github.libretube.R import com.github.libretube.adapters.PlaylistsAdapter @@ -43,6 +44,11 @@ class LibraryFragment : Fragment() { super.onViewCreated(view, savedInstanceState) binding.playlistRecView.layoutManager = LinearLayoutManager(view.context) token = PreferenceHelper.getToken(requireContext()) + + binding.showWatchHistory.setOnClickListener { + findNavController().navigate(R.id.watchHistoryFragment) + } + if (token != "") { binding.boogh.visibility = View.GONE binding.textLike.visibility = View.GONE diff --git a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt index 7549c82c5..0add6dc33 100644 --- a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt @@ -746,7 +746,7 @@ class PlayerFragment : Fragment() { binding.playerChannel.setOnClickListener { val activity = view.context as MainActivity val bundle = bundleOf("channel_id" to response.uploaderUrl) - activity.navController.navigate(R.id.channel, bundle) + activity.navController.navigate(R.id.channelFragment, bundle) activity.binding.mainMotionLayout.transitionToEnd() binding.playerMotionLayout.transitionToEnd() } diff --git a/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt b/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt new file mode 100644 index 000000000..4e30fe416 --- /dev/null +++ b/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt @@ -0,0 +1,26 @@ +package com.github.libretube.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.github.libretube.databinding.FragmentWatchHistoryBinding + +class WatchHistoryFragment : Fragment() { + private val TAG = "WatchHistoryFragment" + private lateinit var binding: FragmentWatchHistoryBinding + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentWatchHistoryBinding.inflate(layoutInflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_library.xml b/app/src/main/res/layout/fragment_library.xml index a81923388..32339cec3 100644 --- a/app/src/main/res/layout/fragment_library.xml +++ b/app/src/main/res/layout/fragment_library.xml @@ -6,6 +6,26 @@ android:layout_height="match_parent" tools:context=".fragments.LibraryFragment"> + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_menu.xml b/app/src/main/res/menu/bottom_menu.xml index 809c8b2ee..f5badbc88 100644 --- a/app/src/main/res/menu/bottom_menu.xml +++ b/app/src/main/res/menu/bottom_menu.xml @@ -2,15 +2,15 @@ diff --git a/app/src/main/res/navigation/nav.xml b/app/src/main/res/navigation/nav.xml index 1fc46ab85..31d75575c 100644 --- a/app/src/main/res/navigation/nav.xml +++ b/app/src/main/res/navigation/nav.xml @@ -3,20 +3,20 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/nav" - app:startDestination="@id/home2"> + app:startDestination="@id/homeFragment"> @@ -26,7 +26,7 @@ android:label="fragment_search" tools:layout="@layout/fragment_search" /> @@ -44,7 +44,8 @@ app:argType="string" /> + android:id="@+id/watchHistoryFragment" + android:name="com.github.libretube.fragments.WatchHistoryFragment" + android:label="@string/watch_history" + tools:layout="@layout/fragment_watch_history"/> \ No newline at end of file From 321887933b6ec4f97263f39f5041f5832892e393 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 1 Jul 2022 18:50:51 +0200 Subject: [PATCH 4/6] watch history adapter --- .../libretube/adapters/WatchHistoryAdapter.kt | 42 +++++++ .../fragments/WatchHistoryFragment.kt | 9 +- .../github/libretube/obj/WatchHistoryItem.kt | 1 + .../github/libretube/util/PreferenceHelper.kt | 1 + app/src/main/res/layout/watch_history_row.xml | 106 ++++++++++++++++++ app/src/main/res/values/strings.xml | 2 +- 6 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/github/libretube/adapters/WatchHistoryAdapter.kt create mode 100644 app/src/main/res/layout/watch_history_row.xml diff --git a/app/src/main/java/com/github/libretube/adapters/WatchHistoryAdapter.kt b/app/src/main/java/com/github/libretube/adapters/WatchHistoryAdapter.kt new file mode 100644 index 000000000..28699d7b1 --- /dev/null +++ b/app/src/main/java/com/github/libretube/adapters/WatchHistoryAdapter.kt @@ -0,0 +1,42 @@ +package com.github.libretube.adapters + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.github.libretube.databinding.WatchHistoryRowBinding +import com.github.libretube.obj.WatchHistoryItem +import com.squareup.picasso.Picasso + +class WatchHistoryAdapter( + private val watchHistory: List +) : + RecyclerView.Adapter() { + private val TAG = "WatchHistoryAdapter" + private lateinit var binding: WatchHistoryRowBinding + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WatchHistoryViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + binding = WatchHistoryRowBinding.inflate(layoutInflater, parent, false) + return WatchHistoryViewHolder(binding.root) + } + + override fun onBindViewHolder(holder: WatchHistoryViewHolder, position: Int) { + val video = watchHistory[position] + binding.apply { + videoTitle.text = video.title + channelName.text = video.uploader + Picasso.get().load(video.thumbnailUrl).into(thumbnail) + Picasso.get().load(video.uploaderAvatar).into(channelImage) + } + } + + override fun getItemCount(): Int { + return watchHistory.size + } +} + +class WatchHistoryViewHolder(val v: View) : RecyclerView.ViewHolder(v) { + init { + } +} diff --git a/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt b/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt index 4e30fe416..363d9a871 100644 --- a/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt @@ -5,7 +5,10 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.LinearLayoutManager +import com.github.libretube.adapters.WatchHistoryAdapter import com.github.libretube.databinding.FragmentWatchHistoryBinding +import com.github.libretube.util.PreferenceHelper class WatchHistoryFragment : Fragment() { private val TAG = "WatchHistoryFragment" @@ -22,5 +25,9 @@ class WatchHistoryFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + + val watchHistory = PreferenceHelper.getWatchHistory(requireContext()) + binding.watchHistoryRecView.adapter = WatchHistoryAdapter(watchHistory) + binding.watchHistoryRecView.layoutManager = LinearLayoutManager(view.context) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/github/libretube/obj/WatchHistoryItem.kt b/app/src/main/java/com/github/libretube/obj/WatchHistoryItem.kt index 074904223..cbd922578 100644 --- a/app/src/main/java/com/github/libretube/obj/WatchHistoryItem.kt +++ b/app/src/main/java/com/github/libretube/obj/WatchHistoryItem.kt @@ -5,6 +5,7 @@ data class WatchHistoryItem( val title: String?, val uploadDate: String?, val uploader: String?, + val uploaderAvatar: String?, val uploaderUrl: String?, val thumbnailUrl: String?, val duration: Int? 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 2540268b9..4e7c013ca 100644 --- a/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt +++ b/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt @@ -137,6 +137,7 @@ object PreferenceHelper { streams.uploadDate, streams.uploader, streams.uploaderUrl?.replace("/channel/", ""), + streams.uploaderAvatar, streams.thumbnailUrl, streams.duration ) diff --git a/app/src/main/res/layout/watch_history_row.xml b/app/src/main/res/layout/watch_history_row.xml new file mode 100644 index 000000000..209ca6ba9 --- /dev/null +++ b/app/src/main/res/layout/watch_history_row.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 483374be3..0c1c5b73e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -79,7 +79,7 @@ OK History Search History - Clear search history + Clear history YT Music Songs YT Music Videos YT Music Albums From 31cf6f608e02869b69d208db7a9b5d0866096a12 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 1 Jul 2022 19:47:43 +0200 Subject: [PATCH 5/6] add functionality for watch history items --- .../libretube/adapters/WatchHistoryAdapter.kt | 58 ++++++++++++++++++- .../libretube/fragments/LibraryFragment.kt | 10 +++- .../fragments/WatchHistoryFragment.kt | 17 +++++- .../github/libretube/obj/WatchHistoryItem.kt | 2 +- .../github/libretube/util/PreferenceHelper.kt | 9 +++ app/src/main/res/layout/fragment_library.xml | 1 + .../res/layout/fragment_watch_history.xml | 22 ++++++- app/src/main/res/layout/watch_history_row.xml | 6 +- 8 files changed, 114 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/github/libretube/adapters/WatchHistoryAdapter.kt b/app/src/main/java/com/github/libretube/adapters/WatchHistoryAdapter.kt index 28699d7b1..40f02d508 100644 --- a/app/src/main/java/com/github/libretube/adapters/WatchHistoryAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/WatchHistoryAdapter.kt @@ -1,20 +1,39 @@ package com.github.libretube.adapters +import android.R.attr.data +import android.os.Bundle +import android.text.format.DateUtils import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.appcompat.app.AppCompatActivity +import androidx.constraintlayout.motion.widget.MotionLayout +import androidx.core.os.bundleOf +import androidx.fragment.app.FragmentManager import androidx.recyclerview.widget.RecyclerView +import com.github.libretube.R +import com.github.libretube.activities.MainActivity import com.github.libretube.databinding.WatchHistoryRowBinding +import com.github.libretube.dialogs.VideoOptionsDialog +import com.github.libretube.fragments.PlayerFragment import com.github.libretube.obj.WatchHistoryItem import com.squareup.picasso.Picasso + class WatchHistoryAdapter( - private val watchHistory: List + private val watchHistory: MutableList, + private val childFragmentManager: FragmentManager ) : RecyclerView.Adapter() { private val TAG = "WatchHistoryAdapter" private lateinit var binding: WatchHistoryRowBinding + fun clear() { + val size = watchHistory.size + watchHistory.clear() + notifyItemRangeRemoved(0, size) + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WatchHistoryViewHolder { val layoutInflater = LayoutInflater.from(parent.context) binding = WatchHistoryRowBinding.inflate(layoutInflater, parent, false) @@ -26,8 +45,45 @@ class WatchHistoryAdapter( binding.apply { videoTitle.text = video.title channelName.text = video.uploader + uploadDate.text = video.uploadDate + thumbnailDuration.text = DateUtils.formatElapsedTime(video.duration?.toLong()!!) Picasso.get().load(video.thumbnailUrl).into(thumbnail) Picasso.get().load(video.uploaderAvatar).into(channelImage) + + channelImage.setOnClickListener { + val activity = holder.v.context as MainActivity + val bundle = bundleOf("channel_id" to video.uploaderUrl) + activity.navController.navigate(R.id.channelFragment, bundle) + try { + val mainMotionLayout = + activity.findViewById(R.id.mainMotionLayout) + if (mainMotionLayout.progress == 0.toFloat()) { + mainMotionLayout.transitionToEnd() + activity.findViewById(R.id.playerMotionLayout) + .transitionToEnd() + } + } catch (e: Exception) { + } + } + + root.setOnClickListener { + var bundle = Bundle() + bundle.putString("videoId", video.videoId) + var frag = PlayerFragment() + frag.arguments = bundle + val activity = holder.v.context as AppCompatActivity + activity.supportFragmentManager.beginTransaction() + .remove(PlayerFragment()) + .commit() + activity.supportFragmentManager.beginTransaction() + .replace(R.id.container, frag) + .commitNow() + } + root.setOnLongClickListener { + VideoOptionsDialog(video.videoId!!, holder.v.context) + .show(childFragmentManager, VideoOptionsDialog.TAG) + true + } } } diff --git a/app/src/main/java/com/github/libretube/fragments/LibraryFragment.kt b/app/src/main/java/com/github/libretube/fragments/LibraryFragment.kt index 62a00d7ec..893f7249c 100644 --- a/app/src/main/java/com/github/libretube/fragments/LibraryFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/LibraryFragment.kt @@ -45,8 +45,14 @@ class LibraryFragment : Fragment() { binding.playlistRecView.layoutManager = LinearLayoutManager(view.context) token = PreferenceHelper.getToken(requireContext()) - binding.showWatchHistory.setOnClickListener { - findNavController().navigate(R.id.watchHistoryFragment) + // hide watch history button of history disabled + val watchHistoryEnabled = PreferenceHelper.getBoolean(requireContext(), "watch_history_toggle", true) + if (!watchHistoryEnabled) { + binding.showWatchHistory.visibility = View.GONE + } else { + binding.showWatchHistory.setOnClickListener { + findNavController().navigate(R.id.watchHistoryFragment) + } } if (token != "") { diff --git a/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt b/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt index 363d9a871..a4060cfd5 100644 --- a/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt @@ -27,7 +27,20 @@ class WatchHistoryFragment : Fragment() { super.onViewCreated(view, savedInstanceState) val watchHistory = PreferenceHelper.getWatchHistory(requireContext()) - binding.watchHistoryRecView.adapter = WatchHistoryAdapter(watchHistory) - binding.watchHistoryRecView.layoutManager = LinearLayoutManager(view.context) + val watchHistoryAdapter = WatchHistoryAdapter(watchHistory, childFragmentManager) + binding.watchHistoryRecView.adapter = watchHistoryAdapter + + + binding.clearHistory.setOnClickListener { + PreferenceHelper.removePreference(requireContext(), "watch_history") + watchHistoryAdapter.clear() + } + + // reverse order + val linearLayoutManager = LinearLayoutManager(view.context) + linearLayoutManager.reverseLayout = true + linearLayoutManager.stackFromEnd = true + + binding.watchHistoryRecView.layoutManager = linearLayoutManager } } diff --git a/app/src/main/java/com/github/libretube/obj/WatchHistoryItem.kt b/app/src/main/java/com/github/libretube/obj/WatchHistoryItem.kt index cbd922578..b8eab4111 100644 --- a/app/src/main/java/com/github/libretube/obj/WatchHistoryItem.kt +++ b/app/src/main/java/com/github/libretube/obj/WatchHistoryItem.kt @@ -5,8 +5,8 @@ data class WatchHistoryItem( val title: String?, val uploadDate: String?, val uploader: String?, - val uploaderAvatar: String?, val uploaderUrl: String?, + val uploaderAvatar: String?, val thumbnailUrl: String?, val duration: Int? ) 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 4e7c013ca..751aef848 100644 --- a/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt +++ b/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt @@ -143,6 +143,15 @@ object PreferenceHelper { ) val watchHistory = getWatchHistory(context) + + // delete entries that have the same videoId + var indexToRemove = Int.MAX_VALUE + watchHistory.forEachIndexed { index, item -> + if (item.videoId == videoId) indexToRemove = index + } + if (indexToRemove != Int.MAX_VALUE) watchHistory.removeAt(indexToRemove) + + watchHistory += watchHistoryItem val json = gson.toJson(watchHistory) diff --git a/app/src/main/res/layout/fragment_library.xml b/app/src/main/res/layout/fragment_library.xml index 32339cec3..438835540 100644 --- a/app/src/main/res/layout/fragment_library.xml +++ b/app/src/main/res/layout/fragment_library.xml @@ -16,6 +16,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" + android:background="?attr/selectableItemBackground" android:orientation="vertical"> - + android:paddingHorizontal="8dp" + android:layout_marginBottom="8dp" > + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/watch_history_row.xml b/app/src/main/res/layout/watch_history_row.xml index 209ca6ba9..1de9b89eb 100644 --- a/app/src/main/res/layout/watch_history_row.xml +++ b/app/src/main/res/layout/watch_history_row.xml @@ -73,7 +73,7 @@ app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toBottomOf="@id/upload_date" /> + app:layout_constraintTop_toBottomOf="@id/upload_date" /> \ No newline at end of file From 7f130dedb7af855feb6c44635d917c0813534f46 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 1 Jul 2022 19:48:20 +0200 Subject: [PATCH 6/6] ktlint --- .../java/com/github/libretube/adapters/WatchHistoryAdapter.kt | 2 -- .../main/java/com/github/libretube/fragments/PlayerFragment.kt | 3 ++- .../com/github/libretube/fragments/WatchHistoryFragment.kt | 1 - .../main/java/com/github/libretube/util/PreferenceHelper.kt | 2 -- 4 files changed, 2 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/github/libretube/adapters/WatchHistoryAdapter.kt b/app/src/main/java/com/github/libretube/adapters/WatchHistoryAdapter.kt index 40f02d508..e3ca4b0b2 100644 --- a/app/src/main/java/com/github/libretube/adapters/WatchHistoryAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/WatchHistoryAdapter.kt @@ -1,6 +1,5 @@ package com.github.libretube.adapters -import android.R.attr.data import android.os.Bundle import android.text.format.DateUtils import android.view.LayoutInflater @@ -19,7 +18,6 @@ import com.github.libretube.fragments.PlayerFragment import com.github.libretube.obj.WatchHistoryItem import com.squareup.picasso.Picasso - class WatchHistoryAdapter( private val watchHistory: MutableList, private val childFragmentManager: FragmentManager diff --git a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt index 0add6dc33..c2e73a982 100644 --- a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt @@ -457,8 +457,9 @@ class PlayerFragment : Fragment() { initAutoPlay() val watchHistoryEnabled = PreferenceHelper.getBoolean(requireContext(), "Watch_history_toggle", true) - if (watchHistoryEnabled) + if (watchHistoryEnabled) { PreferenceHelper.addToWatchHistory(requireContext(), videoId!!, response) + } } } } diff --git a/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt b/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt index a4060cfd5..29e01175c 100644 --- a/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt @@ -30,7 +30,6 @@ class WatchHistoryFragment : Fragment() { val watchHistoryAdapter = WatchHistoryAdapter(watchHistory, childFragmentManager) binding.watchHistoryRecView.adapter = watchHistoryAdapter - binding.clearHistory.setOnClickListener { PreferenceHelper.removePreference(requireContext(), "watch_history") watchHistoryAdapter.clear() 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 751aef848..045ed4626 100644 --- a/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt +++ b/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt @@ -2,7 +2,6 @@ package com.github.libretube.util import android.content.Context import android.content.SharedPreferences -import android.util.Log import androidx.preference.PreferenceManager import com.github.libretube.obj.CustomInstance import com.github.libretube.obj.Streams @@ -151,7 +150,6 @@ object PreferenceHelper { } if (indexToRemove != Int.MAX_VALUE) watchHistory.removeAt(indexToRemove) - watchHistory += watchHistoryItem val json = gson.toJson(watchHistory)