订阅添加登录

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

@ -29,7 +29,7 @@ data class BookSource(
override var concurrentRate: String? = null, //并发率
override var header: 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 bookSourceComment: String? = null, // 注释
var lastUpdateTime: Long = 0, // 最后更新时间,用于排序
@ -44,6 +44,10 @@ data class BookSource(
var ruleContent: ContentRule? = null // 正文页规则
) : Parcelable, BaseSource {
override fun getName(): String {
return bookSourceName
}
override fun getStoreUrl(): String {
return bookSourceUrl
}

@ -23,7 +23,7 @@ data class RssSource(
override var concurrentRate: String? = null, //并发率
override var header: 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 sortUrl: String? = null,
var singleUrl: Boolean = false,
@ -45,6 +45,10 @@ data class RssSource(
var customOrder: Int = 0
) : Parcelable, BaseSource {
override fun getName(): String {
return sourceName
}
override fun getStoreUrl(): String {
return sourceUrl
}

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

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

@ -3,17 +3,20 @@ package io.legado.app.ui.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.data.entities.BaseSource
import io.legado.app.utils.toastOnUi
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 {
bookSource = appDb.bookSourceDao.getBookSource(sourceUrl)
bookSource
source = appDb.bookSourceDao.getBookSource(sourceUrl)
if (source == null) {
source = appDb.rssSourceDao.getByKey(sourceUrl)
}
source
}.onSuccess {
if (it != null) {
success.invoke(it)

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

@ -12,11 +12,18 @@ import androidx.fragment.app.FragmentStatePagerAdapter
import io.legado.app.R
import io.legado.app.base.VMBaseActivity
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.utils.StartActivityForResult
import io.legado.app.utils.gone
import io.legado.app.utils.startActivity
import io.legado.app.utils.viewbindingdelegate.viewBinding
import io.legado.app.utils.visible
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewModel>() {
@ -52,8 +59,18 @@ class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewMo
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 {
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 {
editSourceResult.launch {
putExtra("data", it)
@ -85,6 +102,27 @@ class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewMo
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 :
FragmentStatePagerAdapter(supportFragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {

Loading…
Cancel
Save