mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +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