根据登录规则判断使用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 com.bumptech.glide.request.RequestOptions.bitmapTransform
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.VMBaseActivity import io.legado.app.base.VMBaseActivity
import io.legado.app.constant.AppConst
import io.legado.app.constant.BookType import io.legado.app.constant.BookType
import io.legado.app.constant.Theme import io.legado.app.constant.Theme
import io.legado.app.data.appDb import io.legado.app.data.appDb
@ -156,8 +155,6 @@ class BookInfoActivity :
R.id.menu_login -> viewModel.bookSource?.let { R.id.menu_login -> viewModel.bookSource?.let {
startActivity<SourceLoginActivity> { startActivity<SourceLoginActivity> {
putExtra("sourceUrl", it.bookSourceUrl) putExtra("sourceUrl", it.bookSourceUrl)
putExtra("loginUrl", it.loginUrl)
putExtra("userAgent", it.getHeaderMap()[AppConst.UA_NAME])
} }
} }
R.id.menu_top -> viewModel.topBook() R.id.menu_top -> viewModel.topBook()

@ -5,10 +5,9 @@ import android.text.InputType
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.FragmentManager import androidx.fragment.app.activityViewModels
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.BaseDialogFragment import io.legado.app.base.BaseDialogFragment
import io.legado.app.data.appDb
import io.legado.app.databinding.DialogLoginBinding import io.legado.app.databinding.DialogLoginBinding
import io.legado.app.lib.theme.primaryColor import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.widget.text.EditText 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.applyTint
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
class SourceLoginDialog : BaseDialogFragment() { class RuleUiLoginDialog : BaseDialogFragment() {
companion object {
fun start(fragmentManager: FragmentManager, sourceUrl: String) {
}
}
private val binding by viewBinding(DialogLoginBinding::bind) private val binding by viewBinding(DialogLoginBinding::bind)
private val viewModel by activityViewModels<SourceLoginViewModel>()
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
@ -37,8 +31,7 @@ class SourceLoginDialog : BaseDialogFragment() {
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
binding.toolBar.setBackgroundColor(primaryColor) binding.toolBar.setBackgroundColor(primaryColor)
val sourceUrl = arguments?.getString("sourceUrl") ?: return val bookSource = viewModel.bookSource ?: return
val bookSource = appDb.bookSourceDao.getBookSource(sourceUrl) ?: return
val loginHeader = bookSource.getLoginHeader() val loginHeader = bookSource.getLoginHeader()
val loginUi = bookSource.loginUi val loginUi = bookSource.loginUi
loginUi?.forEachIndexed { index, rowUi -> loginUi?.forEachIndexed { index, rowUi ->

@ -1,94 +1,35 @@
package io.legado.app.ui.book.login package io.legado.app.ui.book.login
import android.annotation.SuppressLint
import android.graphics.Bitmap
import android.os.Bundle import android.os.Bundle
import android.view.Menu import androidx.activity.viewModels
import android.view.MenuItem
import android.webkit.CookieManager
import android.webkit.WebView
import android.webkit.WebViewClient
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.BaseActivity import io.legado.app.base.BaseActivity
import io.legado.app.data.entities.BookSource
import io.legado.app.databinding.ActivitySourceLoginBinding 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 import io.legado.app.utils.viewbindingdelegate.viewBinding
class SourceLoginActivity : BaseActivity<ActivitySourceLoginBinding>() { class SourceLoginActivity : BaseActivity<ActivitySourceLoginBinding>() {
override val binding by viewBinding(ActivitySourceLoginBinding::inflate) override val binding by viewBinding(ActivitySourceLoginBinding::inflate)
var sourceUrl: String? = null private val viewModel by viewModels<SourceLoginViewModel>()
var loginUrl: String? = null
var userAgent: String? = null
var checking = false
override fun onActivityCreated(savedInstanceState: Bundle?) { override fun onActivityCreated(savedInstanceState: Bundle?) {
sourceUrl = intent.getStringExtra("sourceUrl") intent.getStringExtra("sourceUrl")?.let {
loginUrl = intent.getStringExtra("loginUrl") viewModel.initData(it) { bookSource ->
userAgent = intent.getStringExtra("userAgent") initView(bookSource)
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?) { private fun initView(bookSource: BookSource) {
val cookie = cookieManager.getCookie(url) if (bookSource.loginUi.isNullOrEmpty()) {
sourceUrl?.let { supportFragmentManager.beginTransaction()
CookieStore.setCookie(it, cookie) .replace(R.id.fragment, WebViewLoginFragment())
} .commit()
if (checking) { } else {
finish() RuleUiLoginDialog().show(supportFragmentManager, "ruleUiLogin")
}
super.onPageFinished(view, url)
} }
} }
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 com.jaredrummler.android.colorpicker.ColorPickerDialogListener
import io.legado.app.BuildConfig import io.legado.app.BuildConfig
import io.legado.app.R import io.legado.app.R
import io.legado.app.constant.AppConst
import io.legado.app.constant.EventBus import io.legado.app.constant.EventBus
import io.legado.app.constant.PreferKey import io.legado.app.constant.PreferKey
import io.legado.app.constant.Status import io.legado.app.constant.Status
@ -789,8 +788,6 @@ class ReadBookActivity : ReadBookBaseActivity(),
ReadBook.webBook?.bookSource?.let { ReadBook.webBook?.bookSource?.let {
startActivity<SourceLoginActivity> { startActivity<SourceLoginActivity> {
putExtra("sourceUrl", it.bookSourceUrl) putExtra("sourceUrl", it.bookSourceUrl)
putExtra("loginUrl", it.loginUrl)
putExtra("userAgent", it.getHeaderMap()[AppConst.UA_NAME])
} }
} }
} }

@ -122,8 +122,6 @@ class BookSourceEditActivity :
} else { } else {
startActivity<SourceLoginActivity> { startActivity<SourceLoginActivity> {
putExtra("sourceUrl", it.bookSourceUrl) 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" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"> android:orientation="vertical">
<io.legado.app.ui.widget.TitleBar <View
android:id="@+id/title_bar" android:id="@+id/fragment"
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_width="match_parent"
android:layout_height="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