From 07a94185703351631bec0d66a4316559efa5a2fa Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 29 Jul 2022 11:40:36 +0200 Subject: [PATCH 1/2] hide watch progress by default --- .../libretube/extensions/SetWatchProgressLength.kt | 5 ++++- app/src/main/res/layout/playlist_row.xml | 5 +---- app/src/main/res/layout/trending_row.xml | 6 ++---- app/src/main/res/layout/video_row.xml | 5 +---- app/src/main/res/layout/watch_history_row.xml | 5 +---- app/src/main/res/values/style.xml | 10 ++++++++++ 6 files changed, 19 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/github/libretube/extensions/SetWatchProgressLength.kt b/app/src/main/java/com/github/libretube/extensions/SetWatchProgressLength.kt index 0fd79d838..419bec336 100644 --- a/app/src/main/java/com/github/libretube/extensions/SetWatchProgressLength.kt +++ b/app/src/main/java/com/github/libretube/extensions/SetWatchProgressLength.kt @@ -2,6 +2,7 @@ package com.github.libretube.util import android.view.View import android.view.ViewTreeObserver +import android.widget.LinearLayout import com.github.libretube.preferences.PreferenceHelper /** @@ -17,7 +18,8 @@ fun View?.setWatchProgressLength(videoId: String, duration: Long) { this@setWatchProgressLength.getViewTreeObserver().removeOnGlobalLayoutListener(this) positions.forEach { if (it.videoId == videoId) { - newWidth = (width * (it.position / (duration))) / 1000 + val fullWidth = (parent as LinearLayout).width + newWidth = (fullWidth * (it.position / (duration))) / 1000 return@forEach } } @@ -27,6 +29,7 @@ fun View?.setWatchProgressLength(videoId: String, duration: Long) { width = newWidth!!.toInt() } view.layoutParams = lp + view.visibility = View.VISIBLE } else { view.visibility = View.GONE } diff --git a/app/src/main/res/layout/playlist_row.xml b/app/src/main/res/layout/playlist_row.xml index a0193c730..1846bb9d7 100644 --- a/app/src/main/res/layout/playlist_row.xml +++ b/app/src/main/res/layout/playlist_row.xml @@ -66,10 +66,7 @@ + style="@style/WatchProgress" /> diff --git a/app/src/main/res/layout/trending_row.xml b/app/src/main/res/layout/trending_row.xml index 7566664ec..0de870ce4 100644 --- a/app/src/main/res/layout/trending_row.xml +++ b/app/src/main/res/layout/trending_row.xml @@ -54,10 +54,8 @@ + style="@style/WatchProgress" + android:layout_height="5dp" /> diff --git a/app/src/main/res/layout/video_row.xml b/app/src/main/res/layout/video_row.xml index b1756ea61..c94c725c5 100644 --- a/app/src/main/res/layout/video_row.xml +++ b/app/src/main/res/layout/video_row.xml @@ -65,10 +65,7 @@ + style="@style/WatchProgress" /> diff --git a/app/src/main/res/layout/watch_history_row.xml b/app/src/main/res/layout/watch_history_row.xml index a15034ebd..935836a85 100644 --- a/app/src/main/res/layout/watch_history_row.xml +++ b/app/src/main/res/layout/watch_history_row.xml @@ -65,10 +65,7 @@ + style="@style/WatchProgress" /> diff --git a/app/src/main/res/values/style.xml b/app/src/main/res/values/style.xml index d65465f39..c7209624d 100644 --- a/app/src/main/res/values/style.xml +++ b/app/src/main/res/values/style.xml @@ -125,5 +125,15 @@ + + \ No newline at end of file From 211881ad922a025d6edf1a71c97f8396dd2fb964 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 29 Jul 2022 12:39:03 +0200 Subject: [PATCH 2/2] sort subscriptions feed --- .../libretube/adapters/PlaylistsAdapter.kt | 3 +- .../libretube/dialogs/RequireRestartDialog.kt | 2 +- .../github/libretube/dialogs/UpdateDialog.kt | 4 +- .../libretube/dialogs/VideoOptionsDialog.kt | 4 +- .../libretube/fragments/SearchFragment.kt | 14 +--- .../fragments/SubscriptionsFragment.kt | 68 ++++++++++++++----- .../libretube/preferences/AdvancedSettings.kt | 2 +- .../libretube/preferences/HistorySettings.kt | 2 +- app/src/main/res/drawable/ic_add_instance.xml | 2 +- app/src/main/res/drawable/ic_arrow_back.xml | 2 +- .../main/res/drawable/ic_arrow_downward.xml | 10 +++ .../main/res/drawable/ic_arrow_up_left.xml | 2 +- app/src/main/res/drawable/ic_auth.xml | 2 +- app/src/main/res/drawable/ic_block.xml | 2 +- app/src/main/res/drawable/ic_caption.xml | 2 +- .../main/res/drawable/ic_caption_outlined.xml | 2 +- app/src/main/res/drawable/ic_color.xml | 2 +- app/src/main/res/drawable/ic_community.xml | 2 +- app/src/main/res/drawable/ic_data_saver.xml | 2 +- app/src/main/res/drawable/ic_delete.xml | 2 +- app/src/main/res/drawable/ic_discord.xml | 2 +- app/src/main/res/drawable/ic_donate.xml | 2 +- app/src/main/res/drawable/ic_download.xml | 2 +- .../main/res/drawable/ic_download_filled.xml | 2 +- .../main/res/drawable/ic_empty_playlist.xml | 2 +- app/src/main/res/drawable/ic_flip.xml | 2 +- app/src/main/res/drawable/ic_folder.xml | 2 +- app/src/main/res/drawable/ic_frame.xml | 2 +- app/src/main/res/drawable/ic_fullscreen.xml | 2 +- app/src/main/res/drawable/ic_github.xml | 2 +- app/src/main/res/drawable/ic_grid.xml | 2 +- app/src/main/res/drawable/ic_hd.xml | 2 +- app/src/main/res/drawable/ic_headphones.xml | 2 +- .../main/res/drawable/ic_history_filled.xml | 2 +- app/src/main/res/drawable/ic_info.xml | 2 +- .../main/res/drawable/ic_invert_colors.xml | 2 +- app/src/main/res/drawable/ic_label.xml | 2 +- app/src/main/res/drawable/ic_login.xml | 2 +- app/src/main/res/drawable/ic_login_filled.xml | 2 +- app/src/main/res/drawable/ic_matrix.xml | 2 +- app/src/main/res/drawable/ic_movie.xml | 2 +- app/src/main/res/drawable/ic_music.xml | 2 +- app/src/main/res/drawable/ic_notification.xml | 2 +- app/src/main/res/drawable/ic_open.xml | 2 +- app/src/main/res/drawable/ic_pause_filled.xml | 2 +- app/src/main/res/drawable/ic_piped.xml | 2 +- app/src/main/res/drawable/ic_play.xml | 2 +- app/src/main/res/drawable/ic_play_filled.xml | 2 +- app/src/main/res/drawable/ic_reddit.xml | 2 +- app/src/main/res/drawable/ic_repeat.xml | 2 +- app/src/main/res/drawable/ic_reset.xml | 2 +- .../main/res/drawable/ic_rotating_circle.xml | 2 +- .../main/res/drawable/ic_screen_rotation.xml | 2 +- app/src/main/res/drawable/ic_server.xml | 2 +- app/src/main/res/drawable/ic_share.xml | 2 +- app/src/main/res/drawable/ic_skip.xml | 2 +- app/src/main/res/drawable/ic_speed.xml | 2 +- app/src/main/res/drawable/ic_telegram.xml | 2 +- app/src/main/res/drawable/ic_theme.xml | 2 +- app/src/main/res/drawable/ic_three_dots.xml | 2 +- app/src/main/res/drawable/ic_time.xml | 2 +- .../main/res/drawable/ic_time_outlined.xml | 2 +- app/src/main/res/drawable/ic_trending.xml | 2 +- app/src/main/res/drawable/ic_twitter.xml | 2 +- app/src/main/res/drawable/ic_update.xml | 2 +- app/src/main/res/drawable/ic_upload.xml | 2 +- app/src/main/res/drawable/ic_videocam.xml | 2 +- app/src/main/res/drawable/ic_visibility.xml | 2 +- .../res/layout/channel_subscription_row.xml | 2 +- .../res/layout/fragment_subscriptions.xml | 34 +++++++--- app/src/main/res/values/array.xml | 18 +++++ app/src/main/res/values/strings.xml | 7 ++ 72 files changed, 181 insertions(+), 107 deletions(-) create mode 100644 app/src/main/res/drawable/ic_arrow_downward.xml diff --git a/app/src/main/java/com/github/libretube/adapters/PlaylistsAdapter.kt b/app/src/main/java/com/github/libretube/adapters/PlaylistsAdapter.kt index e405f51e9..fa43d0a16 100644 --- a/app/src/main/java/com/github/libretube/adapters/PlaylistsAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/PlaylistsAdapter.kt @@ -59,8 +59,7 @@ class PlaylistsAdapter( val token = PreferenceHelper.getToken() deletePlaylist(playlist.id!!, token, position) } - builder.setNegativeButton(R.string.cancel) { _, _ -> - } + builder.setNegativeButton(R.string.cancel, null) builder.show() } root.setOnClickListener { diff --git a/app/src/main/java/com/github/libretube/dialogs/RequireRestartDialog.kt b/app/src/main/java/com/github/libretube/dialogs/RequireRestartDialog.kt index 1030fe05b..f22b89980 100644 --- a/app/src/main/java/com/github/libretube/dialogs/RequireRestartDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/RequireRestartDialog.kt @@ -18,7 +18,7 @@ class RequireRestartDialog : DialogFragment() { activity?.recreate() ThemeHelper.restartMainActivity(requireContext()) } - .setNegativeButton(R.string.cancel) { _, _ -> } + .setNegativeButton(R.string.cancel, null) .create() } ?: throw IllegalStateException("Activity cannot be null") } diff --git a/app/src/main/java/com/github/libretube/dialogs/UpdateDialog.kt b/app/src/main/java/com/github/libretube/dialogs/UpdateDialog.kt index 3bed33348..4ddeceea7 100644 --- a/app/src/main/java/com/github/libretube/dialogs/UpdateDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/UpdateDialog.kt @@ -23,9 +23,7 @@ class UpdateDialog( MaterialAlertDialogBuilder(requireContext()) .setTitle(context?.getString(R.string.update_available, updateInfo.name)) .setMessage(context?.getString(R.string.update_now)) - .setNegativeButton(context?.getString(R.string.cancel)) { _, _ -> - dismiss() - } + .setNegativeButton(R.string.cancel, null) .setPositiveButton(context?.getString(R.string.okay)) { _, _ -> val downloadUrl = getDownloadUrl(updateInfo) Log.i("downloadUrl", downloadUrl.toString()) diff --git a/app/src/main/java/com/github/libretube/dialogs/VideoOptionsDialog.kt b/app/src/main/java/com/github/libretube/dialogs/VideoOptionsDialog.kt index a2cabca84..257bb8401 100644 --- a/app/src/main/java/com/github/libretube/dialogs/VideoOptionsDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/VideoOptionsDialog.kt @@ -33,9 +33,7 @@ class VideoOptionsDialog(private val videoId: String, context: Context) : Dialog */ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return MaterialAlertDialogBuilder(requireContext()) - .setNegativeButton(R.string.cancel) { dialog, _ -> - dialog.dismiss() - } + .setNegativeButton(R.string.cancel, null) .setAdapter( ArrayAdapter( requireContext(), diff --git a/app/src/main/java/com/github/libretube/fragments/SearchFragment.kt b/app/src/main/java/com/github/libretube/fragments/SearchFragment.kt index 0e6049259..c6edfd3c8 100644 --- a/app/src/main/java/com/github/libretube/fragments/SearchFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/SearchFragment.kt @@ -36,7 +36,6 @@ class SearchFragment : Fragment() { private val TAG = "SearchFragment" private lateinit var binding: FragmentSearchBinding - private var selectedFilter = 0 private var apiSearchFilter = "all" private var nextPage: String? = null @@ -62,8 +61,6 @@ class SearchFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - var tempSelectedItem = 0 - binding.clearSearchImageView.setOnClickListener { binding.autoCompleteTextView.text.clear() binding.historyRecycler.adapter = null @@ -84,14 +81,8 @@ class SearchFragment : Fragment() { MaterialAlertDialogBuilder(view.context) .setTitle(getString(R.string.choose_filter)) - .setSingleChoiceItems(filterOptions, selectedFilter) { _, id -> - tempSelectedItem = id - } - .setPositiveButton( - getString(R.string.okay) - ) { _, _ -> - selectedFilter = tempSelectedItem - apiSearchFilter = when (selectedFilter) { + .setItems(filterOptions) { _, id -> + apiSearchFilter = when (id) { 0 -> "all" 1 -> "videos" 2 -> "channels" @@ -105,7 +96,6 @@ class SearchFragment : Fragment() { fetchSearch(binding.autoCompleteTextView.text.toString()) } .setNegativeButton(getString(R.string.cancel), null) - .create() .show() } diff --git a/app/src/main/java/com/github/libretube/fragments/SubscriptionsFragment.kt b/app/src/main/java/com/github/libretube/fragments/SubscriptionsFragment.kt index feffc8524..2f73c3702 100644 --- a/app/src/main/java/com/github/libretube/fragments/SubscriptionsFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/SubscriptionsFragment.kt @@ -5,22 +5,22 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.ProgressBar import android.widget.Toast import androidx.core.view.isVisible import androidx.fragment.app.Fragment 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.adapters.SubscriptionChannelAdapter import com.github.libretube.adapters.TrendingAdapter import com.github.libretube.databinding.FragmentSubscriptionsBinding +import com.github.libretube.obj.StreamItem import com.github.libretube.preferences.PreferenceHelper import com.github.libretube.preferences.PreferenceKeys import com.github.libretube.util.RetrofitInstance import com.github.libretube.util.toID +import com.google.android.material.dialog.MaterialAlertDialogBuilder import retrofit2.HttpException import java.io.IOException @@ -31,6 +31,8 @@ class SubscriptionsFragment : Fragment() { lateinit var token: String private var isLoaded = false private var subscriptionAdapter: TrendingAdapter? = null + private var feed: List = listOf() + private var sortOrder = "most_recent" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -62,11 +64,15 @@ class SubscriptionsFragment : Fragment() { resources.getInteger(R.integer.grid_items).toString() ) binding.subFeed.layoutManager = GridLayoutManager(view.context, grid.toInt()) - fetchFeed(binding.subFeed, binding.subProgress) + fetchFeed() binding.subRefresh.setOnRefreshListener { - fetchChannels(binding.subChannels) - fetchFeed(binding.subFeed, binding.subProgress) + fetchChannels() + fetchFeed() + } + + binding.sortTV.setOnClickListener { + showSortDialog() } binding.toggleSubs.visibility = View.VISIBLE @@ -76,7 +82,7 @@ class SubscriptionsFragment : Fragment() { if (!binding.subChannelsContainer.isVisible) { if (!loadedSubbedChannels) { binding.subChannels.layoutManager = LinearLayoutManager(context) - fetchChannels(binding.subChannels) + fetchChannels() loadedSubbedChannels = true } binding.subChannelsContainer.visibility = View.VISIBLE @@ -102,13 +108,28 @@ class SubscriptionsFragment : Fragment() { } } else { binding.subRefresh.isEnabled = false + binding.subFeedContainer.visibility = View.GONE } } - private fun fetchFeed(feedRecView: RecyclerView, progressBar: ProgressBar) { + private fun showSortDialog() { + val sortOptions = resources.getStringArray(R.array.sortOptions) + val sortOptionValues = resources.getStringArray(R.array.sortOptionsValues) + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.sort) + .setItems(sortOptions) { _, index -> + binding.sortTV.text = sortOptions[index] + sortOrder = sortOptionValues[index] + showFeed() + } + .setNegativeButton(R.string.cancel, null) + .show() + } + + private fun fetchFeed() { fun run() { lifecycleScope.launchWhenCreated { - val response = try { + feed = try { RetrofitInstance.authApi.getFeed(token) } catch (e: IOException) { Log.e(TAG, e.toString()) @@ -120,9 +141,11 @@ class SubscriptionsFragment : Fragment() { } finally { binding.subRefresh.isRefreshing = false } - if (response.isNotEmpty()) { - subscriptionAdapter = TrendingAdapter(response, childFragmentManager, false) - feedRecView.adapter = subscriptionAdapter + if (feed.isNotEmpty()) { + // save the last recent video to the prefs for the notification worker + PreferenceHelper.setLatestVideoId(feed[0].url.toID()) + // show the feed + showFeed() } else { runOnUiThread { with(binding.boogh) { @@ -136,14 +159,29 @@ class SubscriptionsFragment : Fragment() { binding.loginOrRegister.visibility = View.VISIBLE } } - progressBar.visibility = View.GONE + binding.subProgress.visibility = View.GONE isLoaded = true } } run() } - private fun fetchChannels(channelRecView: RecyclerView) { + private fun showFeed() { + // sort the feed + val sortedFeed = when (sortOrder) { + "most_recent" -> feed + "least_recent" -> feed.reversed() + "most_views" -> feed.sortedBy { it.views }.reversed() + "least_views" -> feed.sortedBy { it.views } + "channel_name_az" -> feed.sortedBy { it.uploaderName } + "channel_name_za" -> feed.sortedBy { it.uploaderName }.reversed() + else -> feed + } + subscriptionAdapter = TrendingAdapter(sortedFeed, childFragmentManager, false) + binding.subFeed.adapter = subscriptionAdapter + } + + private fun fetchChannels() { fun run() { lifecycleScope.launchWhenCreated { val response = try { @@ -159,9 +197,7 @@ class SubscriptionsFragment : Fragment() { binding.subRefresh.isRefreshing = false } if (response.isNotEmpty()) { - // save the last recent video to the prefs for the notification worker - PreferenceHelper.setLatestVideoId(response[0].url.toID()) - channelRecView.adapter = SubscriptionChannelAdapter(response.toMutableList()) + binding.subChannels.adapter = SubscriptionChannelAdapter(response.toMutableList()) } else { Toast.makeText(context, R.string.subscribeIsEmpty, Toast.LENGTH_SHORT).show() } 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 557a6cd32..c481eaba1 100644 --- a/app/src/main/java/com/github/libretube/preferences/AdvancedSettings.kt +++ b/app/src/main/java/com/github/libretube/preferences/AdvancedSettings.kt @@ -27,7 +27,7 @@ class AdvancedSettings : PreferenceFragmentCompat() { MaterialAlertDialogBuilder(requireContext()) .setTitle(R.string.reset) .setMessage(R.string.reset_message) - .setNegativeButton(getString(R.string.cancel)) { _, _ -> } + .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.reset) { _, _ -> // clear default preferences PreferenceHelper.clearPreferences() diff --git a/app/src/main/java/com/github/libretube/preferences/HistorySettings.kt b/app/src/main/java/com/github/libretube/preferences/HistorySettings.kt index 885989ca7..969fed55e 100644 --- a/app/src/main/java/com/github/libretube/preferences/HistorySettings.kt +++ b/app/src/main/java/com/github/libretube/preferences/HistorySettings.kt @@ -41,7 +41,7 @@ class HistorySettings : PreferenceFragmentCompat() { MaterialAlertDialogBuilder(requireContext()) .setTitle(title) .setMessage(R.string.irreversible) - .setNegativeButton(getString(R.string.cancel)) { _, _ -> } + .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.okay) { _, _ -> // clear the selected preference preferences PreferenceHelper.removePreference(preferenceKey) diff --git a/app/src/main/res/drawable/ic_add_instance.xml b/app/src/main/res/drawable/ic_add_instance.xml index d5d34b102..334f007fa 100644 --- a/app/src/main/res/drawable/ic_add_instance.xml +++ b/app/src/main/res/drawable/ic_add_instance.xml @@ -1,7 +1,7 @@ + + diff --git a/app/src/main/res/drawable/ic_arrow_up_left.xml b/app/src/main/res/drawable/ic_arrow_up_left.xml index e5ed20662..20b455730 100644 --- a/app/src/main/res/drawable/ic_arrow_up_left.xml +++ b/app/src/main/res/drawable/ic_arrow_up_left.xml @@ -2,7 +2,7 @@ diff --git a/app/src/main/res/drawable/ic_open.xml b/app/src/main/res/drawable/ic_open.xml index 332a0f27a..a5f1c87be 100644 --- a/app/src/main/res/drawable/ic_open.xml +++ b/app/src/main/res/drawable/ic_open.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/ic_play.xml b/app/src/main/res/drawable/ic_play.xml index 6e5745be5..da896608b 100644 --- a/app/src/main/res/drawable/ic_play.xml +++ b/app/src/main/res/drawable/ic_play.xml @@ -1,7 +1,7 @@ + android:text="@string/unsubscribe" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_subscriptions.xml b/app/src/main/res/layout/fragment_subscriptions.xml index 31a707bc2..1ecc39cf8 100644 --- a/app/src/main/res/layout/fragment_subscriptions.xml +++ b/app/src/main/res/layout/fragment_subscriptions.xml @@ -109,19 +109,37 @@ - + android:layout_height="match_parent" + android:orientation="vertical"> - + + + android:layout_height="wrap_content" + android:descendantFocusability="blocksDescendants"> - + + + + + diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml index 56cfb59a0..d9dd4d565 100644 --- a/app/src/main/res/values/array.xml +++ b/app/src/main/res/values/array.xml @@ -778,4 +778,22 @@ 720 + + @string/most_recent + @string/least_recent + @string/most_views + @string/least_views + @string/channel_name_az + @string/channel_name_za + + + + most_recent + least_recent + most_views + least_views + channel_name_az + channel_name_za + + \ 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 16783b4b8..a350650cf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -273,4 +273,11 @@ New streams by %1$s … Are you sure? This can\'t be undone! History is empty. + Most recent + Least recent + Most views + Least views + Channel Name (A-Z) + Channel Name (Z-A) + Sort \ No newline at end of file