From db0ee268f9fdd4dd44fa85fee59fd60190ebfe2b Mon Sep 17 00:00:00 2001 From: Koitharu Date: Thu, 19 Mar 2020 14:31:25 +0200 Subject: [PATCH] Browser activity --- app/src/main/AndroidManifest.xml | 3 + .../kotatsu/ui/browser/BrowserActivity.kt | 94 +++++++++++++++++++ .../kotatsu/ui/browser/BrowserCallback.kt | 8 ++ .../kotatsu/ui/browser/BrowserClient.kt | 57 +++++++++++ .../ui/details/MangaDetailsActivity.kt | 7 ++ .../main/res/drawable/ic_open_external.xml | 11 +++ app/src/main/res/layout/activity_browser.xml | 51 ++++++++++ app/src/main/res/menu/opt_browser.xml | 12 +++ app/src/main/res/menu/opt_details.xml | 5 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 11 files changed, 250 insertions(+) create mode 100644 app/src/main/java/org/koitharu/kotatsu/ui/browser/BrowserActivity.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/ui/browser/BrowserCallback.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/ui/browser/BrowserClient.kt create mode 100644 app/src/main/res/drawable/ic_open_external.xml create mode 100644 app/src/main/res/layout/activity_browser.xml create mode 100644 app/src/main/res/menu/opt_browser.xml 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