根据登录规则判断使用webView登录还是自定义ui登录

pull/1264/head
gedoor 4 years ago
parent 407fd016bc
commit 33edf5bda1
  1. 3
      app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt
  2. 15
      app/src/main/java/io/legado/app/ui/book/login/RuleUiLoginDialog.kt
  3. 85
      app/src/main/java/io/legado/app/ui/book/login/SourceLoginActivity.kt
  4. 26
      app/src/main/java/io/legado/app/ui/book/login/SourceLoginViewModel.kt
  5. 90
      app/src/main/java/io/legado/app/ui/book/login/WebViewLoginFragment.kt
  6. 3
      app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt
  7. 2
      app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt
  8. 11
      app/src/main/res/layout/activity_source_login.xml
  9. 19
      app/src/main/res/layout/fragment_web_view_login.xml

@ -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<SourceLoginActivity> {
putExtra("sourceUrl", it.bookSourceUrl)
putExtra("loginUrl", it.loginUrl)
putExtra("userAgent", it.getHeaderMap()[AppConst.UA_NAME])
}
}
R.id.menu_top -> viewModel.topBook()

@ -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<SourceLoginViewModel>()
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 ->

@ -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<ActivitySourceLoginBinding>() {
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<SourceLoginViewModel>()
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()
intent.getStringExtra("sourceUrl")?.let {
viewModel.initData(it) { bookSource ->
initView(bookSource)
}
@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)
private fun initView(bookSource: BookSource) {
if (bookSource.loginUi.isNullOrEmpty()) {
supportFragmentManager.beginTransaction()
.replace(R.id.fragment, WebViewLoginFragment())
.commit()
} else {
RuleUiLoginDialog().show(supportFragmentManager, "ruleUiLogin")
}
}
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)
}
}
}
}
return super.onCompatOptionsItemSelected(item)
}
override fun onDestroy() {
super.onDestroy()
binding.webView.destroy()
}
}

@ -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("未找到书源")
}
}
}
}

@ -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<SourceLoginViewModel>()
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()
}
}

@ -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<SourceLoginActivity> {
putExtra("sourceUrl", it.bookSourceUrl)
putExtra("loginUrl", it.loginUrl)
putExtra("userAgent", it.getHeaderMap()[AppConst.UA_NAME])
}
}
}

@ -122,8 +122,6 @@ class BookSourceEditActivity :
} else {
startActivity<SourceLoginActivity> {
putExtra("sourceUrl", it.bookSourceUrl)
putExtra("loginUrl", it.loginUrl)
putExtra("userAgent", it.getHeaderMap()[AppConst.UA_NAME])
}
}
}

@ -2,17 +2,10 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">
<io.legado.app.ui.widget.TitleBar
android:id="@+id/title_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/login" />
<WebView
android:id="@+id/web_view"
<View
android:id="@+id/fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">
<io.legado.app.ui.widget.TitleBar
android:id="@+id/title_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/login" />
<WebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Loading…
Cancel
Save