This commit is contained in:
Horis
2024-09-26 15:14:26 +08:00
parent a762ba4587
commit ae1c2bbce3
7 changed files with 35 additions and 45 deletions
@@ -11,10 +11,10 @@ interface RssStarDao {
val all: List<RssStar> val all: List<RssStar>
@Query("select `group` from rssStars group by `group` order by `group`") @Query("select `group` from rssStars group by `group` order by `group`")
fun groupList(): Flow<List<String>> fun flowGroups(): Flow<List<String>>
@Query("select * from rssStars where `group` = :group order by starTime desc") @Query("select * from rssStars where `group` = :group order by starTime desc")
fun getByGroup(group: String): Flow<List<RssStar>> fun flowByGroup(group: String): Flow<List<RssStar>>
@Query("select * from rssStars where origin = :origin and link = :link") @Query("select * from rssStars where origin = :origin and link = :link")
fun get(origin: String, link: String): RssStar? fun get(origin: String, link: String): RssStar?
@@ -3,7 +3,6 @@
package io.legado.app.ui.rss.favorites package io.legado.app.ui.rss.favorites
import android.os.Bundle import android.os.Bundle
import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentStatePagerAdapter import androidx.fragment.app.FragmentStatePagerAdapter
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
@@ -16,8 +15,8 @@ import io.legado.app.utils.gone
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.IO import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -29,21 +28,23 @@ class RssFavoritesActivity : BaseActivity<ActivityRssFavoritesBinding>(){
override val binding by viewBinding(ActivityRssFavoritesBinding::inflate) override val binding by viewBinding(ActivityRssFavoritesBinding::inflate)
private val adapter by lazy { TabFragmentPageAdapter() } private val adapter by lazy { TabFragmentPageAdapter() }
private var groupList = mutableListOf<String>() private var groupList = mutableListOf<String>()
private var rssStarFlowJob: Job? = null
override fun onActivityCreated(savedInstanceState: Bundle?) { override fun onActivityCreated(savedInstanceState: Bundle?) {
binding.viewPager.adapter = adapter initView()
binding.tabLayout.setupWithViewPager(binding.viewPager)
binding.tabLayout.setSelectedTabIndicatorColor(accentColor)
upFragments() upFragments()
} }
private fun initView() {
binding.viewPager.adapter = adapter
binding.tabLayout.setupWithViewPager(binding.viewPager)
binding.tabLayout.setSelectedTabIndicatorColor(accentColor)
}
private fun upFragments() { private fun upFragments() {
rssStarFlowJob?.cancel() lifecycleScope.launch {
rssStarFlowJob = lifecycleScope.launch { appDb.rssStarDao.flowGroups().catch {
appDb.rssStarDao.groupList().catch {
AppLog.put("订阅分组数据获取失败\n${it.localizedMessage}", it) AppLog.put("订阅分组数据获取失败\n${it.localizedMessage}", it)
}.flowOn(IO).collect { }.distinctUntilChanged().flowOn(IO).collect {
groupList.clear() groupList.clear()
groupList.addAll(it) groupList.addAll(it)
if (groupList.size == 1) { if (groupList.size == 1) {
@@ -76,9 +77,5 @@ class RssFavoritesActivity : BaseActivity<ActivityRssFavoritesBinding>(){
return groupList.size return groupList.size
} }
override fun instantiateItem(container: ViewGroup, position: Int): Any {
val fragment = super.instantiateItem(container, position) as Fragment
return fragment
}
} }
} }
@@ -1,20 +1,17 @@
package io.legado.app.ui.rss.favorites package io.legado.app.ui.rss.favorites
import android.os.Bundle import android.os.Bundle
import android.text.TextUtils
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.lifecycle.lifecycleScope
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.RssArticle import io.legado.app.data.entities.RssArticle
import io.legado.app.databinding.DialogRssfavoritesBinding import io.legado.app.databinding.DialogRssFavoriteConfigBinding
import io.legado.app.lib.theme.primaryColor import io.legado.app.lib.theme.primaryColor
import io.legado.app.utils.setLayout import io.legado.app.utils.setLayout
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.launch
class RssFavoritesDialog() : BaseDialogFragment(R.layout.dialog_rssfavorites, true) { class RssFavoritesDialog() : BaseDialogFragment(R.layout.dialog_rss_favorite_config, true) {
constructor(rssArticle: RssArticle) : this() { constructor(rssArticle: RssArticle) : this() {
arguments = Bundle().apply { arguments = Bundle().apply {
@@ -23,7 +20,7 @@ class RssFavoritesDialog() : BaseDialogFragment(R.layout.dialog_rssfavorites, tr
} }
} }
private val binding by viewBinding(DialogRssfavoritesBinding::bind) private val binding by viewBinding(DialogRssFavoriteConfigBinding::bind)
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
@@ -47,26 +44,22 @@ class RssFavoritesDialog() : BaseDialogFragment(R.layout.dialog_rssfavorites, tr
} }
tvOk.setOnClickListener { tvOk.setOnClickListener {
val editTitle = editTitle.text.toString() val editTitle = editTitle.text.toString()
if(!TextUtils.isEmpty(editTitle)){ if (editTitle.isNotBlank()) {
title = editTitle title = editTitle
} }
val editGroup = editGroup.text.toString() val editGroup = editGroup.text.toString()
if(!TextUtils.isEmpty(editGroup)){ if (editGroup.isNotBlank()) {
group = editGroup group = editGroup
} }
lifecycleScope.launch {
callback?.updateFavorite(title, group) callback?.updateFavorite(title, group)
dismiss() dismiss()
} }
}
tvFooterLeft.setOnClickListener { tvFooterLeft.setOnClickListener {
lifecycleScope.launch {
callback?.deleteFavorite() callback?.deleteFavorite()
dismiss() dismiss()
} }
} }
} }
}
val callback get() = (parentFragment as? Callback) ?: (activity as? Callback) val callback get() = (parentFragment as? Callback) ?: (activity as? Callback)
@@ -19,7 +19,6 @@ import io.legado.app.utils.setEdgeEffectColor
import io.legado.app.utils.startActivity import io.legado.app.utils.startActivity
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -38,28 +37,26 @@ class RssFavoritesFragment() : VMBaseFragment<RssFavoritesViewModel>(R.layout.fr
private val adapter: RssFavoritesAdapter by lazy { private val adapter: RssFavoritesAdapter by lazy {
RssFavoritesAdapter(requireContext(), this@RssFavoritesFragment) RssFavoritesAdapter(requireContext(), this@RssFavoritesFragment)
} }
private var articlesFlowJob: Job? = null
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
initView() initView()
loadArticles()
} }
private fun initView() = binding.run { private fun initView() = binding.run {
refreshLayout.setEnabled(false) refreshLayout.isEnabled = false
recyclerView.setEdgeEffectColor(primaryColor) recyclerView.setEdgeEffectColor(primaryColor)
recyclerView.layoutManager = run { recyclerView.layoutManager = run {
recyclerView.addItemDecoration(VerticalDivider(requireContext())) recyclerView.addItemDecoration(VerticalDivider(requireContext()))
LinearLayoutManager(requireContext()) LinearLayoutManager(requireContext())
} }
recyclerView.adapter = adapter recyclerView.adapter = adapter
loadArticles()
} }
private fun loadArticles() { private fun loadArticles() {
articlesFlowJob?.cancel() lifecycleScope.launch {
articlesFlowJob = lifecycleScope.launch {
val group = arguments?.getString("group") ?: "默认分组" val group = arguments?.getString("group") ?: "默认分组"
appDb.rssStarDao.getByGroup(group).catch { appDb.rssStarDao.flowByGroup(group).catch {
AppLog.put("订阅文章界面获取数据失败\n${it.localizedMessage}", it) AppLog.put("订阅文章界面获取数据失败\n${it.localizedMessage}", it)
}.flowOn(IO).collect { }.flowOn(IO).collect {
adapter.setItems(it) adapter.setItems(it)
@@ -72,7 +72,8 @@ import java.util.regex.PatternSyntaxException
/** /**
* rss阅读界面 * rss阅读界面
*/ */
class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>(), RssFavoritesDialog.Callback { class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>(),
RssFavoritesDialog.Callback {
override val binding by viewBinding(ActivityRssReadBinding::inflate) override val binding by viewBinding(ActivityRssReadBinding::inflate)
override val viewModel by viewModels<ReadRssViewModel>() override val viewModel by viewModels<ReadRssViewModel>()
@@ -153,12 +154,14 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
R.id.menu_rss_refresh -> viewModel.refresh { R.id.menu_rss_refresh -> viewModel.refresh {
binding.webView.reload() binding.webView.reload()
} }
R.id.menu_rss_star -> { R.id.menu_rss_star -> {
viewModel.addFavorite() viewModel.addFavorite()
viewModel.rssArticle?.let { viewModel.rssArticle?.let {
showDialogFragment(RssFavoritesDialog(it)) showDialogFragment(RssFavoritesDialog(it))
} }
} }
R.id.menu_share_it -> { R.id.menu_share_it -> {
binding.webView.url?.let { binding.webView.url?.let {
share(it) share(it)