From ac0cff62d4aea47f11335f97e1d0f76a29e4f254 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Tue, 25 Jan 2022 04:28:04 +0900 Subject: [PATCH] Ask user to update WebView when es2020 is not supported --- .idea/deploymentTargetDropDown.xml | 8 ++-- .idea/misc.xml | 1 + app/build.gradle | 3 +- app/release/output-metadata.json | 2 +- app/src/main/java/xyz/quaver/pupil/Pupil.kt | 22 +++++++++- .../java/xyz/quaver/pupil/hitomi/common.kt | 18 ++++---- .../java/xyz/quaver/pupil/ui/MainActivity.kt | 41 ++++++++++++++++++- app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-ko/strings.xml | 1 + app/src/main/res/values/strings.xml | 2 + 10 files changed, 81 insertions(+), 18 deletions(-) diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index bde666e6..667849dd 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -1,9 +1,9 @@ - + - + @@ -11,7 +11,7 @@ - - + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index c42c8ee0..b1a14887 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,6 +3,7 @@ diff --git a/app/build.gradle b/app/build.gradle index 8318e58d..a85599af 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,7 +38,7 @@ android { minSdkVersion 16 targetSdkVersion 31 versionCode 69 - versionName "5.2.19" + versionName "5.2.20" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } @@ -91,6 +91,7 @@ dependencies { implementation "androidx.gridlayout:gridlayout:1.0.0" implementation "androidx.biometric:biometric:1.1.0" implementation "androidx.work:work-runtime-ktx:2.7.1" + implementation 'androidx.webkit:webkit:1.4.0' implementation "com.daimajia.swipelayout:library:1.2.0@aar" diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 534fea8c..50139528 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -12,7 +12,7 @@ "filters": [], "attributes": [], "versionCode": 69, - "versionName": "5.2.19", + "versionName": "5.2.20", "outputFile": "app-release.apk" } ], diff --git a/app/src/main/java/xyz/quaver/pupil/Pupil.kt b/app/src/main/java/xyz/quaver/pupil/Pupil.kt index 2c5e606e..d9278e09 100644 --- a/app/src/main/java/xyz/quaver/pupil/Pupil.kt +++ b/app/src/main/java/xyz/quaver/pupil/Pupil.kt @@ -29,10 +29,10 @@ import android.net.Uri import android.os.Build import android.util.Log import android.webkit.* -import android.widget.Toast import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.ContextCompat import androidx.preference.PreferenceManager +import androidx.webkit.WebViewCompat import com.facebook.imagepipeline.backends.okhttp3.OkHttpImagePipelineConfigFactory import com.github.piasy.biv.BigImageViewer import com.github.piasy.biv.loader.fresco.FrescoImageLoader @@ -43,6 +43,8 @@ import com.google.firebase.crashlytics.FirebaseCrashlytics import kotlinx.coroutines.* import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json import okhttp3.* import xyz.quaver.io.FileX import xyz.quaver.pupil.hitomi.evaluationContext @@ -83,6 +85,7 @@ val _webViewFlow = MutableSharedFlow>() val webViewFlow = _webViewFlow.asSharedFlow() var webViewReady = false var webViewFailed = false +var oldWebView = false private var reloadJob: Job? = null fun reloadWebView() { @@ -91,6 +94,7 @@ fun reloadWebView() { reloadJob = CoroutineScope(Dispatchers.IO).launch { webViewReady = false webViewFailed = false + oldWebView = false evaluationContext.cancelChildren(CancellationException("reload")) @@ -156,7 +160,21 @@ fun initWebView(context: Context) { webViewClient = object: WebViewClient() { override fun onPageFinished(view: WebView?, url: String?) { - webViewReady = true + webView.evaluateJavascript( + """ + try { + new Function('(x => x?.y ?? z)'); + true; + } catch (err) { + false; + } + """.trimIndent() + ) { + val es2020: Boolean = Json.decodeFromString(it) + + webViewReady = es2020 + oldWebView = !es2020 + } } override fun onReceivedError( 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 18e131fa..99314825 100644 --- a/app/src/main/java/xyz/quaver/pupil/hitomi/common.kt +++ b/app/src/main/java/xyz/quaver/pupil/hitomi/common.kt @@ -16,6 +16,7 @@ package xyz.quaver.pupil.hitomi +import android.util.Log import android.webkit.WebView import kotlinx.coroutines.* import kotlinx.coroutines.flow.Flow @@ -25,10 +26,7 @@ import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json -import xyz.quaver.pupil.webView -import xyz.quaver.pupil.webViewFailed -import xyz.quaver.pupil.webViewFlow -import xyz.quaver.pupil.webViewReady +import xyz.quaver.pupil.* import java.util.* import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine @@ -55,9 +53,11 @@ suspend inline fun WebView.evaluate(script: String): T = coroutineSc while (result == null) { try { - result = withContext(evaluationContext) { - while (webViewFailed || !webViewReady) yield() + while (!oldWebView && !(webViewReady && !webViewFailed)) yield() + result = if (oldWebView) + "null" + else withContext(evaluationContext) { suspendCoroutine { continuation -> evaluateJavascript(script) { continuation.resume(it) @@ -82,9 +82,11 @@ suspend inline fun WebView.evaluatePromise( while (result == null) { try { - result = withContext(evaluationContext) { - while (webViewFailed || !webViewReady) yield() + while (!oldWebView && !(webViewReady && !webViewFailed)) yield() + result = if (oldWebView) + "null" + else withContext(evaluationContext) { val uid = UUID.randomUUID().toString() val flow: Flow> = webViewFlow.transformWhile { (currentUid, result) -> diff --git a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt index 3a3d3f12..1d322359 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt @@ -19,6 +19,7 @@ package xyz.quaver.pupil.ui import android.annotation.SuppressLint +import android.content.ActivityNotFoundException import android.content.Intent import android.net.Uri import android.os.Build @@ -37,6 +38,7 @@ import androidx.core.content.ContextCompat import androidx.core.view.GravityCompat import androidx.core.view.ViewCompat import androidx.recyclerview.widget.RecyclerView +import androidx.webkit.WebViewCompat import com.google.android.material.navigation.NavigationView import com.google.android.material.snackbar.Snackbar import com.google.firebase.crashlytics.FirebaseCrashlytics @@ -105,6 +107,8 @@ class MainActivity : private lateinit var binding: MainActivityBinding + private var oldWebViewJob: Job? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = MainActivityBinding.inflate(layoutInflater) @@ -125,9 +129,40 @@ class MainActivity : if (Preferences["download_folder", ""].isEmpty()) DownloadLocationDialogFragment().show(supportFragmentManager, "Download Location Dialog") + oldWebViewJob = CoroutineScope(Dispatchers.Unconfined).launch { + do { + delay(1000) + if (oldWebView) { + AlertDialog.Builder(this@MainActivity) + .setTitle(android.R.string.dialog_alert_title) + .setMessage(R.string.old_webview) + .setCancelable(false) + .setPositiveButton(android.R.string.ok) { _, _ -> + WebViewCompat.getCurrentWebViewPackage(this@MainActivity)?.packageName?.let { packageName -> + try { + startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse("market://details?id=$packageName") + ) + ) + } catch (e: ActivityNotFoundException) { + startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse("https://play.google.com/store/apps/details?id=$packageName") + ) + ) + } + } + } + .show() + break + } + } while (isActive) + } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && - !Preferences["download_folder_ignore_warning", false] && + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !Preferences["download_folder_ignore_warning", false] && ContextCompat.getExternalFilesDirs(this, null).filterNotNull().map { Uri.fromFile(it).toString() } .contains(Preferences["download_folder", ""]) ) { @@ -169,6 +204,8 @@ class MainActivity : override fun onDestroy() { super.onDestroy() + oldWebViewJob?.cancel() + (binding.contents.recyclerview.adapter as? GalleryBlockAdapter)?.updateAll = false } diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index dba21464..db2ebac9 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -157,4 +157,5 @@ 並列ダウンロード アンドロイド11以上では外部からのアプリ内部空間接近が不可能です。ダウンロードフォルダを変更しますか? ネットワーク + WebViewのアップデートが必要です \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 9cc2e9ca..3a00fd9a 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -157,4 +157,5 @@ 병렬 다운로드 안드로이드 11 이상에서는 외부에서 현재 다운로드 폴더에 접근할 수 없습니다. 변경하시겠습니까? 네트워크 + WebView 업데이트가 필요합니다 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ee76168c..af69a1db 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -51,6 +51,8 @@ From Android 11 and above, current Download folder cannot be accessed by outside apps. Would you like to change the download folder? + You are using an old version of WebView. Please update it on PlayStore + Home History Downloads