From f22417e7e7b01bd04c37eb2c3e57c4cfa273a6fe Mon Sep 17 00:00:00 2001 From: Carlos Melero <10256660+carmebar@users.noreply.github.com> Date: Fri, 24 Jun 2022 18:03:48 +0200 Subject: [PATCH 1/2] Add option to hide future videos in feed --- .../schabi/newpipe/local/feed/FeedFragment.kt | 16 +++++++ .../newpipe/local/feed/FeedViewModel.kt | 43 +++++++++++++++---- .../main/res/drawable/ic_history_future.xml | 15 +++++++ app/src/main/res/menu/menu_feed_fragment.xml | 11 ++++- app/src/main/res/values/settings_keys.xml | 1 + app/src/main/res/values/strings.xml | 1 + 6 files changed, 77 insertions(+), 10 deletions(-) create mode 100644 app/src/main/res/drawable/ic_history_future.xml diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index b291aa035..f0ebabd85 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -98,6 +98,7 @@ class FeedFragment : BaseStateFragment() { private lateinit var groupAdapter: GroupieAdapter @State @JvmField var showPlayedItems: Boolean = true + @State @JvmField var showFutureItems: Boolean = true private var onSettingsChangeListener: SharedPreferences.OnSharedPreferenceChangeListener? = null private var updateListViewModeOnResume = false @@ -137,6 +138,7 @@ class FeedFragment : BaseStateFragment() { val factory = FeedViewModel.Factory(requireContext(), groupId) viewModel = ViewModelProvider(this, factory).get(FeedViewModel::class.java) showPlayedItems = viewModel.getShowPlayedItemsFromPreferences() + showFutureItems = viewModel.getShowFutureItemsFromPreferences() viewModel.stateLiveData.observe(viewLifecycleOwner) { it?.let(::handleResult) } groupAdapter = GroupieAdapter().apply { @@ -212,6 +214,7 @@ class FeedFragment : BaseStateFragment() { inflater.inflate(R.menu.menu_feed_fragment, menu) updateTogglePlayedItemsButton(menu.findItem(R.id.menu_item_feed_toggle_played_items)) + updateToggleFutureItemsButton(menu.findItem(R.id.menu_item_feed_toggle_future_items)) } override fun onOptionsItemSelected(item: MenuItem): Boolean { @@ -241,6 +244,11 @@ class FeedFragment : BaseStateFragment() { updateTogglePlayedItemsButton(item) viewModel.togglePlayedItems(showPlayedItems) viewModel.saveShowPlayedItemsToPreferences(showPlayedItems) + } else if (item.itemId == R.id.menu_item_feed_toggle_future_items) { + showFutureItems = !item.isChecked + updateToggleFutureItemsButton(item) + viewModel.toggleFutureItems(showFutureItems) + viewModel.saveShowFutureItemsToPreferences(showFutureItems) } return super.onOptionsItemSelected(item) @@ -280,6 +288,14 @@ class FeedFragment : BaseStateFragment() { ) } + private fun updateToggleFutureItemsButton(menuItem: MenuItem) { + menuItem.isChecked = showFutureItems + menuItem.icon = AppCompatResources.getDrawable( + requireContext(), + if (showFutureItems) R.drawable.ic_history_future else R.drawable.ic_history + ) + } + // ////////////////////////////////////////////////////////////////////////// // Handling // ////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt index e21963c16..87409ddae 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt @@ -9,7 +9,7 @@ import androidx.lifecycle.ViewModelProvider import androidx.preference.PreferenceManager import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Flowable -import io.reactivex.rxjava3.functions.Function4 +import io.reactivex.rxjava3.functions.Function5 import io.reactivex.rxjava3.processors.BehaviorProcessor import io.reactivex.rxjava3.schedulers.Schedulers import org.schabi.newpipe.R @@ -28,7 +28,8 @@ import java.util.concurrent.TimeUnit class FeedViewModel( private val applicationContext: Context, groupId: Long = FeedGroupEntity.GROUP_ALL_ID, - initialShowPlayedItems: Boolean = true + initialShowPlayedItems: Boolean = true, + initialShowFutureItems: Boolean = true ) : ViewModel() { private var feedDatabaseManager: FeedDatabaseManager = FeedDatabaseManager(applicationContext) @@ -37,6 +38,11 @@ class FeedViewModel( .startWithItem(initialShowPlayedItems) .distinctUntilChanged() + private val toggleShowFutureItems = BehaviorProcessor.create() + private val toggleShowFutureItemsFlowable = toggleShowFutureItems + .startWithItem(initialShowFutureItems) + .distinctUntilChanged() + private val mutableStateLiveData = MutableLiveData() val stateLiveData: LiveData = mutableStateLiveData @@ -44,22 +50,24 @@ class FeedViewModel( .combineLatest( FeedEventManager.events(), toggleShowPlayedItemsFlowable, + toggleShowFutureItemsFlowable, feedDatabaseManager.notLoadedCount(groupId), feedDatabaseManager.oldestSubscriptionUpdate(groupId), - Function4 { t1: FeedEventManager.Event, t2: Boolean, - t3: Long, t4: List -> - return@Function4 CombineResultEventHolder(t1, t2, t3, t4.firstOrNull()) + Function5 { t1: FeedEventManager.Event, t2: Boolean, t3: Boolean, + t4: Long, t5: List -> + return@Function5 CombineResultEventHolder(t1, t2, t3, t4, t5.firstOrNull()) } ) .throttleLatest(DEFAULT_THROTTLE_TIMEOUT, TimeUnit.MILLISECONDS) .subscribeOn(Schedulers.io()) .observeOn(Schedulers.io()) - .map { (event, showPlayedItems, notLoadedCount, oldestUpdate) -> + .map { (event, showPlayedItems, showFutureItems, notLoadedCount, oldestUpdate) -> val streamItems = if (event is SuccessResultEvent || event is IdleEvent) feedDatabaseManager .getStreams(groupId, showPlayedItems) .blockingGet(arrayListOf()) + .filter { s -> showFutureItems || s.stream.uploadDate?.isBefore(OffsetDateTime.now()) ?: true } else arrayListOf() @@ -89,8 +97,9 @@ class FeedViewModel( private data class CombineResultEventHolder( val t1: FeedEventManager.Event, val t2: Boolean, - val t3: Long, - val t4: OffsetDateTime? + val t3: Boolean, + val t4: Long, + val t5: OffsetDateTime? ) private data class CombineResultDataHolder( @@ -112,10 +121,25 @@ class FeedViewModel( fun getShowPlayedItemsFromPreferences() = getShowPlayedItemsFromPreferences(applicationContext) + fun toggleFutureItems(showFutureItems: Boolean) { + toggleShowFutureItems.onNext(showFutureItems) + } + + fun saveShowFutureItemsToPreferences(showFutureItems: Boolean) = + PreferenceManager.getDefaultSharedPreferences(applicationContext).edit { + this.putBoolean(applicationContext.getString(R.string.feed_show_future_items_key), showFutureItems) + this.apply() + } + + fun getShowFutureItemsFromPreferences() = getShowFutureItemsFromPreferences(applicationContext) + companion object { private fun getShowPlayedItemsFromPreferences(context: Context) = PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(context.getString(R.string.feed_show_played_items_key), true) + private fun getShowFutureItemsFromPreferences(context: Context) = + PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.feed_show_future_items_key), true) } class Factory( @@ -128,7 +152,8 @@ class FeedViewModel( context.applicationContext, groupId, // Read initial value from preferences - getShowPlayedItemsFromPreferences(context.applicationContext) + getShowPlayedItemsFromPreferences(context.applicationContext), + getShowFutureItemsFromPreferences(context.applicationContext) ) as T } } diff --git a/app/src/main/res/drawable/ic_history_future.xml b/app/src/main/res/drawable/ic_history_future.xml new file mode 100644 index 000000000..db6f2acbf --- /dev/null +++ b/app/src/main/res/drawable/ic_history_future.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/menu/menu_feed_fragment.xml b/app/src/main/res/menu/menu_feed_fragment.xml index 7a948ea8a..f6929a914 100644 --- a/app/src/main/res/menu/menu_feed_fragment.xml +++ b/app/src/main/res/menu/menu_feed_fragment.xml @@ -4,13 +4,22 @@ + + feed_update_threshold_key 300 feed_show_played_items + feed_show_future_items show_thumbnail_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6a1c220f0..1d65b6fba 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -747,4 +747,5 @@ Select quality for external players Unknown format Unknown quality + Show future videos \ No newline at end of file From a392a06cc05f01e7012e6d6f660105d400087264 Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 13 Jul 2022 11:04:40 +0200 Subject: [PATCH 2/2] Fix feed menu items order in category to leave space for search The search menu item gets added in first place when the feed fragment is added as a tab to the main fragment. So the main fragment's menu items' orderInCategory should start from 2. --- app/src/main/res/menu/menu_feed_fragment.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/menu/menu_feed_fragment.xml b/app/src/main/res/menu/menu_feed_fragment.xml index f6929a914..775a2d979 100644 --- a/app/src/main/res/menu/menu_feed_fragment.xml +++ b/app/src/main/res/menu/menu_feed_fragment.xml @@ -4,7 +4,7 @@