Improved search speed
This commit is contained in:
@@ -34,6 +34,7 @@ import android.widget.Toast
|
||||
import androidx.appcompat.app.AppCompatDelegate
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.facebook.imagepipeline.backends.okhttp3.OkHttpImagePipelineConfigFactory
|
||||
import com.github.piasy.biv.BigImageViewer
|
||||
import com.github.piasy.biv.loader.fresco.FrescoImageLoader
|
||||
import com.google.android.gms.common.GooglePlayServicesNotAvailableException
|
||||
@@ -79,15 +80,10 @@ val client: OkHttpClient
|
||||
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
lateinit var webView: WebView
|
||||
val _webViewFlow = MutableSharedFlow<Pair<String, String?>>(
|
||||
extraBufferCapacity = 2,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
val _webViewFlow = MutableSharedFlow<Pair<String, String?>>()
|
||||
val webViewFlow = _webViewFlow.asSharedFlow()
|
||||
var webViewReady = false
|
||||
private set
|
||||
var webViewFailed = false
|
||||
private set
|
||||
private var reloadJob: Job? = null
|
||||
|
||||
fun reloadWebView() {
|
||||
@@ -203,11 +199,15 @@ class Pupil : Application() {
|
||||
addJavascriptInterface(object {
|
||||
@JavascriptInterface
|
||||
fun onResult(uid: String, result: String) {
|
||||
_webViewFlow.tryEmit(uid to result)
|
||||
CoroutineScope(Dispatchers.Unconfined).launch {
|
||||
_webViewFlow.emit(uid to result)
|
||||
}
|
||||
}
|
||||
@JavascriptInterface
|
||||
fun onError(uid: String, message: String) {
|
||||
_webViewFlow.tryEmit(uid to null)
|
||||
CoroutineScope(Dispatchers.Unconfined).launch {
|
||||
_webViewFlow.emit(uid to null)
|
||||
}
|
||||
Toast.makeText(this@Pupil, message, Toast.LENGTH_LONG).show()
|
||||
FirebaseCrashlytics.getInstance().recordException(
|
||||
Exception(message)
|
||||
@@ -238,6 +238,7 @@ class Pupil : Application() {
|
||||
.addInterceptor { chain ->
|
||||
val request = chain.request().newBuilder()
|
||||
.header("User-Agent", userAgent)
|
||||
.header("Referer", "https://hitomi.la/")
|
||||
.build()
|
||||
|
||||
val tag = request.tag() ?: return@addInterceptor chain.proceed(request)
|
||||
@@ -291,7 +292,14 @@ class Pupil : Application() {
|
||||
e.printStackTrace()
|
||||
}
|
||||
|
||||
BigImageViewer.initialize(FrescoImageLoader.with(this))
|
||||
BigImageViewer.initialize(
|
||||
FrescoImageLoader.with(
|
||||
this,
|
||||
OkHttpImagePipelineConfigFactory
|
||||
.newBuilder(this, client)
|
||||
.build()
|
||||
)
|
||||
)
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||
|
||||
@@ -77,8 +77,6 @@ suspend fun WebView.evaluatePromise(
|
||||
|
||||
val uid = UUID.randomUUID().toString()
|
||||
|
||||
evaluateJavascript((script + then).replace("%uid", "'$uid'"), null)
|
||||
|
||||
val flow: Flow<Pair<String, String?>> = webViewFlow.transformWhile { (currentUid, result) ->
|
||||
if (currentUid == uid) {
|
||||
emit(currentUid to result)
|
||||
@@ -86,6 +84,10 @@ suspend fun WebView.evaluatePromise(
|
||||
currentUid != uid
|
||||
}
|
||||
|
||||
launch {
|
||||
evaluateJavascript((script + then).replace("%uid", "'$uid'"), null)
|
||||
}
|
||||
|
||||
flow.first().second
|
||||
}
|
||||
} catch (e: CancellationException) {
|
||||
@@ -100,7 +102,7 @@ suspend fun WebView.evaluatePromise(
|
||||
suspend fun getGalleryInfo(galleryID: Int): GalleryInfo {
|
||||
val result = webView.evaluatePromise("get_gallery_info($galleryID)")
|
||||
|
||||
return json.decodeFromString(result!!)
|
||||
return json.decodeFromString(result)
|
||||
}
|
||||
|
||||
//common.js
|
||||
|
||||
@@ -52,7 +52,7 @@ suspend fun getGalleryBlock(galleryID: Int) : GalleryBlock {
|
||||
});
|
||||
""".trimIndent(),
|
||||
then = ""
|
||||
)!!
|
||||
)
|
||||
|
||||
val doc = Jsoup.parse(html)
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package xyz.quaver.pupil.hitomi
|
||||
|
||||
import android.util.Log
|
||||
import kotlinx.coroutines.*
|
||||
import java.util.*
|
||||
|
||||
@@ -47,7 +48,7 @@ suspend fun doSearch(query: String, sortByPopularity: Boolean = false) : Set<Int
|
||||
}
|
||||
}
|
||||
|
||||
val negativeResults = negativeTerms.map {
|
||||
val negativeResults = negativeTerms.mapIndexed { index, it ->
|
||||
async {
|
||||
runCatching {
|
||||
getGalleryIDsForQuery(it)
|
||||
@@ -55,21 +56,21 @@ suspend fun doSearch(query: String, sortByPopularity: Boolean = false) : Set<Int
|
||||
}
|
||||
}
|
||||
|
||||
var results = when {
|
||||
val results = when {
|
||||
sortByPopularity -> getGalleryIDsFromNozomi(null, "popular", "all")
|
||||
positiveTerms.isEmpty() -> getGalleryIDsFromNozomi(null, "index", "all")
|
||||
else -> emptySet()
|
||||
}
|
||||
}.toMutableSet()
|
||||
|
||||
fun filterPositive(newResults: Set<Int>) {
|
||||
results = when {
|
||||
results.isEmpty() -> newResults
|
||||
else -> results intersect newResults
|
||||
when {
|
||||
results.isEmpty() -> results.addAll(newResults)
|
||||
else -> results.retainAll(newResults)
|
||||
}
|
||||
}
|
||||
|
||||
fun filterNegative(newResults: Set<Int>) {
|
||||
results = results subtract newResults
|
||||
results.removeAll(newResults)
|
||||
}
|
||||
|
||||
//positive results
|
||||
@@ -78,7 +79,7 @@ suspend fun doSearch(query: String, sortByPopularity: Boolean = false) : Set<Int
|
||||
}
|
||||
|
||||
//negative results
|
||||
negativeResults.forEach {
|
||||
negativeResults.forEachIndexed { index, it ->
|
||||
filterNegative(it.await())
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ const val extension = ".html"
|
||||
|
||||
@OptIn(ExperimentalSerializationApi::class)
|
||||
suspend fun getGalleryIDsForQuery(query: String) : Set<Int> {
|
||||
val result = webView.evaluatePromise("get_galleryids_for_query('$query')") ?: return emptySet()
|
||||
val result = webView.evaluatePromise("get_galleryids_for_query('$query')")
|
||||
|
||||
return Json.decodeFromString(result)
|
||||
}
|
||||
@@ -37,7 +37,7 @@ data class Suggestion(val s: String, val t: Int, val u: String, val n: String)
|
||||
|
||||
@OptIn(ExperimentalSerializationApi::class)
|
||||
suspend fun getSuggestionsForQuery(query: String) : List<Suggestion> {
|
||||
val result = webView.evaluatePromise("get_suggestions_for_query('$query')") ?: return emptyList()
|
||||
val result = webView.evaluatePromise("get_suggestions_for_query('$query')")
|
||||
|
||||
return Json.decodeFromString<List<List<Suggestion>?>>(result)[0] ?: return emptyList()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user