阅读记录添加最后阅读时间
This commit is contained in:
@@ -10,7 +10,7 @@ interface ReadRecordDao {
|
|||||||
@get:Query("select * from readRecord")
|
@get:Query("select * from readRecord")
|
||||||
val all: List<ReadRecord>
|
val all: List<ReadRecord>
|
||||||
|
|
||||||
@get:Query("select bookName, sum(readTime) as readTime from readRecord group by bookName order by bookName collate localized")
|
@get:Query("select bookName, sum(readTime) as readTime, max(lastRead) as lastRead from readRecord group by bookName order by bookName collate localized")
|
||||||
val allShow: List<ReadRecordShow>
|
val allShow: List<ReadRecordShow>
|
||||||
|
|
||||||
@get:Query("select sum(readTime) from readRecord")
|
@get:Query("select sum(readTime) from readRecord")
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package io.legado.app.data.entities
|
package io.legado.app.data.entities
|
||||||
|
|
||||||
data class ReadRecordShow(
|
data class ReadRecordShow(
|
||||||
var bookName: String = "",
|
var bookName: String,
|
||||||
var readTime: Long = 0L
|
var readTime: Long,
|
||||||
|
var lastRead: Long
|
||||||
)
|
)
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package io.legado.app.ui.about
|
package io.legado.app.ui.about
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.icu.text.SimpleDateFormat
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.Menu
|
import android.view.Menu
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
@@ -18,6 +19,7 @@ import io.legado.app.lib.dialogs.alert
|
|||||||
import io.legado.app.ui.book.read.ReadBookActivity
|
import io.legado.app.ui.book.read.ReadBookActivity
|
||||||
import io.legado.app.ui.book.search.SearchActivity
|
import io.legado.app.ui.book.search.SearchActivity
|
||||||
import io.legado.app.utils.cnCompare
|
import io.legado.app.utils.cnCompare
|
||||||
|
import io.legado.app.utils.gone
|
||||||
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
|
||||||
@@ -50,10 +52,17 @@ class ReadRecordActivity : BaseActivity<ActivityReadRecordBinding>() {
|
|||||||
when (item.itemId) {
|
when (item.itemId) {
|
||||||
R.id.menu_sort_name -> {
|
R.id.menu_sort_name -> {
|
||||||
sortMode = 0
|
sortMode = 0
|
||||||
|
item.isChecked = true
|
||||||
initData()
|
initData()
|
||||||
}
|
}
|
||||||
R.id.menu_sort_time -> {
|
R.id.menu_sort_read_long -> {
|
||||||
sortMode = 1
|
sortMode = 1
|
||||||
|
item.isChecked = true
|
||||||
|
initData()
|
||||||
|
}
|
||||||
|
R.id.menu_sort_read_time -> {
|
||||||
|
sortMode = 2
|
||||||
|
item.isChecked = true
|
||||||
initData()
|
initData()
|
||||||
}
|
}
|
||||||
R.id.menu_enable_record -> {
|
R.id.menu_enable_record -> {
|
||||||
@@ -65,6 +74,9 @@ class ReadRecordActivity : BaseActivity<ActivityReadRecordBinding>() {
|
|||||||
|
|
||||||
private fun initView() = binding.run {
|
private fun initView() = binding.run {
|
||||||
readRecord.tvBookName.setText(R.string.all_read_time)
|
readRecord.tvBookName.setText(R.string.all_read_time)
|
||||||
|
readRecord.tvLastReadTimeTag.gone()
|
||||||
|
readRecord.tvLastReadTimeTag.gone()
|
||||||
|
readRecord.tvLastReadTime.gone()
|
||||||
recyclerView.adapter = adapter
|
recyclerView.adapter = adapter
|
||||||
readRecord.tvRemove.setOnClickListener {
|
readRecord.tvRemove.setOnClickListener {
|
||||||
alert(R.string.delete, R.string.sure_del) {
|
alert(R.string.delete, R.string.sure_del) {
|
||||||
@@ -82,11 +94,12 @@ class ReadRecordActivity : BaseActivity<ActivityReadRecordBinding>() {
|
|||||||
val allTime = withContext(IO) {
|
val allTime = withContext(IO) {
|
||||||
appDb.readRecordDao.allTime
|
appDb.readRecordDao.allTime
|
||||||
}
|
}
|
||||||
binding.readRecord.tvReadTime.text = formatDuring(allTime)
|
binding.readRecord.tvReadingTime.text = formatDuring(allTime)
|
||||||
val readRecords = withContext(IO) {
|
val readRecords = withContext(IO) {
|
||||||
appDb.readRecordDao.allShow.let { records ->
|
appDb.readRecordDao.allShow.let { records ->
|
||||||
when (sortMode) {
|
when (sortMode) {
|
||||||
1 -> records.sortedBy { it.readTime }
|
1 -> records.sortedByDescending { it.readTime }
|
||||||
|
2 -> records.sortedByDescending { it.lastRead }
|
||||||
else -> records.sortedWith { o1, o2 ->
|
else -> records.sortedWith { o1, o2 ->
|
||||||
o1.bookName.cnCompare(o2.bookName)
|
o1.bookName.cnCompare(o2.bookName)
|
||||||
}
|
}
|
||||||
@@ -100,6 +113,8 @@ class ReadRecordActivity : BaseActivity<ActivityReadRecordBinding>() {
|
|||||||
inner class RecordAdapter(context: Context) :
|
inner class RecordAdapter(context: Context) :
|
||||||
RecyclerAdapter<ReadRecordShow, ItemReadRecordBinding>(context) {
|
RecyclerAdapter<ReadRecordShow, ItemReadRecordBinding>(context) {
|
||||||
|
|
||||||
|
private val dateFormat = SimpleDateFormat("yyyy-MM-dd")
|
||||||
|
|
||||||
override fun getViewBinding(parent: ViewGroup): ItemReadRecordBinding {
|
override fun getViewBinding(parent: ViewGroup): ItemReadRecordBinding {
|
||||||
return ItemReadRecordBinding.inflate(inflater, parent, false)
|
return ItemReadRecordBinding.inflate(inflater, parent, false)
|
||||||
}
|
}
|
||||||
@@ -112,7 +127,8 @@ class ReadRecordActivity : BaseActivity<ActivityReadRecordBinding>() {
|
|||||||
) {
|
) {
|
||||||
binding.apply {
|
binding.apply {
|
||||||
tvBookName.text = item.bookName
|
tvBookName.text = item.bookName
|
||||||
tvReadTime.text = formatDuring(item.readTime)
|
tvReadingTime.text = formatDuring(item.readTime)
|
||||||
|
tvLastReadTime.text = dateFormat.format(item.lastRead)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,16 +21,50 @@
|
|||||||
tools:ignore="RtlHardcoded" />
|
tools:ignore="RtlHardcoded" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/tv_read_time"
|
android:id="@+id/tv_reading_time_tag"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:padding="6dp"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:text="@string/reading_time_tag"
|
||||||
|
android:textColor="@color/secondaryText"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/tv_book_name" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_reading_time"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:padding="6dp"
|
android:padding="6dp"
|
||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
android:textColor="@color/secondaryText"
|
android:textColor="@color/secondaryText"
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
app:layout_constraintLeft_toRightOf="@+id/tv_reading_time_tag"
|
||||||
app:layout_constraintTop_toBottomOf="@id/tv_book_name"
|
app:layout_constraintTop_toBottomOf="@id/tv_book_name"
|
||||||
app:layout_constraintRight_toLeftOf="@+id/tv_remove"
|
app:layout_constraintRight_toLeftOf="@+id/tv_remove"
|
||||||
tools:text="time" />
|
tools:text="readingTime" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_last_read_time_tag"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:padding="6dp"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:text="@string/last_read_time_tag"
|
||||||
|
android:textColor="@color/secondaryText"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/tv_reading_time_tag" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_last_read_time"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:padding="6dp"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:textColor="@color/secondaryText"
|
||||||
|
app:layout_constraintLeft_toRightOf="@+id/tv_last_read_time_tag"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/tv_reading_time_tag"
|
||||||
|
app:layout_constraintRight_toLeftOf="@+id/tv_remove"
|
||||||
|
tools:text="readingTime" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/tv_remove"
|
android:id="@+id/tv_remove"
|
||||||
@@ -40,7 +74,7 @@
|
|||||||
android:text="@string/clear"
|
android:text="@string/clear"
|
||||||
android:textColor="@color/primaryText"
|
android:textColor="@color/primaryText"
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="@id/tv_book_name"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintBottom_toBottomOf="@+id/tv_read_time" />
|
app:layout_constraintBottom_toBottomOf="parent" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -1,21 +1,44 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/menu_sort"
|
||||||
|
android:icon="@drawable/ic_baseline_sort_24"
|
||||||
|
android:title="@string/sort"
|
||||||
|
app:showAsAction="always"
|
||||||
|
tools:ignore="AlwaysShowAction">
|
||||||
|
|
||||||
|
<menu>
|
||||||
|
<group
|
||||||
|
android:id="@+id/menu_group_sort"
|
||||||
|
android:checkableBehavior="single">
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/menu_sort_name"
|
android:id="@+id/menu_sort_name"
|
||||||
android:title="@string/sort_by_name"
|
android:title="@string/sort_by_name" />
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/menu_sort_read_long"
|
||||||
|
android:title="@string/reading_time_sort"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/menu_sort_time"
|
android:id="@+id/menu_sort_read_time"
|
||||||
android:title="@string/sort_by_time"
|
android:title="@string/last_read_time_sort"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
|
|
||||||
|
</group>
|
||||||
|
|
||||||
|
</menu>
|
||||||
|
|
||||||
|
</item>
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/menu_enable_record"
|
android:id="@+id/menu_enable_record"
|
||||||
android:title="@string/enable_record"
|
|
||||||
android:checkable="true"
|
android:checkable="true"
|
||||||
|
android:title="@string/enable_record"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
|
|
||||||
</menu>
|
</menu>
|
||||||
@@ -999,4 +999,8 @@
|
|||||||
<string name="error_image_url_empty">Image url is empty, check replacement rules</string>
|
<string name="error_image_url_empty">Image url is empty, check replacement rules</string>
|
||||||
<string name="variable_comment">变量说明(variableComment)</string>
|
<string name="variable_comment">变量说明(variableComment)</string>
|
||||||
<string name="remote_book">远程书籍</string>
|
<string name="remote_book">远程书籍</string>
|
||||||
|
<string name="reading_time_sort">阅读时长排序</string>
|
||||||
|
<string name="last_read_time_sort">阅读时间排序</string>
|
||||||
|
<string name="reading_time_tag">阅读时长:</string>
|
||||||
|
<string name="last_read_time_tag">最后阅读时间:</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1002,4 +1002,8 @@
|
|||||||
<string name="error_image_url_empty">Image url is empty, check replacement rules</string>
|
<string name="error_image_url_empty">Image url is empty, check replacement rules</string>
|
||||||
<string name="variable_comment">变量说明(variableComment)</string>
|
<string name="variable_comment">变量说明(variableComment)</string>
|
||||||
<string name="remote_book">远程书籍</string>
|
<string name="remote_book">远程书籍</string>
|
||||||
|
<string name="reading_time_sort">阅读时长排序</string>
|
||||||
|
<string name="last_read_time_sort">阅读时间排序</string>
|
||||||
|
<string name="reading_time_tag">阅读时长:</string>
|
||||||
|
<string name="last_read_time_tag">最后阅读时间:</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1002,4 +1002,8 @@
|
|||||||
<string name="error_image_url_empty">Image url is empty, check replacement rules</string>
|
<string name="error_image_url_empty">Image url is empty, check replacement rules</string>
|
||||||
<string name="variable_comment">变量说明(variableComment)</string>
|
<string name="variable_comment">变量说明(variableComment)</string>
|
||||||
<string name="remote_book">远程书籍</string>
|
<string name="remote_book">远程书籍</string>
|
||||||
|
<string name="reading_time_sort">阅读时长排序</string>
|
||||||
|
<string name="last_read_time_sort">阅读时间排序</string>
|
||||||
|
<string name="reading_time_tag">阅读时长:</string>
|
||||||
|
<string name="last_read_time_tag">最后阅读时间:</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -999,4 +999,8 @@
|
|||||||
<string name="error_image_url_empty">图片链接为空,检查替换净化规则</string>
|
<string name="error_image_url_empty">图片链接为空,检查替换净化规则</string>
|
||||||
<string name="variable_comment">变量说明(variableComment)</string>
|
<string name="variable_comment">变量说明(variableComment)</string>
|
||||||
<string name="remote_book">远程书籍</string>
|
<string name="remote_book">远程书籍</string>
|
||||||
|
<string name="reading_time_sort">阅读时长排序</string>
|
||||||
|
<string name="last_read_time_sort">阅读时间排序</string>
|
||||||
|
<string name="reading_time_tag">阅读时长:</string>
|
||||||
|
<string name="last_read_time_tag">最后阅读时间:</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1001,4 +1001,8 @@
|
|||||||
<string name="error_image_url_empty">图片链接为空,检查替换净化规则</string>
|
<string name="error_image_url_empty">图片链接为空,检查替换净化规则</string>
|
||||||
<string name="variable_comment">变量说明(variableComment)</string>
|
<string name="variable_comment">变量说明(variableComment)</string>
|
||||||
<string name="remote_book">远程书籍</string>
|
<string name="remote_book">远程书籍</string>
|
||||||
|
<string name="reading_time_sort">阅读时长排序</string>
|
||||||
|
<string name="last_read_time_sort">阅读时间排序</string>
|
||||||
|
<string name="reading_time_tag">阅读时长:</string>
|
||||||
|
<string name="last_read_time_tag">最后阅读时间:</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1001,4 +1001,8 @@
|
|||||||
<string name="error_image_url_empty">图片链接为空,检查替换净化规则</string>
|
<string name="error_image_url_empty">图片链接为空,检查替换净化规则</string>
|
||||||
<string name="variable_comment">变量说明(variableComment)</string>
|
<string name="variable_comment">变量说明(variableComment)</string>
|
||||||
<string name="remote_book">远程书籍</string>
|
<string name="remote_book">远程书籍</string>
|
||||||
|
<string name="reading_time_sort">阅读时长排序</string>
|
||||||
|
<string name="last_read_time_sort">阅读时间排序</string>
|
||||||
|
<string name="reading_time_tag">阅读时长:</string>
|
||||||
|
<string name="last_read_time_tag">最后阅读时间:</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1002,4 +1002,8 @@
|
|||||||
<string name="error_image_url_empty">Image url is empty, check replacement rules</string>
|
<string name="error_image_url_empty">Image url is empty, check replacement rules</string>
|
||||||
<string name="variable_comment">变量说明(variableComment)</string>
|
<string name="variable_comment">变量说明(variableComment)</string>
|
||||||
<string name="remote_book">远程书籍</string>
|
<string name="remote_book">远程书籍</string>
|
||||||
|
<string name="reading_time_sort">阅读时长排序</string>
|
||||||
|
<string name="last_read_time_sort">阅读时间排序</string>
|
||||||
|
<string name="reading_time_tag">阅读时长:</string>
|
||||||
|
<string name="last_read_time_tag">最后阅读时间:</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user