diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 2d54d7517..82c42aa8e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -43,6 +43,9 @@
+
{
+ webView.stopLoading()
+ finish()
+ true
+ }
+ R.id.action_browser -> {
+ val intent = Intent(Intent.ACTION_VIEW)
+ intent.data = Uri.parse(webView.url)
+ try {
+ startActivity(Intent.createChooser(intent, item.title))
+ } catch (_: ActivityNotFoundException) {
+ }
+ true
+ }
+ else -> super.onOptionsItemSelected(item)
+ }
+
+ override fun onBackPressed() {
+ if (webView.canGoBack()) {
+ webView.goBack()
+ } else {
+ super.onBackPressed()
+ }
+ }
+
+ override fun onPause() {
+ webView.onPause()
+ super.onPause()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ webView.onResume()
+ }
+
+ override fun onLoadingStateChanged(isLoading: Boolean) {
+ progressBar.isVisible = isLoading
+ }
+
+ override fun onTitleChanged(title: CharSequence, subtitle: CharSequence?) {
+ this.title = title
+ supportActionBar?.subtitle = subtitle
+ }
+
+ companion object {
+
+ @JvmStatic
+ fun newIntent(context: Context, url: String) = Intent(context, BrowserActivity::class.java)
+ .setData(Uri.parse(url))
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/browser/BrowserCallback.kt b/app/src/main/java/org/koitharu/kotatsu/ui/browser/BrowserCallback.kt
new file mode 100644
index 000000000..71b1ecfa9
--- /dev/null
+++ b/app/src/main/java/org/koitharu/kotatsu/ui/browser/BrowserCallback.kt
@@ -0,0 +1,8 @@
+package org.koitharu.kotatsu.ui.browser
+
+interface BrowserCallback {
+
+ fun onLoadingStateChanged(isLoading: Boolean)
+
+ fun onTitleChanged(title: CharSequence, subtitle: CharSequence?)
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/browser/BrowserClient.kt b/app/src/main/java/org/koitharu/kotatsu/ui/browser/BrowserClient.kt
new file mode 100644
index 000000000..842c712f6
--- /dev/null
+++ b/app/src/main/java/org/koitharu/kotatsu/ui/browser/BrowserClient.kt
@@ -0,0 +1,57 @@
+package org.koitharu.kotatsu.ui.browser
+
+import android.graphics.Bitmap
+import android.webkit.WebResourceRequest
+import android.webkit.WebResourceResponse
+import android.webkit.WebView
+import android.webkit.WebViewClient
+import okhttp3.OkHttpClient
+import okhttp3.Request
+import org.koin.core.KoinComponent
+import org.koin.core.inject
+import org.koitharu.kotatsu.utils.ext.safe
+
+class BrowserClient(private val callback: BrowserCallback) : WebViewClient(), KoinComponent {
+
+ private val okHttp by inject()
+
+ override fun onPageFinished(webView: WebView, url: String) {
+ super.onPageFinished(webView, url)
+ callback.onLoadingStateChanged(isLoading = false)
+ }
+
+ override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
+ super.onPageStarted(view, url, favicon)
+ callback.onLoadingStateChanged(isLoading = true)
+ }
+
+ override fun onPageCommitVisible(view: WebView, url: String?) {
+ super.onPageCommitVisible(view, url)
+ callback.onTitleChanged(view.title, url)
+ }
+
+ override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?) = false
+
+ override fun shouldOverrideUrlLoading(view: WebView, url: String) = false
+
+ override fun shouldInterceptRequest(view: WebView?, url: String?): WebResourceResponse? {
+ return url?.let(::doRequest)
+ }
+
+ override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse? {
+ return request?.url?.toString()?.let(::doRequest)
+ }
+
+ private fun doRequest(url: String): WebResourceResponse? = safe {
+ val request = Request.Builder()
+ .url(url)
+ .build()
+ val response = okHttp.newCall(request).execute()
+ val ct = response.body?.contentType()
+ WebResourceResponse(
+ "${ct?.type}/${ct?.subtype}",
+ ct?.charset()?.name() ?: "utf-8",
+ response.body?.byteStream()
+ )
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt
index 600a24f78..067e8965c 100644
--- a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt
@@ -21,6 +21,7 @@ import org.koitharu.kotatsu.core.model.FavouriteCategory
import org.koitharu.kotatsu.core.model.Manga
import org.koitharu.kotatsu.core.model.MangaHistory
import org.koitharu.kotatsu.core.model.MangaSource
+import org.koitharu.kotatsu.ui.browser.BrowserActivity
import org.koitharu.kotatsu.ui.common.BaseActivity
import org.koitharu.kotatsu.ui.download.DownloadService
import org.koitharu.kotatsu.utils.ShareHelper
@@ -123,6 +124,12 @@ class MangaDetailsActivity : BaseActivity(), MangaDetailsView {
}
true
}
+ R.id.action_browser -> {
+ manga?.let {
+ startActivity(BrowserActivity.newIntent(this, it.url))
+ }
+ true
+ }
R.id.action_shortcut -> {
manga?.let {
lifecycleScope.launch {
diff --git a/app/src/main/res/drawable/ic_open_external.xml b/app/src/main/res/drawable/ic_open_external.xml
new file mode 100644
index 000000000..16f647fc6
--- /dev/null
+++ b/app/src/main/res/drawable/ic_open_external.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_browser.xml b/app/src/main/res/layout/activity_browser.xml
new file mode 100644
index 000000000..09040154e
--- /dev/null
+++ b/app/src/main/res/layout/activity_browser.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/opt_browser.xml b/app/src/main/res/menu/opt_browser.xml
new file mode 100644
index 000000000..2a1f6a44f
--- /dev/null
+++ b/app/src/main/res/menu/opt_browser.xml
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/opt_details.xml b/app/src/main/res/menu/opt_details.xml
index ac4039dbd..db70718af 100644
--- a/app/src/main/res/menu/opt_details.xml
+++ b/app/src/main/res/menu/opt_details.xml
@@ -20,6 +20,11 @@
android:visible="false"
app:showAsAction="never" />
+
+
- Доступно обновление приложения
О программе
Показывать уведомление при наличии новой версии
+ Открыть в браузере
\ 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 fc33d53f9..89883acc6 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -109,4 +109,5 @@
Application update is available
About
Show notification if update is available
+ Open in browser
\ No newline at end of file