diff --git a/app/src/main/java/io/legado/app/data/entities/BaseSource.kt b/app/src/main/java/io/legado/app/data/entities/BaseSource.kt index d704cc957..7a7864a7e 100644 --- a/app/src/main/java/io/legado/app/data/entities/BaseSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/BaseSource.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? // 登录UI var header: String? // 请求头 + fun getName(): String + fun getStoreUrl(): String fun getLoginJs(): String? { diff --git a/app/src/main/java/io/legado/app/data/entities/BookSource.kt b/app/src/main/java/io/legado/app/data/entities/BookSource.kt index c72b0dc4f..625b9155b 100644 --- a/app/src/main/java/io/legado/app/data/entities/BookSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/BookSource.kt @@ -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? = null, //登录UI + override var loginUi: List? = 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 } diff --git a/app/src/main/java/io/legado/app/data/entities/RssSource.kt b/app/src/main/java/io/legado/app/data/entities/RssSource.kt index 2127067cb..f54c0546c 100644 --- a/app/src/main/java/io/legado/app/data/entities/RssSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/RssSource.kt @@ -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? = null, //登录UI + override var loginUi: List? = 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 } diff --git a/app/src/main/java/io/legado/app/ui/login/RuleUiLoginDialog.kt b/app/src/main/java/io/legado/app/ui/login/RuleUiLoginDialog.kt index f7f856e53..63ad91368 100644 --- a/app/src/main/java/io/legado/app/ui/login/RuleUiLoginDialog.kt +++ b/app/src/main/java/io/legado/app/ui/login/RuleUiLoginDialog.kt @@ -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) { + private fun login(source: BaseSource, loginData: HashMap) { 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() diff --git a/app/src/main/java/io/legado/app/ui/login/SourceLoginActivity.kt b/app/src/main/java/io/legado/app/ui/login/SourceLoginActivity.kt index cbd7ebe23..c72f43b2f 100644 --- a/app/src/main/java/io/legado/app/ui/login/SourceLoginActivity.kt +++ b/app/src/main/java/io/legado/app/ui/login/SourceLoginActivity.kt @@ -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 - 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() diff --git a/app/src/main/java/io/legado/app/ui/login/SourceLoginViewModel.kt b/app/src/main/java/io/legado/app/ui/login/SourceLoginViewModel.kt index f6ec8c962..217ce8722 100644 --- a/app/src/main/java/io/legado/app/ui/login/SourceLoginViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/login/SourceLoginViewModel.kt @@ -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) diff --git a/app/src/main/java/io/legado/app/ui/login/WebViewLoginFragment.kt b/app/src/main/java/io/legado/app/ui/login/WebViewLoginFragment.kt index 9e955edab..843046c54 100644 --- a/app/src/main/java/io/legado/app/ui/login/WebViewLoginFragment.kt +++ b/app/src/main/java/io/legado/app/ui/login/WebViewLoginFragment.kt @@ -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) } } diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt index 8d8f2e36c..02b823c91 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt @@ -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() { @@ -52,8 +59,18 @@ class RssSortActivity : VMBaseActivity startActivity { + 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