Add intent filter for external queries

This commit is contained in:
inorichi 2019-04-12 18:40:04 +02:00
parent ba2194f435
commit 56195434e7
4 changed files with 57 additions and 7 deletions

View File

@ -33,6 +33,10 @@
<action android:name="com.google.android.gms.actions.SEARCH_ACTION"/> <action android:name="com.google.android.gms.actions.SEARCH_ACTION"/>
<category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.DEFAULT"/>
</intent-filter> </intent-filter>
<intent-filter>
<action android:name="eu.kanade.tachiyomi.SEARCH" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/>
<!--suppress AndroidDomInspection --> <!--suppress AndroidDomInspection -->
<meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts"/> <meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts"/>

View File

@ -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] * This controller should only handle UI actions, IO actions should be done by [CatalogueSearchPresenter]
* [CatalogueSearchCardAdapter.OnMangaClickListener] called when manga is clicked in global search * [CatalogueSearchCardAdapter.OnMangaClickListener] called when manga is clicked in global search
*/ */
open class CatalogueSearchController(protected val initialQuery: String? = null) : open class CatalogueSearchController(
NucleusController<CatalogueSearchPresenter>(), protected val initialQuery: String? = null,
protected val extensionFilter: String? = null
) : NucleusController<CatalogueSearchPresenter>(),
CatalogueSearchCardAdapter.OnMangaClickListener { CatalogueSearchCardAdapter.OnMangaClickListener {
/** /**
@ -60,7 +62,7 @@ open class CatalogueSearchController(protected val initialQuery: String? = null)
* @return instance of [CatalogueSearchPresenter] * @return instance of [CatalogueSearchPresenter]
*/ */
override fun createPresenter(): 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) getHolder(source)?.setImage(manga)
} }
} }

View File

@ -5,6 +5,7 @@ import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.getOrDefault import eu.kanade.tachiyomi.data.preference.getOrDefault
import eu.kanade.tachiyomi.extension.ExtensionManager
import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.CatalogueSource
import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.SourceManager
@ -21,6 +22,7 @@ import rx.subjects.PublishSubject
import timber.log.Timber import timber.log.Timber
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
/** /**
* Presenter of [CatalogueSearchController] * Presenter of [CatalogueSearchController]
@ -32,6 +34,7 @@ import uy.kohesive.injekt.api.get
*/ */
open class CatalogueSearchPresenter( open class CatalogueSearchPresenter(
val initialQuery: String? = "", val initialQuery: String? = "",
val initialExtensionFilter: String? = null,
val sourceManager: SourceManager = Injekt.get(), val sourceManager: SourceManager = Injekt.get(),
val db: DatabaseHelper = Injekt.get(), val db: DatabaseHelper = Injekt.get(),
val preferencesHelper: PreferencesHelper = Injekt.get() val preferencesHelper: PreferencesHelper = Injekt.get()
@ -40,7 +43,7 @@ open class CatalogueSearchPresenter(
/** /**
* Enabled sources. * Enabled sources.
*/ */
val sources by lazy { getEnabledSources() } val sources by lazy { getSourcesToQuery() }
/** /**
* Query from the view. * Query from the view.
@ -63,9 +66,16 @@ open class CatalogueSearchPresenter(
*/ */
private var fetchImageSubscription: Subscription? = null private var fetchImageSubscription: Subscription? = null
private val extensionManager by injectLazy<ExtensionManager>()
private var extensionFilter: String? = null
override fun onCreate(savedState: Bundle?) { override fun onCreate(savedState: Bundle?) {
super.onCreate(savedState) super.onCreate(savedState)
extensionFilter = savedState?.getString(CatalogueSearchPresenter::extensionFilter.name) ?:
initialExtensionFilter
// Perform a search with previous or initial state // Perform a search with previous or initial state
search(savedState?.getString(BrowseCataloguePresenter::query.name) ?: initialQuery.orEmpty()) search(savedState?.getString(BrowseCataloguePresenter::query.name) ?: initialQuery.orEmpty())
} }
@ -78,6 +88,7 @@ open class CatalogueSearchPresenter(
override fun onSave(state: Bundle) { override fun onSave(state: Bundle) {
state.putString(BrowseCataloguePresenter::query.name, query) state.putString(BrowseCataloguePresenter::query.name, query)
state.putString(CatalogueSearchPresenter::extensionFilter.name, extensionFilter)
super.onSave(state) super.onSave(state)
} }
@ -97,6 +108,26 @@ open class CatalogueSearchPresenter(
.sortedBy { "(${it.lang}) ${it.name}" } .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 * Creates a catalogue search item
*/ */

View File

@ -164,12 +164,21 @@ class MainActivity : BaseActivity() {
//If the intent match the "standard" Android search intent //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) // 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. //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()) 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 else -> return false
} }
return true return true
@ -254,6 +263,10 @@ class MainActivity : BaseActivity() {
const val SHORTCUT_CATALOGUES = "eu.kanade.tachiyomi.SHOW_CATALOGUES" const val SHORTCUT_CATALOGUES = "eu.kanade.tachiyomi.SHOW_CATALOGUES"
const val SHORTCUT_DOWNLOADS = "eu.kanade.tachiyomi.SHOW_DOWNLOADS" const val SHORTCUT_DOWNLOADS = "eu.kanade.tachiyomi.SHOW_DOWNLOADS"
const val SHORTCUT_MANGA = "eu.kanade.tachiyomi.SHOW_MANGA" 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"
} }
} }