From 33edf5bda1dfcc7dd6fc6a0c54671d8476f9ac38 Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 23 Aug 2021 21:30:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E7=99=BB=E5=BD=95=E8=A7=84?= =?UTF-8?q?=E5=88=99=E5=88=A4=E6=96=AD=E4=BD=BF=E7=94=A8webView=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E8=BF=98=E6=98=AF=E8=87=AA=E5=AE=9A=E4=B9=89ui?= =?UTF-8?q?=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/info/BookInfoActivity.kt | 3 - ...rceLoginDialog.kt => RuleUiLoginDialog.kt} | 15 +--- .../app/ui/book/login/SourceLoginActivity.kt | 85 +++--------------- .../app/ui/book/login/SourceLoginViewModel.kt | 26 ++++++ .../app/ui/book/login/WebViewLoginFragment.kt | 90 +++++++++++++++++++ .../app/ui/book/read/ReadBookActivity.kt | 3 - .../source/edit/BookSourceEditActivity.kt | 2 - .../main/res/layout/activity_source_login.xml | 11 +-- .../res/layout/fragment_web_view_login.xml | 19 ++++ 9 files changed, 154 insertions(+), 100 deletions(-) rename app/src/main/java/io/legado/app/ui/book/login/{SourceLoginDialog.kt => RuleUiLoginDialog.kt} (88%) create mode 100644 app/src/main/java/io/legado/app/ui/book/login/SourceLoginViewModel.kt create mode 100644 app/src/main/java/io/legado/app/ui/book/login/WebViewLoginFragment.kt create mode 100644 app/src/main/res/layout/fragment_web_view_login.xml diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index cbc25b782..830d7a73b 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -15,7 +15,6 @@ import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.bumptech.glide.request.RequestOptions.bitmapTransform import io.legado.app.R import io.legado.app.base.VMBaseActivity -import io.legado.app.constant.AppConst import io.legado.app.constant.BookType import io.legado.app.constant.Theme import io.legado.app.data.appDb @@ -156,8 +155,6 @@ class BookInfoActivity : R.id.menu_login -> viewModel.bookSource?.let { startActivity { putExtra("sourceUrl", it.bookSourceUrl) - putExtra("loginUrl", it.loginUrl) - putExtra("userAgent", it.getHeaderMap()[AppConst.UA_NAME]) } } R.id.menu_top -> viewModel.topBook() diff --git a/app/src/main/java/io/legado/app/ui/book/login/SourceLoginDialog.kt b/app/src/main/java/io/legado/app/ui/book/login/RuleUiLoginDialog.kt similarity index 88% rename from app/src/main/java/io/legado/app/ui/book/login/SourceLoginDialog.kt rename to app/src/main/java/io/legado/app/ui/book/login/RuleUiLoginDialog.kt index 9e748f9db..264c845e5 100644 --- a/app/src/main/java/io/legado/app/ui/book/login/SourceLoginDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/login/RuleUiLoginDialog.kt @@ -5,10 +5,9 @@ import android.text.InputType import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.fragment.app.FragmentManager +import androidx.fragment.app.activityViewModels import io.legado.app.R import io.legado.app.base.BaseDialogFragment -import io.legado.app.data.appDb import io.legado.app.databinding.DialogLoginBinding import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.widget.text.EditText @@ -17,15 +16,10 @@ import io.legado.app.utils.GSON import io.legado.app.utils.applyTint import io.legado.app.utils.viewbindingdelegate.viewBinding -class SourceLoginDialog : BaseDialogFragment() { - - companion object { - fun start(fragmentManager: FragmentManager, sourceUrl: String) { - - } - } +class RuleUiLoginDialog : BaseDialogFragment() { private val binding by viewBinding(DialogLoginBinding::bind) + private val viewModel by activityViewModels() override fun onCreateView( inflater: LayoutInflater, @@ -37,8 +31,7 @@ class SourceLoginDialog : BaseDialogFragment() { override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { binding.toolBar.setBackgroundColor(primaryColor) - val sourceUrl = arguments?.getString("sourceUrl") ?: return - val bookSource = appDb.bookSourceDao.getBookSource(sourceUrl) ?: return + val bookSource = viewModel.bookSource ?: return val loginHeader = bookSource.getLoginHeader() val loginUi = bookSource.loginUi loginUi?.forEachIndexed { index, rowUi -> diff --git a/app/src/main/java/io/legado/app/ui/book/login/SourceLoginActivity.kt b/app/src/main/java/io/legado/app/ui/book/login/SourceLoginActivity.kt index 118467315..3e2e8834a 100644 --- a/app/src/main/java/io/legado/app/ui/book/login/SourceLoginActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/login/SourceLoginActivity.kt @@ -1,94 +1,35 @@ package io.legado.app.ui.book.login -import android.annotation.SuppressLint -import android.graphics.Bitmap import android.os.Bundle -import android.view.Menu -import android.view.MenuItem -import android.webkit.CookieManager -import android.webkit.WebView -import android.webkit.WebViewClient +import androidx.activity.viewModels import io.legado.app.R import io.legado.app.base.BaseActivity +import io.legado.app.data.entities.BookSource import io.legado.app.databinding.ActivitySourceLoginBinding -import io.legado.app.help.http.CookieStore -import io.legado.app.utils.snackbar import io.legado.app.utils.viewbindingdelegate.viewBinding class SourceLoginActivity : BaseActivity() { override val binding by viewBinding(ActivitySourceLoginBinding::inflate) - var sourceUrl: String? = null - var loginUrl: String? = null - var userAgent: String? = null - var checking = false + private val viewModel by viewModels() override fun onActivityCreated(savedInstanceState: Bundle?) { - sourceUrl = intent.getStringExtra("sourceUrl") - loginUrl = intent.getStringExtra("loginUrl") - userAgent = intent.getStringExtra("userAgent") - title = getString(R.string.login_source, sourceUrl) - initWebView() - } - - @SuppressLint("SetJavaScriptEnabled") - private fun initWebView() { - val settings = binding.webView.settings - settings.setSupportZoom(true) - settings.builtInZoomControls = true - settings.javaScriptEnabled = true - userAgent?.let { - settings.userAgentString = it - } - val cookieManager = CookieManager.getInstance() - binding.webView.webViewClient = object : WebViewClient() { - override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { - val cookie = cookieManager.getCookie(url) - sourceUrl?.let { - CookieStore.setCookie(it, cookie) - } - super.onPageStarted(view, url, favicon) - } - - override fun onPageFinished(view: WebView?, url: String?) { - val cookie = cookieManager.getCookie(url) - sourceUrl?.let { - CookieStore.setCookie(it, cookie) - } - if (checking) { - finish() - } - super.onPageFinished(view, url) + intent.getStringExtra("sourceUrl")?.let { + viewModel.initData(it) { bookSource -> + initView(bookSource) } } - loginUrl?.let { - binding.webView.loadUrl(it) - } - } - - override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.source_login, menu) - return super.onCompatCreateOptionsMenu(menu) } - override fun onCompatOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - R.id.menu_ok -> { - if (!checking) { - checking = true - binding.titleBar.snackbar(R.string.check_host_cookie) - loginUrl?.let { - binding.webView.loadUrl(it) - } - } - } + private fun initView(bookSource: BookSource) { + if (bookSource.loginUi.isNullOrEmpty()) { + supportFragmentManager.beginTransaction() + .replace(R.id.fragment, WebViewLoginFragment()) + .commit() + } else { + RuleUiLoginDialog().show(supportFragmentManager, "ruleUiLogin") } - return super.onCompatOptionsItemSelected(item) } - override fun onDestroy() { - super.onDestroy() - binding.webView.destroy() - } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/login/SourceLoginViewModel.kt b/app/src/main/java/io/legado/app/ui/book/login/SourceLoginViewModel.kt new file mode 100644 index 000000000..80e0035cd --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/login/SourceLoginViewModel.kt @@ -0,0 +1,26 @@ +package io.legado.app.ui.book.login + +import android.app.Application +import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb +import io.legado.app.data.entities.BookSource +import io.legado.app.utils.toastOnUi + +class SourceLoginViewModel(application: Application) : BaseViewModel(application) { + + var bookSource: BookSource? = null + + fun initData(sourceUrl: String, success: (bookSource: BookSource) -> Unit) { + execute { + bookSource = appDb.bookSourceDao.getBookSource(sourceUrl) + bookSource + }.onSuccess { + if (it != null) { + success.invoke(it) + } else { + context.toastOnUi("未找到书源") + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/login/WebViewLoginFragment.kt b/app/src/main/java/io/legado/app/ui/book/login/WebViewLoginFragment.kt new file mode 100644 index 000000000..ba93817df --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/login/WebViewLoginFragment.kt @@ -0,0 +1,90 @@ +package io.legado.app.ui.book.login + +import android.annotation.SuppressLint +import android.graphics.Bitmap +import android.os.Bundle +import android.view.Menu +import android.view.MenuItem +import android.view.View +import android.webkit.CookieManager +import android.webkit.WebView +import android.webkit.WebViewClient +import androidx.fragment.app.activityViewModels +import io.legado.app.R +import io.legado.app.base.BaseFragment +import io.legado.app.constant.AppConst +import io.legado.app.data.entities.BookSource +import io.legado.app.databinding.FragmentWebViewLoginBinding +import io.legado.app.help.http.CookieStore +import io.legado.app.utils.snackbar +import io.legado.app.utils.viewbindingdelegate.viewBinding + +class WebViewLoginFragment : BaseFragment(R.layout.fragment_web_view_login) { + + private val binding by viewBinding(FragmentWebViewLoginBinding::bind) + private val viewModel by activityViewModels() + + private var checking = false + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + viewModel.bookSource?.let { + binding.titleBar.title = getString(R.string.login_source, it.bookSourceName) + initWebView(it) + } + } + + override fun onCompatCreateOptionsMenu(menu: Menu) { + menuInflater.inflate(R.menu.source_login, menu) + } + + override fun onCompatOptionsItemSelected(item: MenuItem) { + when (item.itemId) { + R.id.menu_ok -> { + if (!checking) { + checking = true + binding.titleBar.snackbar(R.string.check_host_cookie) + viewModel.bookSource?.loginUrl?.let { + binding.webView.loadUrl(it) + } + } + } + } + } + + @SuppressLint("SetJavaScriptEnabled") + private fun initWebView(bookSource: BookSource) { + val settings = binding.webView.settings + settings.setSupportZoom(true) + settings.builtInZoomControls = true + settings.javaScriptEnabled = true + bookSource.getHeaderMap()[AppConst.UA_NAME]?.let { + settings.userAgentString = it + } + val cookieManager = CookieManager.getInstance() + binding.webView.webViewClient = object : WebViewClient() { + override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { + val cookie = cookieManager.getCookie(url) + CookieStore.setCookie(bookSource.bookSourceUrl, cookie) + super.onPageStarted(view, url, favicon) + } + + override fun onPageFinished(view: WebView?, url: String?) { + val cookie = cookieManager.getCookie(url) + CookieStore.setCookie(bookSource.bookSourceUrl, cookie) + if (checking) { + activity?.finish() + } + super.onPageFinished(view, url) + } + } + bookSource.loginUrl?.let { + binding.webView.loadUrl(it) + } + } + + override fun onDestroy() { + super.onDestroy() + binding.webView.destroy() + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index 575342c5c..b0957beac 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -16,7 +16,6 @@ import androidx.core.view.size import com.jaredrummler.android.colorpicker.ColorPickerDialogListener import io.legado.app.BuildConfig import io.legado.app.R -import io.legado.app.constant.AppConst import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey import io.legado.app.constant.Status @@ -789,8 +788,6 @@ class ReadBookActivity : ReadBookBaseActivity(), ReadBook.webBook?.bookSource?.let { startActivity { putExtra("sourceUrl", it.bookSourceUrl) - putExtra("loginUrl", it.loginUrl) - putExtra("userAgent", it.getHeaderMap()[AppConst.UA_NAME]) } } } diff --git a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt index 9d5e5ad2b..ecc0f61fa 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt @@ -122,8 +122,6 @@ class BookSourceEditActivity : } else { startActivity { putExtra("sourceUrl", it.bookSourceUrl) - putExtra("loginUrl", it.loginUrl) - putExtra("userAgent", it.getHeaderMap()[AppConst.UA_NAME]) } } } diff --git a/app/src/main/res/layout/activity_source_login.xml b/app/src/main/res/layout/activity_source_login.xml index ed20ab520..20ef0c3dc 100644 --- a/app/src/main/res/layout/activity_source_login.xml +++ b/app/src/main/res/layout/activity_source_login.xml @@ -2,17 +2,10 @@ - - - diff --git a/app/src/main/res/layout/fragment_web_view_login.xml b/app/src/main/res/layout/fragment_web_view_login.xml new file mode 100644 index 000000000..ed20ab520 --- /dev/null +++ b/app/src/main/res/layout/fragment_web_view_login.xml @@ -0,0 +1,19 @@ + + + + + + + + \ No newline at end of file