From bec032c7dccdca27eef4c8c2c812b96272dc293e Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 30 Mar 2024 08:13:02 +0200 Subject: [PATCH] Fix TransactionTooLargeException when using WebView --- .../kotatsu/browser/BrowserActivity.kt | 31 ++++++++++--------- .../browser/cloudflare/CloudFlareActivity.kt | 10 ------ .../exceptions/resolve/ExceptionResolver.kt | 2 +- .../kotatsu/details/ui/DetailsMenuProvider.kt | 2 +- .../sources/auth/SourceAuthActivity.kt | 10 ------ 5 files changed, 19 insertions(+), 36 deletions(-) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/browser/BrowserActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/browser/BrowserActivity.kt index 25af6d242..c65622764 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/browser/BrowserActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/browser/BrowserActivity.kt @@ -1,6 +1,5 @@ package org.koitharu.kotatsu.browser -import android.annotation.SuppressLint import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent @@ -13,17 +12,25 @@ import androidx.core.graphics.Insets import androidx.core.view.isVisible import androidx.core.view.updatePadding import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.network.CommonHeaders +import org.koitharu.kotatsu.core.parser.MangaRepository +import org.koitharu.kotatsu.core.parser.RemoteMangaRepository import org.koitharu.kotatsu.core.ui.BaseActivity import org.koitharu.kotatsu.core.util.ext.configureForParser +import org.koitharu.kotatsu.core.util.ext.getSerializableExtraCompat import org.koitharu.kotatsu.core.util.ext.toUriOrNull import org.koitharu.kotatsu.databinding.ActivityBrowserBinding +import org.koitharu.kotatsu.parsers.model.MangaSource +import javax.inject.Inject import com.google.android.material.R as materialR -@SuppressLint("SetJavaScriptEnabled") class BrowserActivity : BaseActivity(), BrowserCallback { private lateinit var onBackPressedCallback: WebViewBackPressedCallback + @Inject + lateinit var mangaRepositoryFactory: MangaRepository.Factory + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (!setContentViewWebViewSafe { ActivityBrowserBinding.inflate(layoutInflater) }) { @@ -33,7 +40,11 @@ class BrowserActivity : BaseActivity(), BrowserCallback setDisplayHomeAsUpEnabled(true) setHomeAsUpIndicator(materialR.drawable.abc_ic_clear_material) } - viewBinding.webView.configureForParser(null) + val userAgent = intent?.getSerializableExtraCompat(EXTRA_SOURCE)?.let { source -> + val repository = mangaRepositoryFactory.create(source) as? RemoteMangaRepository + repository?.headers?.get(CommonHeaders.USER_AGENT) + } + viewBinding.webView.configureForParser(userAgent) CookieManager.getInstance().setAcceptThirdPartyCookies(viewBinding.webView, true) viewBinding.webView.webViewClient = BrowserClient(this) viewBinding.webView.webChromeClient = ProgressChromeClient(viewBinding.progressBar) @@ -54,16 +65,6 @@ class BrowserActivity : BaseActivity(), BrowserCallback } } - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - viewBinding.webView.saveState(outState) - } - - override fun onRestoreInstanceState(savedInstanceState: Bundle) { - super.onRestoreInstanceState(savedInstanceState) - viewBinding.webView.restoreState(savedInstanceState) - } - override fun onCreateOptionsMenu(menu: Menu): Boolean { super.onCreateOptionsMenu(menu) menuInflater.inflate(R.menu.opt_browser, menu) @@ -136,11 +137,13 @@ class BrowserActivity : BaseActivity(), BrowserCallback companion object { private const val EXTRA_TITLE = "title" + private const val EXTRA_SOURCE = "source" - fun newIntent(context: Context, url: String, title: String?): Intent { + fun newIntent(context: Context, url: String, source: MangaSource?, title: String?): Intent { return Intent(context, BrowserActivity::class.java) .setData(Uri.parse(url)) .putExtra(EXTRA_TITLE, title) + .putExtra(EXTRA_SOURCE, source) } } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/browser/cloudflare/CloudFlareActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/browser/cloudflare/CloudFlareActivity.kt index 846f1f4a6..d56332ae3 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/browser/cloudflare/CloudFlareActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/browser/cloudflare/CloudFlareActivity.kt @@ -81,16 +81,6 @@ class CloudFlareActivity : BaseActivity(), CloudFlareCal super.onDestroy() } - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - viewBinding.webView.saveState(outState) - } - - override fun onRestoreInstanceState(savedInstanceState: Bundle) { - super.onRestoreInstanceState(savedInstanceState) - viewBinding.webView.restoreState(savedInstanceState) - } - override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.opt_captcha, menu) return super.onCreateOptionsMenu(menu) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/exceptions/resolve/ExceptionResolver.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/exceptions/resolve/ExceptionResolver.kt index 49cc7cf3f..c6a6d04d8 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/exceptions/resolve/ExceptionResolver.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/exceptions/resolve/ExceptionResolver.kt @@ -82,7 +82,7 @@ class ExceptionResolver : ActivityResultCallback { private fun openInBrowser(url: String) { val context = activity ?: fragment?.activity ?: return - context.startActivity(BrowserActivity.newIntent(context, url, null)) + context.startActivity(BrowserActivity.newIntent(context, url, null, null)) } private fun openAlternatives(manga: Manga) { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt index e544accd9..60eba722d 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt @@ -89,7 +89,7 @@ class DetailsMenuProvider( R.id.action_browser -> { viewModel.manga.value?.let { - activity.startActivity(BrowserActivity.newIntent(activity, it.publicUrl, it.title)) + activity.startActivity(BrowserActivity.newIntent(activity, it.publicUrl, it.source, it.title)) } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/sources/auth/SourceAuthActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/sources/auth/SourceAuthActivity.kt index 47d92885a..11c33dd17 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/sources/auth/SourceAuthActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/sources/auth/SourceAuthActivity.kt @@ -82,16 +82,6 @@ class SourceAuthActivity : BaseActivity(), BrowserCallba viewBinding.webView.loadUrl(url) } - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - viewBinding.webView.saveState(outState) - } - - override fun onRestoreInstanceState(savedInstanceState: Bundle) { - super.onRestoreInstanceState(savedInstanceState) - viewBinding.webView.restoreState(savedInstanceState) - } - override fun onDestroy() { super.onDestroy() viewBinding.webView.destroy()