From b7a11048f0241cb27244c1e70c47e808b9162b70 Mon Sep 17 00:00:00 2001 From: Blatzar <46196380+Blatzar@users.noreply.github.com> Date: Sat, 13 Aug 2022 05:53:35 +0200 Subject: [PATCH] Add search button --- app/build.gradle | 15 ++++-- .../ui/settings/extensions/PluginsFragment.kt | 48 ++++++++++++++++++- .../settings/extensions/PluginsViewModel.kt | 15 ++++++ app/src/main/res/menu/repository.xml | 17 +++++-- 4 files changed, 83 insertions(+), 12 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 875361ed..4f8a047e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -100,7 +100,9 @@ dependencies { implementation 'androidx.core:core-ktx:1.8.0' implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'com.google.android.material:material:1.5.0' // dont change this to 1.6.0 it looks ugly af + + // dont change this to 1.6.0 it looks ugly af + implementation 'com.google.android.material:material:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.navigation:navigation-fragment-ktx:2.5.1' implementation 'androidx.navigation:navigation-ui-ktx:2.5.1' @@ -187,6 +189,8 @@ dependencies { implementation 'com.github.TeamNewPipe:NewPipeExtractor:master-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' + // Library/extensions searching with Levenshtein distance + implementation 'me.xdrop:fuzzywuzzy:1.4.0' } task androidSourcesJar(type: Jar) { @@ -195,8 +199,9 @@ task androidSourcesJar(type: Jar) { } task makeJar(type: Copy) { - from('build/intermediates/compile_app_classes_jar/debug') // after modifying here, you can export. Jar - into('build') // output location - include('classes.jar') // the classes file of the imported rack package - dependsOn build + // after modifying here, you can export. Jar + from('build/intermediates/compile_app_classes_jar/debug') + into('build') // output location + include('classes.jar') // the classes file of the imported rack package + dependsOn build } \ No newline at end of file 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 02eace5a..79c6a9d2 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 @@ -1,8 +1,8 @@ package com.lagradost.cloudstream3.ui.settings.extensions +import android.content.Context import android.os.Bundle import android.view.* -import androidx.appcompat.view.menu.MenuBuilder import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import com.lagradost.cloudstream3.R @@ -49,6 +49,40 @@ class PluginsFragment : Fragment() { return@setOnMenuItemClickListener true } + val searchView = + settings_toolbar?.menu?.findItem(R.id.search_button)?.actionView as? RepoSearchView + + // Don't go back if active query + settings_toolbar?.setNavigationOnClickListener { + if (searchView?.isIconified == false) { + searchView?.isIconified = true + } else { + activity?.onBackPressed() + } + } + +// searchView?.onActionViewCollapsed = { +// pluginViewModel.search(null) +// } + + // Because onActionViewCollapsed doesn't wanna work we need this workaround :( + searchView?.setOnQueryTextFocusChangeListener { _, hasFocus -> + if (!hasFocus) pluginViewModel.search(null) + } + + searchView?.setOnQueryTextListener(object : android.widget.SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String?): Boolean { + pluginViewModel.search(query) + return true + } + + override fun onQueryTextChange(newText: String?): Boolean { + pluginViewModel.search(newText) + return true + } + }) + + plugin_recycler_view?.adapter = PluginAdapter { pluginViewModel.handlePluginAction(activity, url, it, isLocal) @@ -56,11 +90,12 @@ class PluginsFragment : Fragment() { observe(pluginViewModel.plugins) { (plugin_recycler_view?.adapter as? PluginAdapter?)?.updateList(it) + plugin_recycler_view?.scrollToPosition(0) } if (isLocal) { // No download button - settings_toolbar?.menu?.clear() + settings_toolbar?.menu?.findItem(R.id.download_all)?.isVisible = false pluginViewModel.updatePluginListLocal() } else { pluginViewModel.updatePluginList(url) @@ -75,5 +110,14 @@ class PluginsFragment : Fragment() { putBoolean(PLUGINS_BUNDLE_LOCAL, isLocal) } } + + class RepoSearchView(context: Context) : android.widget.SearchView(context) { +// var onActionViewCollapsed = {} +// +// override fun onActionViewCollapsed() { +// onActionViewCollapsed() +// } + } + } } \ No newline at end of file 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 17cf527c..cc5295c5 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 @@ -19,6 +19,7 @@ import com.lagradost.cloudstream3.utils.Coroutines.ioSafe import com.lagradost.cloudstream3.utils.Coroutines.main import com.lagradost.cloudstream3.utils.Coroutines.runOnMainThread import kotlinx.coroutines.launch +import me.xdrop.fuzzywuzzy.FuzzySearch typealias Plugin = Pair @@ -168,6 +169,20 @@ class PluginsViewModel : ViewModel() { updatePluginListPrivate(repositoryUrl) } + 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) + } + /** * Update the list but only with the local data. Used for file management. diff --git a/app/src/main/res/menu/repository.xml b/app/src/main/res/menu/repository.xml index e108c005..5f4555d7 100644 --- a/app/src/main/res/menu/repository.xml +++ b/app/src/main/res/menu/repository.xml @@ -1,9 +1,16 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> + android:id="@+id/search_button" + android:icon="@drawable/search_icon" + android:title="@string/title_search" + app:actionViewClass="com.lagradost.cloudstream3.ui.settings.extensions.PluginsFragment$Companion$RepoSearchView" + app:searchHintIcon="@drawable/search_icon" + app:showAsAction="ifRoom" /> + \ No newline at end of file