From bcfa3cff77c74858703a850f500e04d64fe6d127 Mon Sep 17 00:00:00 2001 From: Blatzar <46196380+Blatzar@users.noreply.github.com> Date: Sat, 13 Aug 2022 23:49:16 +0200 Subject: [PATCH] Add tv type support --- .../cloudstream3/plugins/PluginManager.kt | 1 + .../cloudstream3/plugins/RepositoryManager.kt | 2 +- .../ui/settings/extensions/PluginsFragment.kt | 55 ++++++- .../settings/extensions/PluginsViewModel.kt | 50 +++++-- app/src/main/res/layout/fragment_plugins.xml | 137 ++++++++++++++---- .../main/res/layout/home_select_mainpage.xml | 2 + 6 files changed, 203 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt b/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt index 99df22ad..fa05f0ab 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt @@ -56,6 +56,7 @@ data class PluginData( null, null, null, + null, null ) } diff --git a/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt b/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt index 5b516a00..8a6e4743 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt @@ -57,7 +57,7 @@ data class SitePlugin( // Might be used to go directly to the plugin repo in the future @JsonProperty("repositoryUrl") val repositoryUrl: String?, // These types are yet to be mapped and used, ignore for now -// @JsonProperty("tvTypes") val tvTypes: List?, + @JsonProperty("tvTypes") val tvTypes: List?, @JsonProperty("language") val language: String?, @JsonProperty("iconUrl") val iconUrl: String?, // Set to true to get an 18+ symbol next to the plugin diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt index 79c6a9d2..fcea6a5d 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt @@ -3,10 +3,12 @@ package com.lagradost.cloudstream3.ui.settings.extensions import android.content.Context import android.os.Bundle import android.view.* +import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.mvvm.observe +import com.lagradost.cloudstream3.ui.home.HomeFragment.Companion.getPairList import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar import kotlinx.android.synthetic.main.fragment_plugins.* @@ -55,7 +57,7 @@ class PluginsFragment : Fragment() { // Don't go back if active query settings_toolbar?.setNavigationOnClickListener { if (searchView?.isIconified == false) { - searchView?.isIconified = true + searchView.isIconified = true } else { activity?.onBackPressed() } @@ -88,7 +90,7 @@ class PluginsFragment : Fragment() { pluginViewModel.handlePluginAction(activity, url, it, isLocal) } - observe(pluginViewModel.plugins) { + observe(pluginViewModel.filteredPlugins) { (plugin_recycler_view?.adapter as? PluginAdapter?)?.updateList(it) plugin_recycler_view?.scrollToPosition(0) } @@ -100,6 +102,55 @@ class PluginsFragment : Fragment() { } else { pluginViewModel.updatePluginList(url) } + + // 💀💀💀💀💀💀💀 Recyclerview when + val pairList = getPairList( + home_select_anime, + home_select_cartoons, + home_select_tv_series, + home_select_documentaries, + home_select_movies, + home_select_asian, + home_select_livestreams + ) + + // Copy pasted code + for ((button, validTypes) in pairList) { + val validTypesMapped = validTypes.map { it.name } + val isValid = + true //validAPIs.any { api -> validTypes.any { api.supportedTypes.contains(it) } } + button?.isVisible = isValid + if (isValid) { + fun buttonContains(): Boolean { + return pluginViewModel.tvTypes.any { validTypesMapped.contains(it) } + } + + button?.isSelected = buttonContains() + button?.setOnClickListener { + pluginViewModel.tvTypes.clear() + pluginViewModel.tvTypes.addAll(validTypesMapped) + for ((otherButton, _) in pairList) { + otherButton?.isSelected = false + } + button.isSelected = true + pluginViewModel.updateFilteredPlugins() + } + + button?.setOnLongClickListener { + if (!buttonContains()) { + button.isSelected = true + pluginViewModel.tvTypes.addAll(validTypesMapped) + } else { + button.isSelected = false + pluginViewModel.tvTypes.removeAll(validTypesMapped) + } + pluginViewModel.updateFilteredPlugins() + return@setOnLongClickListener true + } + } + } + + } companion object { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsViewModel.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsViewModel.kt index cc5295c5..c4bdfb3e 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsViewModel.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsViewModel.kt @@ -24,8 +24,15 @@ import me.xdrop.fuzzywuzzy.FuzzySearch typealias Plugin = Pair class PluginsViewModel : ViewModel() { - private val _plugins = MutableLiveData>() - val plugins: LiveData> = _plugins + /** plugins is an unaltered list of plugins */ + private var plugins: List = emptyList() + + /** filteredPlugins is a subset of plugins following the current search query and tv type selection */ + private var _filteredPlugins = MutableLiveData>() + var filteredPlugins: LiveData> = _filteredPlugins + + val tvTypes = mutableListOf() + private var currentQuery: String? = null companion object { private val repositoryCache: MutableMap> = mutableMapOf() @@ -161,7 +168,27 @@ class PluginsViewModel : ViewModel() { PluginViewData(plugin, isDownloaded(plugin, stored)) } - _plugins.postValue(list) + this.plugins = list + _filteredPlugins.postValue(list.filterTvTypes().sortByQuery(currentQuery)) + } + + // Perhaps can be optimized? + private fun List.filterTvTypes(): List { + if (tvTypes.isEmpty()) return this + return this.filter { it.plugin.second.tvTypes?.any { type -> tvTypes.contains(type) } == true } + } + + private fun List.sortByQuery(query: String?): List { + return if (query == null) { + // Return list to base state if no query + this.sortedBy { it.plugin.second.name } + } else { + this.sortedBy { -FuzzySearch.ratio(it.plugin.second.name, query) } + } + } + + fun updateFilteredPlugins() { + _filteredPlugins.postValue(plugins.filterTvTypes().sortByQuery(currentQuery)) } fun updatePluginList(repositoryUrl: String) = viewModelScope.launch { @@ -170,20 +197,10 @@ class PluginsViewModel : ViewModel() { } fun search(query: String?) { - val currentPlugins = plugins.value ?: return - - // Return list to base state if no query - val newValue = if (query == null) { - currentPlugins.sortedBy { it.plugin.second.name } - } else { - currentPlugins.sortedBy { - -FuzzySearch.ratio(it.plugin.second.name, query) - } - } - _plugins.postValue(newValue) + currentQuery = query + _filteredPlugins.postValue(filteredPlugins.value?.sortByQuery(query)) } - /** * Update the list but only with the local data. Used for file management. * */ @@ -196,6 +213,7 @@ class PluginsViewModel : ViewModel() { PluginViewData("" to it.toSitePlugin(), true) } - _plugins.postValue(downloadedPlugins) + plugins = downloadedPlugins + _filteredPlugins.postValue(downloadedPlugins.filterTvTypes().sortByQuery(currentQuery)) } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_plugins.xml b/app/src/main/res/layout/fragment_plugins.xml index 69702c57..fc56f8fe 100644 --- a/app/src/main/res/layout/fragment_plugins.xml +++ b/app/src/main/res/layout/fragment_plugins.xml @@ -1,38 +1,125 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/extensions_root" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@android:color/transparent"> + android:id="@+id/settings_toolbar" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?attr/primaryGrayBackground" + android:paddingTop="@dimen/navbar_height" + app:layout_scrollFlags="scroll|enterAlways" + app:menu="@menu/repository" + app:navigationIconTint="?attr/iconColor" + app:titleTextColor="?attr/textColor" + tools:title="Overlord" /> + + + + + + + + + + + + + + + + + + + + + + + + + android:id="@+id/plugin_recycler_view" + android:layout_width="match_parent" + android:layout_height="match_parent" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + app:layout_behavior="@string/appbar_scrolling_view_behavior" + tools:listitem="@layout/repository_item" /> diff --git a/app/src/main/res/layout/home_select_mainpage.xml b/app/src/main/res/layout/home_select_mainpage.xml index f39cbfec..99ee4fe2 100644 --- a/app/src/main/res/layout/home_select_mainpage.xml +++ b/app/src/main/res/layout/home_select_mainpage.xml @@ -31,6 +31,8 @@ android:paddingEnd="10dp" android:requiresFadingEdge="horizontal"> + +