Эх сурвалжийг харах

Add intent filter for external queries

inorichi 6 жил өмнө
parent
commit
56195434e7

+ 4 - 0
app/src/main/AndroidManifest.xml

@@ -33,6 +33,10 @@
                 <action android:name="com.google.android.gms.actions.SEARCH_ACTION"/>
                 <category android:name="android.intent.category.DEFAULT"/>
             </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"/>
             <!--suppress AndroidDomInspection -->
             <meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts"/>

+ 6 - 4
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchController.kt

@@ -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)
     }
 
-}
+}

+ 32 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchPresenter.kt

@@ -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
      */

+ 15 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt

@@ -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"
     }
 
 }