mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-30 22:07:57 +01:00 
			
		
		
		
	Add intent filter for external queries
This commit is contained in:
		| @@ -18,8 +18,10 @@ import kotlinx.android.synthetic.main.catalogue_global_search_controller.* | ||||
|  * This controller should only handle UI actions, IO actions should be done by [CatalogueSearchPresenter] | ||||
|  * [CatalogueSearchCardAdapter.OnMangaClickListener] called when manga is clicked in global search | ||||
|  */ | ||||
| open class CatalogueSearchController(protected val initialQuery: String? = null) : | ||||
|         NucleusController<CatalogueSearchPresenter>(), | ||||
| open class CatalogueSearchController( | ||||
|         protected val initialQuery: String? = null, | ||||
|         protected val extensionFilter: String? = null | ||||
| ) : NucleusController<CatalogueSearchPresenter>(), | ||||
|         CatalogueSearchCardAdapter.OnMangaClickListener { | ||||
|  | ||||
|     /** | ||||
| @@ -60,7 +62,7 @@ open class CatalogueSearchController(protected val initialQuery: String? = null) | ||||
|      * @return instance of [CatalogueSearchPresenter] | ||||
|      */ | ||||
|     override fun createPresenter(): CatalogueSearchPresenter { | ||||
|         return CatalogueSearchPresenter(initialQuery) | ||||
|         return CatalogueSearchPresenter(initialQuery, extensionFilter) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -185,4 +187,4 @@ open class CatalogueSearchController(protected val initialQuery: String? = null) | ||||
|         getHolder(source)?.setImage(manga) | ||||
|     } | ||||
|  | ||||
| } | ||||
| } | ||||
|   | ||||
| @@ -5,6 +5,7 @@ import eu.kanade.tachiyomi.data.database.DatabaseHelper | ||||
| import eu.kanade.tachiyomi.data.database.models.Manga | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.data.preference.getOrDefault | ||||
| import eu.kanade.tachiyomi.extension.ExtensionManager | ||||
| import eu.kanade.tachiyomi.source.CatalogueSource | ||||
| import eu.kanade.tachiyomi.source.Source | ||||
| import eu.kanade.tachiyomi.source.SourceManager | ||||
| @@ -21,6 +22,7 @@ import rx.subjects.PublishSubject | ||||
| import timber.log.Timber | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import uy.kohesive.injekt.injectLazy | ||||
|  | ||||
| /** | ||||
|  * Presenter of [CatalogueSearchController] | ||||
| @@ -32,6 +34,7 @@ import uy.kohesive.injekt.api.get | ||||
|  */ | ||||
| open class CatalogueSearchPresenter( | ||||
|         val initialQuery: String? = "", | ||||
|         val initialExtensionFilter: String? = null, | ||||
|         val sourceManager: SourceManager = Injekt.get(), | ||||
|         val db: DatabaseHelper = Injekt.get(), | ||||
|         val preferencesHelper: PreferencesHelper = Injekt.get() | ||||
| @@ -40,7 +43,7 @@ open class CatalogueSearchPresenter( | ||||
|     /** | ||||
|      * Enabled sources. | ||||
|      */ | ||||
|     val sources by lazy { getEnabledSources() } | ||||
|     val sources by lazy { getSourcesToQuery() } | ||||
|  | ||||
|     /** | ||||
|      * Query from the view. | ||||
| @@ -63,9 +66,16 @@ open class CatalogueSearchPresenter( | ||||
|      */ | ||||
|     private var fetchImageSubscription: Subscription? = null | ||||
|  | ||||
|     private val extensionManager by injectLazy<ExtensionManager>() | ||||
|  | ||||
|     private var extensionFilter: String? = null | ||||
|  | ||||
|     override fun onCreate(savedState: Bundle?) { | ||||
|         super.onCreate(savedState) | ||||
|  | ||||
|         extensionFilter = savedState?.getString(CatalogueSearchPresenter::extensionFilter.name) ?: | ||||
|                           initialExtensionFilter | ||||
|  | ||||
|         // Perform a search with previous or initial state | ||||
|         search(savedState?.getString(BrowseCataloguePresenter::query.name) ?: initialQuery.orEmpty()) | ||||
|     } | ||||
| @@ -78,6 +88,7 @@ open class CatalogueSearchPresenter( | ||||
|  | ||||
|     override fun onSave(state: Bundle) { | ||||
|         state.putString(BrowseCataloguePresenter::query.name, query) | ||||
|         state.putString(CatalogueSearchPresenter::extensionFilter.name, extensionFilter) | ||||
|         super.onSave(state) | ||||
|     } | ||||
|  | ||||
| @@ -97,6 +108,26 @@ open class CatalogueSearchPresenter( | ||||
|                 .sortedBy { "(${it.lang}) ${it.name}" } | ||||
|     } | ||||
|  | ||||
|     private fun getSourcesToQuery(): List<CatalogueSource> { | ||||
|         val filter = extensionFilter | ||||
|         val enabledSources = getEnabledSources() | ||||
|         if (filter.isNullOrEmpty()) { | ||||
|             return enabledSources | ||||
|         } | ||||
|  | ||||
|         val filterSources = extensionManager.installedExtensions | ||||
|             .filter { it.pkgName == filter } | ||||
|             .flatMap { it.sources } | ||||
|             .filter { it in enabledSources } | ||||
|             .filterIsInstance<CatalogueSource>() | ||||
|  | ||||
|         if (filterSources.isEmpty()) { | ||||
|             return enabledSources | ||||
|         } | ||||
|  | ||||
|         return filterSources | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Creates a catalogue search item | ||||
|      */ | ||||
|   | ||||
| @@ -164,12 +164,21 @@ class MainActivity : BaseActivity() { | ||||
|                 //If the intent match the "standard" Android search intent | ||||
|                 // or the Google-specific search intent (triggered by saying or typing "search *query* on *Tachiyomi*" in Google Search/Google Assistant) | ||||
|  | ||||
|                 setSelectedDrawerItem(R.id.nav_drawer_catalogues) | ||||
|                 //Get the search query provided in extras, and if not null, perform a global search with it. | ||||
|                 intent.getStringExtra(SearchManager.QUERY)?.also { query -> | ||||
|                 val query = intent.getStringExtra(SearchManager.QUERY) | ||||
|                 if (query != null && !query.isEmpty()) { | ||||
|                     setSelectedDrawerItem(R.id.nav_drawer_catalogues) | ||||
|                     router.pushController(CatalogueSearchController(query).withFadeTransaction()) | ||||
|                 } | ||||
|             } | ||||
|             INTENT_SEARCH -> { | ||||
|                 val query = intent.getStringExtra(INTENT_SEARCH_QUERY) | ||||
|                 val filter = intent.getStringExtra(INTENT_SEARCH_FILTER) | ||||
|                 if (query != null && !query.isEmpty()) { | ||||
|                     setSelectedDrawerItem(R.id.nav_drawer_catalogues) | ||||
|                     router.pushController(CatalogueSearchController(query, filter).withFadeTransaction()) | ||||
|                 } | ||||
|             } | ||||
|             else -> return false | ||||
|         } | ||||
|         return true | ||||
| @@ -254,6 +263,10 @@ class MainActivity : BaseActivity() { | ||||
|         const val SHORTCUT_CATALOGUES = "eu.kanade.tachiyomi.SHOW_CATALOGUES" | ||||
|         const val SHORTCUT_DOWNLOADS = "eu.kanade.tachiyomi.SHOW_DOWNLOADS" | ||||
|         const val SHORTCUT_MANGA = "eu.kanade.tachiyomi.SHOW_MANGA" | ||||
|  | ||||
|         const val INTENT_SEARCH = "eu.kanade.tachiyomi.SEARCH" | ||||
|         const val INTENT_SEARCH_QUERY = "query" | ||||
|         const val INTENT_SEARCH_FILTER = "filter" | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user