From 066a1e1f3a74217e9afa4d063e23352c6e017963 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sun, 2 Jan 2022 15:30:03 +0900 Subject: [PATCH] use WebView(!) as a js engine --- .idea/deploymentTargetDropDown.xml | 17 ----- app/build.gradle | 3 +- app/release/output-metadata.json | 2 +- .../quaver/pupil/ExampleInstrumentedTest.kt | 18 +++++ app/src/main/java/xyz/quaver/pupil/Pupil.kt | 19 ++++++ .../java/xyz/quaver/pupil/hitomi/common.kt | 65 ++++++++++++------- 6 files changed, 81 insertions(+), 43 deletions(-) delete mode 100644 .idea/deploymentTargetDropDown.xml diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml deleted file mode 100644 index 3fc4cd4b..00000000 --- a/.idea/deploymentTargetDropDown.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0fce33a3..8ca49503 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,7 +38,7 @@ android { minSdkVersion 16 targetSdkVersion 30 versionCode 69 - versionName "5.1.30" + versionName "5.1.32" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } @@ -126,7 +126,6 @@ dependencies { implementation "ru.noties.markwon:core:3.1.0" implementation "org.jsoup:jsoup:1.14.3" - implementation "com.github.seven332:quickjs-android:0.1.0" implementation "com.google.guava:guava:31.0.1-android" diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index fa3715d4..d2e45aa1 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -11,7 +11,7 @@ "type": "SINGLE", "filters": [], "versionCode": 69, - "versionName": "5.1.30", + "versionName": "5.1.32", "outputFile": "app-release.apk" } ] diff --git a/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt b/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt index b021026c..7ac7c415 100644 --- a/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt +++ b/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt @@ -20,8 +20,14 @@ package xyz.quaver.pupil +import android.util.Log +import android.webkit.WebView import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext import org.junit.Test import org.junit.runner.RunWith @@ -37,5 +43,17 @@ class ExampleInstrumentedTest { fun useAppContext() { // Context of the app under test. val appContext = InstrumentationRegistry.getInstrumentation().targetContext + + runBlocking { + MainScope().launch { + val webView = WebView(appContext).apply { + settings.javaScriptEnabled = true + } + webView.evaluateJavascript("3") { + Log.d("PUPILD", it) + } + Log.d("PUPILD", "SYNC?") + }.join() + } } } \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/Pupil.kt b/app/src/main/java/xyz/quaver/pupil/Pupil.kt index ef5cd391..68d17a61 100644 --- a/app/src/main/java/xyz/quaver/pupil/Pupil.kt +++ b/app/src/main/java/xyz/quaver/pupil/Pupil.kt @@ -18,6 +18,7 @@ package xyz.quaver.pupil +import android.annotation.SuppressLint import android.app.Application import android.app.Notification import android.app.NotificationChannel @@ -26,6 +27,7 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.os.Build +import android.webkit.WebView import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.ContextCompat import androidx.preference.PreferenceManager @@ -69,9 +71,26 @@ val client: OkHttpClient clientHolder = it } +@SuppressLint("StaticFieldLeak") +lateinit var webView: WebView + class Pupil : Application() { + companion object { + lateinit var instance: Pupil + private set + } + + @SuppressLint("SetJavaScriptEnabled") override fun onCreate() { + instance = this + + webView = WebView(this).apply { + settings.javaScriptEnabled = true + + loadData("""""", "text/html", null) + } + AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) preferences = PreferenceManager.getDefaultSharedPreferences(this) diff --git a/app/src/main/java/xyz/quaver/pupil/hitomi/common.kt b/app/src/main/java/xyz/quaver/pupil/hitomi/common.kt index b88b9e28..17d3cc01 100644 --- a/app/src/main/java/xyz/quaver/pupil/hitomi/common.kt +++ b/app/src/main/java/xyz/quaver/pupil/hitomi/common.kt @@ -16,15 +16,15 @@ package xyz.quaver.pupil.hitomi +import android.annotation.SuppressLint import android.util.Log -import com.hippo.quickjs.android.QuickJS -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock +import android.webkit.WebView +import android.webkit.WebViewClient +import kotlinx.coroutines.* import kotlinx.serialization.decodeFromString import xyz.quaver.json +import xyz.quaver.pupil.Pupil +import xyz.quaver.pupil.webView import xyz.quaver.readText import java.net.URL import java.nio.charset.Charset @@ -44,6 +44,7 @@ const val galleryblockextension = ".html" const val galleryblockdir = "galleryblock" const val nozomiextension = ".nozomi" +@SuppressLint("SetJavaScriptEnabled") interface gg { fun m(g: Int): Int val b: String @@ -55,33 +56,51 @@ interface gg { fun getInstance(): gg = instance ?: synchronized(this) { instance ?: object: gg { - private val ggjs by lazy { URL("https://ltn.hitomi.la/gg.js").readText(Charset.defaultCharset()) } - private val quickJS = QuickJS.Builder().build() + override fun m(g: Int): Int { + var result: Int? = null - override fun m(g: Int): Int = - quickJS.createJSRuntime().use { runtime -> - runtime.createJSContext().use { context -> - context.evaluate(ggjs, "gg.js") - context.evaluate("gg.m($g)", "gg.js", Int::class.java) + MainScope().launch { + while (webView.progress != 100) delay(100) + webView.evaluateJavascript("gg.m($g)") { + result = it.toInt() } } + while (result == null) Thread.sleep(100) + + return result!! + } + override val b: String - get() = - quickJS.createJSRuntime().use { runtime -> - runtime.createJSContext().use { context -> - context.evaluate(ggjs, "gg.js") - context.evaluate("gg.b", "gg.js", String::class.java) + get() { + var result: String? = null + + MainScope().launch { + while (webView.progress != 100) delay(100) + webView.evaluateJavascript("gg.b") { + result = it.replace("\"", "") } } - override fun s(h: String): String = - quickJS.createJSRuntime().use { runtime -> - runtime.createJSContext().use { context -> - context.evaluate(ggjs, "gg.js") - context.evaluate("gg.s('$h')", "gg.js", String::class.java) + while (result == null) Thread.sleep(100) + + return result!! + } + + override fun s(h: String): String { + var result: String? = null + + MainScope().launch { + while (webView.progress != 100) delay(100) + webView.evaluateJavascript("gg.s('$h')") { + result = it.replace("\"", "") } } + + while (result == null) Thread.sleep(100) + + return result!! + } }.also { instance = it } } }