Skip to content

Commit

Permalink
优化rss阅读记录查看和删除 (#4568)
Browse files Browse the repository at this point in the history
* 优化rss阅读记录查看和删除

* 优化rss阅读记录功能
  • Loading branch information
niu-hb authored Jan 24, 2025
1 parent 36672b1 commit aa70f71
Show file tree
Hide file tree
Showing 11 changed files with 2,103 additions and 35 deletions.
1,930 changes: 1,930 additions & 0 deletions app/schemas/io.legado.app.data.AppDatabase/74.json

Large diffs are not rendered by default.

5 changes: 4 additions & 1 deletion app/src/main/java/io/legado/app/data/AppDatabase.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import io.legado.app.data.dao.KeyboardAssistsDao
import io.legado.app.data.dao.ReadRecordDao
import io.legado.app.data.dao.ReplaceRuleDao
import io.legado.app.data.dao.RssArticleDao
import io.legado.app.data.dao.RssReadRecordDao
import io.legado.app.data.dao.RssSourceDao
import io.legado.app.data.dao.RssStarDao
import io.legado.app.data.dao.RuleSubDao
Expand Down Expand Up @@ -63,7 +64,7 @@ val appDb by lazy {
}

@Database(
version = 73,
version = 74,
exportSchema = true,
entities = [Book::class, BookGroup::class, BookSource::class, BookChapter::class,
ReplaceRule::class, SearchBook::class, SearchKeyword::class, Cookie::class,
Expand Down Expand Up @@ -101,6 +102,7 @@ val appDb by lazy {
AutoMigration(from = 70, to = 71),
AutoMigration(from = 71, to = 72),
AutoMigration(from = 72, to = 73),
AutoMigration(from = 73, to = 74),
]
)
abstract class AppDatabase : RoomDatabase() {
Expand All @@ -116,6 +118,7 @@ abstract class AppDatabase : RoomDatabase() {
abstract val bookmarkDao: BookmarkDao
abstract val rssArticleDao: RssArticleDao
abstract val rssStarDao: RssStarDao
abstract val rssReadRecordDao: RssReadRecordDao
abstract val cookieDao: CookieDao
abstract val txtTocRuleDao: TxtTocRuleDao
abstract val readRecordDao: ReadRecordDao
Expand Down
10 changes: 0 additions & 10 deletions app/src/main/java/io/legado/app/data/dao/RssArticleDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package io.legado.app.data.dao

import androidx.room.*
import io.legado.app.data.entities.RssArticle
import io.legado.app.data.entities.RssReadRecord
import kotlinx.coroutines.flow.Flow

@Dao
Expand Down Expand Up @@ -38,13 +37,4 @@ interface RssArticleDao {
@Query("delete from rssArticles where origin = :origin")
fun delete(origin: String)

@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insertRecord(vararg rssReadRecord: RssReadRecord)

@get:Query("select count(1) from rssReadRecords")
val countRead: Int

@Query("delete from rssReadRecords")
fun deleteRecord()

}
21 changes: 21 additions & 0 deletions app/src/main/java/io/legado/app/data/dao/RssReadRecordDao.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package io.legado.app.data.dao

import androidx.room.*
import io.legado.app.data.entities.RssReadRecord

@Dao
interface RssReadRecordDao {

@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insertRecord(vararg rssReadRecord: RssReadRecord)

@Query("select * from rssReadRecords order by readTime desc")
fun getRecord(): List<RssReadRecord>

@get:Query("select count(1) from rssReadRecords")
val countRead: Int

@Query("delete from rssReadRecords")
fun deleteRecord()

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ import androidx.room.PrimaryKey

@Entity(tableName = "rssReadRecords")
data class RssReadRecord(
@PrimaryKey val record: String,
@PrimaryKey
val record: String,
val title: String? = null,
val readTime: Long? = null,
val read: Boolean = true
)
88 changes: 88 additions & 0 deletions app/src/main/java/io/legado/app/ui/rss/article/ReadRecordDialog.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package io.legado.app.ui.rss.article

import android.content.Context
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.LinearLayoutManager
import io.legado.app.R
import io.legado.app.base.BaseDialogFragment
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.RecyclerAdapter
import io.legado.app.data.entities.RssReadRecord
import io.legado.app.databinding.DialogRecyclerViewBinding
import io.legado.app.databinding.ItemRssReadRecordBinding
import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.primaryColor
import io.legado.app.utils.setLayout
import io.legado.app.utils.viewbindingdelegate.viewBinding

class ReadRecordDialog : BaseDialogFragment(R.layout.dialog_recycler_view),
Toolbar.OnMenuItemClickListener {

private val viewModel by viewModels<RssSortViewModel>()
private val binding by viewBinding(DialogRecyclerViewBinding::bind)
private val adapter by lazy {
ReadRecordAdapter(requireContext())
}

override fun onStart() {
super.onStart()
setLayout(0.9f, ViewGroup.LayoutParams.WRAP_CONTENT)
}

override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
binding.run {
toolBar.setBackgroundColor(primaryColor)
toolBar.setTitle(R.string.read_record)
toolBar.inflateMenu(R.menu.rss_read_record)
toolBar.setOnMenuItemClickListener(this@ReadRecordDialog)
recyclerView.layoutManager = LinearLayoutManager(requireContext())
recyclerView.adapter = adapter
}
adapter.setItems(viewModel.getRecord())
}

override fun onMenuItemClick(item: MenuItem?): Boolean {
when (item?.itemId) {
R.id.menu_clear -> {
alert(R.string.draw) {
val countRead = viewModel.countRead()
setMessage(getString(R.string.sure_del) + "\n" + countRead + " " + getString(R.string.read_record))
noButton()
yesButton{
viewModel.delReadRecord()
adapter.clearItems()
}
}
}
}
return true
}

inner class ReadRecordAdapter(context: Context) :
RecyclerAdapter<RssReadRecord, ItemRssReadRecordBinding>(context) {

override fun getViewBinding(parent: ViewGroup): ItemRssReadRecordBinding {
return ItemRssReadRecordBinding.inflate(inflater, parent, false)
}

override fun convert(
holder: ItemViewHolder,
binding: ItemRssReadRecordBinding,
item: RssReadRecord,
payloads: MutableList<Any>
) {
binding.textTitle.text = item.title
binding.textRecord.text = item.record
}

override fun registerListener(holder: ItemViewHolder, binding: ItemRssReadRecordBinding) {
}

}

}
16 changes: 2 additions & 14 deletions app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import io.legado.app.R
import io.legado.app.base.VMBaseActivity
import io.legado.app.databinding.ActivityRssArtivlesBinding
import io.legado.app.help.source.sortUrls
import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.accentColor
import io.legado.app.ui.login.SourceLoginActivity
import io.legado.app.ui.rss.source.edit.RssSourceEditActivity
Expand Down Expand Up @@ -92,8 +91,8 @@ class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewMo
upFragments()
}

R.id.menu_del_read_record -> {
delReadRecord()
R.id.menu_read_record -> {
showDialogFragment<ReadRecordDialog>()
}
}
return super.onCompatOptionsItemSelected(item)
Expand All @@ -114,17 +113,6 @@ class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewMo
}
}

private fun delReadRecord() {
alert(R.string.draw) {
val countRead = viewModel.countRead()
setMessage(getString(R.string.sure_del) + "\n" + countRead + " " + getString(R.string.read_record))
noButton()
yesButton(){
viewModel.delReadRecord()
}
}
}

private fun setSourceVariable() {
lifecycleScope.launch {
val source = viewModel.rssSource
Expand Down
19 changes: 14 additions & 5 deletions app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class RssSortViewModel(application: Application) : BaseViewModel(application) {
fun switchLayout() {
rssSource?.let {
if (it.articleStyle < 2) {
it.articleStyle = it.articleStyle + 1
it.articleStyle += 1
} else {
it.articleStyle = 0
}
Expand All @@ -49,7 +49,12 @@ class RssSortViewModel(application: Application) : BaseViewModel(application) {

fun read(rssArticle: RssArticle) {
execute {
appDb.rssArticleDao.insertRecord(RssReadRecord(rssArticle.link))
val rssReadRecord = RssReadRecord(
record = rssArticle.link,
title = rssArticle.title,
readTime = System.currentTimeMillis()
)
appDb.rssReadRecordDao.insertRecord(rssReadRecord)
}
}

Expand All @@ -72,13 +77,17 @@ class RssSortViewModel(application: Application) : BaseViewModel(application) {
}
}

fun countRead() : Int{
return appDb.rssArticleDao.countRead
fun getRecord(): List<RssReadRecord> {
return appDb.rssReadRecordDao.getRecord()
}

fun countRead() : Int {
return appDb.rssReadRecordDao.countRead
}

fun delReadRecord() {
execute {
appDb.rssArticleDao.deleteRecord()
appDb.rssReadRecordDao.deleteRecord()
}
}

Expand Down
24 changes: 24 additions & 0 deletions app/src/main/res/layout/item_rss_read_record.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?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="wrap_content"
android:padding="6dp"
android:background="?android:attr/selectableItemBackground"
android:orientation="vertical">

<TextView
android:id="@+id/text_title"
android:text="@string/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textIsSelectable="true" />

<TextView
android:id="@+id/text_record"
android:text="@string/read_record"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="web"
android:textIsSelectable="true" />

</LinearLayout>
8 changes: 4 additions & 4 deletions app/src/main/res/menu/rss_articles.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,13 @@
app:showAsAction="never" />

<item
android:id="@+id/menu_clear"
android:title="@string/clear"
android:id="@+id/menu_read_record"
android:title="@string/read_record"
app:showAsAction="never" />

<item
android:id="@+id/menu_del_read_record"
android:title="@string/del_read_record"
android:id="@+id/menu_clear"
android:title="@string/clear"
app:showAsAction="never" />

</menu>
12 changes: 12 additions & 0 deletions app/src/main/res/menu/rss_read_record.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="AlwaysShowAction">

<item
android:id="@+id/menu_clear"
android:title="@string/clear"
app:showAsAction="always" />

</menu>

0 comments on commit aa70f71

Please sign in to comment.