订阅添加登录

pull/1319/head
gedoor 4 years ago
parent 2b1e78ff4c
commit ff16c97396
  1. 4
      app/src/main/java/io/legado/app/data/entities/BaseSource.kt
  2. 6
      app/src/main/java/io/legado/app/data/entities/BookSource.kt
  3. 6
      app/src/main/java/io/legado/app/data/entities/RssSource.kt
  4. 22
      app/src/main/java/io/legado/app/ui/login/RuleUiLoginDialog.kt
  5. 10
      app/src/main/java/io/legado/app/ui/login/SourceLoginActivity.kt
  6. 13
      app/src/main/java/io/legado/app/ui/login/SourceLoginViewModel.kt
  7. 4
      app/src/main/java/io/legado/app/ui/login/WebViewLoginFragment.kt
  8. 38
      app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt

@ -2,6 +2,7 @@ package io.legado.app.data.entities
import android.util.Base64 import android.util.Base64
import io.legado.app.constant.AppConst import io.legado.app.constant.AppConst
import io.legado.app.data.entities.rule.RowUi
import io.legado.app.help.AppConfig import io.legado.app.help.AppConfig
import io.legado.app.help.CacheManager import io.legado.app.help.CacheManager
import io.legado.app.help.JsExtensions import io.legado.app.help.JsExtensions
@ -19,8 +20,11 @@ interface BaseSource : JsExtensions {
var concurrentRate: String? // 并发率 var concurrentRate: String? // 并发率
var loginUrl: String? // 登录地址 var loginUrl: String? // 登录地址
var loginUi: List<RowUi>? // 登录UI
var header: String? // 请求头 var header: String? // 请求头
fun getName(): String
fun getStoreUrl(): String fun getStoreUrl(): String
fun getLoginJs(): String? { fun getLoginJs(): String? {

@ -29,7 +29,7 @@ data class BookSource(
override var concurrentRate: String? = null, //并发率 override var concurrentRate: String? = null, //并发率
override var header: String? = null, // 请求头 override var header: String? = null, // 请求头
override var loginUrl: String? = null, // 登录地址 override var loginUrl: String? = null, // 登录地址
var loginUi: List<RowUi>? = null, //登录UI override var loginUi: List<RowUi>? = null, //登录UI
var loginCheckJs: String? = null, //登录检测js var loginCheckJs: String? = null, //登录检测js
var bookSourceComment: String? = null, // 注释 var bookSourceComment: String? = null, // 注释
var lastUpdateTime: Long = 0, // 最后更新时间,用于排序 var lastUpdateTime: Long = 0, // 最后更新时间,用于排序
@ -44,6 +44,10 @@ data class BookSource(
var ruleContent: ContentRule? = null // 正文页规则 var ruleContent: ContentRule? = null // 正文页规则
) : Parcelable, BaseSource { ) : Parcelable, BaseSource {
override fun getName(): String {
return bookSourceName
}
override fun getStoreUrl(): String { override fun getStoreUrl(): String {
return bookSourceUrl return bookSourceUrl
} }

@ -23,7 +23,7 @@ data class RssSource(
override var concurrentRate: String? = null, //并发率 override var concurrentRate: String? = null, //并发率
override var header: String? = null, // 请求头 override var header: String? = null, // 请求头
override var loginUrl: String? = null, // 登录地址 override var loginUrl: String? = null, // 登录地址
var loginUi: List<RowUi>? = null, //登录UI override var loginUi: List<RowUi>? = null, //登录UI
var loginCheckJs: String? = null, //登录检测js var loginCheckJs: String? = null, //登录检测js
var sortUrl: String? = null, var sortUrl: String? = null,
var singleUrl: Boolean = false, var singleUrl: Boolean = false,
@ -45,6 +45,10 @@ data class RssSource(
var customOrder: Int = 0 var customOrder: Int = 0
) : Parcelable, BaseSource { ) : Parcelable, BaseSource {
override fun getName(): String {
return sourceName
}
override fun getStoreUrl(): String { override fun getStoreUrl(): String {
return sourceUrl return sourceUrl
} }

@ -11,7 +11,7 @@ import androidx.core.view.setPadding
import androidx.fragment.app.activityViewModels 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.entities.BookSource import io.legado.app.data.entities.BaseSource
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
@ -47,10 +47,10 @@ class RuleUiLoginDialog : BaseDialogFragment() {
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
binding.toolBar.setBackgroundColor(primaryColor) binding.toolBar.setBackgroundColor(primaryColor)
val bookSource = viewModel.bookSource ?: return val source = viewModel.source ?: return
binding.toolBar.title = getString(R.string.login_source, bookSource.bookSourceName) binding.toolBar.title = getString(R.string.login_source, source.getName())
val loginInfo = bookSource.getLoginInfoMap() val loginInfo = source.getLoginInfoMap()
val loginUi = bookSource.loginUi val loginUi = source.loginUi
loginUi?.forEachIndexed { index, rowUi -> loginUi?.forEachIndexed { index, rowUi ->
when (rowUi.type) { when (rowUi.type) {
"text" -> layoutInflater.inflate(R.layout.item_source_edit, binding.root, false) "text" -> layoutInflater.inflate(R.layout.item_source_edit, binding.root, false)
@ -106,24 +106,24 @@ class RuleUiLoginDialog : BaseDialogFragment() {
} }
} }
} }
login(bookSource, loginData) login(source, loginData)
} }
} }
return@setOnMenuItemClickListener true return@setOnMenuItemClickListener true
} }
} }
private fun login(bookSource: BookSource, loginData: HashMap<String, String>) { private fun login(source: BaseSource, loginData: HashMap<String, String>) {
launch(IO) { launch(IO) {
if (loginData.isEmpty()) { if (loginData.isEmpty()) {
bookSource.removeLoginInfo() source.removeLoginInfo()
withContext(Main) { withContext(Main) {
dismiss() dismiss()
} }
} else if (bookSource.putLoginInfo(GSON.toJson(loginData))) { } else if (source.putLoginInfo(GSON.toJson(loginData))) {
bookSource.getLoginJs()?.let { source.getLoginJs()?.let {
try { try {
bookSource.evalJS(it) source.evalJS(it)
toastOnUi(R.string.success) toastOnUi(R.string.success)
withContext(Main) { withContext(Main) {
dismiss() dismiss()

@ -4,7 +4,7 @@ import android.os.Bundle
import androidx.activity.viewModels import androidx.activity.viewModels
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.data.entities.BookSource import io.legado.app.data.entities.BaseSource
import io.legado.app.databinding.ActivitySourceLoginBinding import io.legado.app.databinding.ActivitySourceLoginBinding
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
@ -16,14 +16,14 @@ class SourceLoginActivity : VMBaseActivity<ActivitySourceLoginBinding, SourceLog
override fun onActivityCreated(savedInstanceState: Bundle?) { override fun onActivityCreated(savedInstanceState: Bundle?) {
intent.getStringExtra("sourceUrl")?.let { intent.getStringExtra("sourceUrl")?.let {
viewModel.initData(it) { bookSource -> viewModel.initData(it) { source ->
initView(bookSource) initView(source)
} }
} }
} }
private fun initView(bookSource: BookSource) { private fun initView(source: BaseSource) {
if (bookSource.loginUi.isNullOrEmpty()) { if (source.loginUi.isNullOrEmpty()) {
supportFragmentManager.beginTransaction() supportFragmentManager.beginTransaction()
.replace(R.id.fl_fragment, WebViewLoginFragment()) .replace(R.id.fl_fragment, WebViewLoginFragment())
.commit() .commit()

@ -3,17 +3,20 @@ package io.legado.app.ui.login
import android.app.Application import android.app.Application
import io.legado.app.base.BaseViewModel import io.legado.app.base.BaseViewModel
import io.legado.app.data.appDb import io.legado.app.data.appDb
import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.BaseSource
import io.legado.app.utils.toastOnUi import io.legado.app.utils.toastOnUi
class SourceLoginViewModel(application: Application) : BaseViewModel(application) { class SourceLoginViewModel(application: Application) : BaseViewModel(application) {
var bookSource: BookSource? = null var source: BaseSource? = null
fun initData(sourceUrl: String, success: (bookSource: BookSource) -> Unit) { fun initData(sourceUrl: String, success: (bookSource: BaseSource) -> Unit) {
execute { execute {
bookSource = appDb.bookSourceDao.getBookSource(sourceUrl) source = appDb.bookSourceDao.getBookSource(sourceUrl)
bookSource if (source == null) {
source = appDb.rssSourceDao.getByKey(sourceUrl)
}
source
}.onSuccess { }.onSuccess {
if (it != null) { if (it != null) {
success.invoke(it) success.invoke(it)

@ -27,7 +27,7 @@ class WebViewLoginFragment : BaseFragment(R.layout.fragment_web_view_login) {
private var checking = false private var checking = false
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
viewModel.bookSource?.let { viewModel.source?.let {
binding.titleBar.title = getString(R.string.login_source, it.bookSourceName) binding.titleBar.title = getString(R.string.login_source, it.bookSourceName)
initWebView(it) initWebView(it)
} }
@ -43,7 +43,7 @@ class WebViewLoginFragment : BaseFragment(R.layout.fragment_web_view_login) {
if (!checking) { if (!checking) {
checking = true checking = true
binding.titleBar.snackbar(R.string.check_host_cookie) binding.titleBar.snackbar(R.string.check_host_cookie)
viewModel.bookSource?.loginUrl?.let { viewModel.source?.loginUrl?.let {
binding.webView.loadUrl(it) binding.webView.loadUrl(it)
} }
} }

@ -12,11 +12,18 @@ import androidx.fragment.app.FragmentStatePagerAdapter
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.databinding.ActivityRssArtivlesBinding import io.legado.app.databinding.ActivityRssArtivlesBinding
import io.legado.app.databinding.DialogEditTextBinding
import io.legado.app.lib.dialogs.alert
import io.legado.app.ui.login.SourceLoginActivity
import io.legado.app.ui.rss.source.edit.RssSourceEditActivity import io.legado.app.ui.rss.source.edit.RssSourceEditActivity
import io.legado.app.utils.StartActivityForResult import io.legado.app.utils.StartActivityForResult
import io.legado.app.utils.gone import io.legado.app.utils.gone
import io.legado.app.utils.startActivity
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
import io.legado.app.utils.visible import io.legado.app.utils.visible
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewModel>() { class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewModel>() {
@ -52,8 +59,18 @@ class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewMo
return super.onCompatCreateOptionsMenu(menu) return super.onCompatCreateOptionsMenu(menu)
} }
override fun onMenuOpened(featureId: Int, menu: Menu): Boolean {
menu.findItem(R.id.menu_login)?.isVisible =
!viewModel.rssSource?.loginUrl.isNullOrBlank()
return super.onMenuOpened(featureId, menu)
}
override fun onCompatOptionsItemSelected(item: MenuItem): Boolean { override fun onCompatOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.menu_login -> startActivity<SourceLoginActivity> {
putExtra("sourceUrl", viewModel.rssSource?.sourceUrl)
}
R.id.menu_set_source_variable -> setSourceVariable()
R.id.menu_edit_source -> viewModel.rssSource?.sourceUrl?.let { R.id.menu_edit_source -> viewModel.rssSource?.sourceUrl?.let {
editSourceResult.launch { editSourceResult.launch {
putExtra("data", it) putExtra("data", it)
@ -85,6 +102,27 @@ class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewMo
adapter.notifyDataSetChanged() adapter.notifyDataSetChanged()
} }
private fun setSourceVariable() {
launch {
val variable = withContext(Dispatchers.IO) { viewModel.rssSource?.getVariable() }
alert(R.string.set_source_variable) {
setMessage("源变量可在js中通过source.getVariable()获取")
val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply {
editView.hint = "source variable"
editView.setText(variable)
}
customView { alertBinding.root }
okButton {
viewModel.rssSource?.setVariable(alertBinding.editView.text?.toString())
}
cancelButton()
neutralButton(R.string.delete) {
viewModel.rssSource?.setVariable(null)
}
}.show()
}
}
private inner class TabFragmentPageAdapter : private inner class TabFragmentPageAdapter :
FragmentStatePagerAdapter(supportFragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { FragmentStatePagerAdapter(supportFragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {

Loading…
Cancel
Save