[新增] 增加书籍备注功能 #425
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -67,7 +67,7 @@ val appDb by lazy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Database(
|
@Database(
|
||||||
version = 79,
|
version = 80,
|
||||||
exportSchema = true,
|
exportSchema = true,
|
||||||
entities = [Book::class, BookGroup::class, BookSource::class, BookChapter::class,
|
entities = [Book::class, BookGroup::class, BookSource::class, BookChapter::class,
|
||||||
ReplaceRule::class, SearchBook::class, SearchKeyword::class, Cookie::class,
|
ReplaceRule::class, SearchBook::class, SearchKeyword::class, Cookie::class,
|
||||||
@@ -112,7 +112,8 @@ val appDb by lazy {
|
|||||||
AutoMigration(from = 75, to = 76),
|
AutoMigration(from = 75, to = 76),
|
||||||
AutoMigration(from = 76, to = 77),
|
AutoMigration(from = 76, to = 77),
|
||||||
AutoMigration(from = 77, to = 78),
|
AutoMigration(from = 77, to = 78),
|
||||||
AutoMigration(from = 78, to = 79)
|
AutoMigration(from = 78, to = 79),
|
||||||
|
AutoMigration(from = 79, to = 80)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
abstract class AppDatabase : RoomDatabase() {
|
abstract class AppDatabase : RoomDatabase() {
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ data class Book(
|
|||||||
var intro: String? = null,
|
var intro: String? = null,
|
||||||
// 简介内容(用户修改)
|
// 简介内容(用户修改)
|
||||||
var customIntro: String? = null,
|
var customIntro: String? = null,
|
||||||
|
var remark: String? = null,
|
||||||
// 自定义字符集名称(仅适用于本地书籍)
|
// 自定义字符集名称(仅适用于本地书籍)
|
||||||
var charset: String? = null,
|
var charset: String? = null,
|
||||||
// 类型,详见BookType
|
// 类型,详见BookType
|
||||||
|
|||||||
@@ -346,6 +346,7 @@ fun Book.getExportFileName(suffix: String): String {
|
|||||||
inside.equals("author", ignoreCase = true) -> getRealAuthor()
|
inside.equals("author", ignoreCase = true) -> getRealAuthor()
|
||||||
inside.equals("group", ignoreCase = true) -> group
|
inside.equals("group", ignoreCase = true) -> group
|
||||||
inside.equals("source", ignoreCase = true) -> originName
|
inside.equals("source", ignoreCase = true) -> originName
|
||||||
|
inside.equals("remark", ignoreCase = true) -> remark
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -521,7 +521,7 @@ class CacheActivity : VMBaseActivity<ActivityCacheBookBinding, CacheViewModel>()
|
|||||||
private fun alertExportFileName() {
|
private fun alertExportFileName() {
|
||||||
alert(R.string.export_file_name) {
|
alert(R.string.export_file_name) {
|
||||||
val message = """
|
val message = """
|
||||||
支持变量:{name}(书名)、{author}(作者)、{group}(分组)、{source}(书源)。
|
支持变量:{name}(书名)、{author}(作者)、{group}(分组)、{source}(书源)、{remark}(备注)。
|
||||||
可以在字段前后加任意字符。
|
可以在字段前后加任意字符。
|
||||||
|
|
||||||
示例:
|
示例:
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ import io.legado.app.data.entities.Book
|
|||||||
import io.legado.app.data.entities.BookChapter
|
import io.legado.app.data.entities.BookChapter
|
||||||
import io.legado.app.data.entities.BookSource
|
import io.legado.app.data.entities.BookSource
|
||||||
import io.legado.app.databinding.ActivityBookInfoBinding
|
import io.legado.app.databinding.ActivityBookInfoBinding
|
||||||
|
import io.legado.app.databinding.DialogEditTextBinding
|
||||||
import io.legado.app.exception.NoStackTraceException
|
import io.legado.app.exception.NoStackTraceException
|
||||||
import io.legado.app.help.AppWebDav
|
import io.legado.app.help.AppWebDav
|
||||||
import io.legado.app.help.book.addType
|
import io.legado.app.help.book.addType
|
||||||
@@ -396,13 +397,13 @@ class BookInfoActivity :
|
|||||||
book.removeType(BookType.notShelf)
|
book.removeType(BookType.notShelf)
|
||||||
book.save()
|
book.save()
|
||||||
viewModel.inBookshelf = true
|
viewModel.inBookshelf = true
|
||||||
super.finish()
|
super.finishAfterTransition()
|
||||||
}
|
}
|
||||||
noButton { super.finish() }
|
noButton { super.finishAfterTransition() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
finish()
|
finishAfterTransition()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -440,6 +441,11 @@ class BookInfoActivity :
|
|||||||
showCover(book)
|
showCover(book)
|
||||||
addColorScheme(binding.ivCover.drawable)
|
addColorScheme(binding.ivCover.drawable)
|
||||||
tvName.text = book.name
|
tvName.text = book.name
|
||||||
|
tvRemark.text = book.remark
|
||||||
|
if (book.remark == null)
|
||||||
|
cdRemark.gone()
|
||||||
|
else
|
||||||
|
cdRemark.visible()
|
||||||
tvAuthor.text = getString(R.string.author_show, book.getRealAuthor())
|
tvAuthor.text = getString(R.string.author_show, book.getRealAuthor())
|
||||||
tvOrigin.text = getString(R.string.origin_show, book.originName)
|
tvOrigin.text = getString(R.string.origin_show, book.originName)
|
||||||
tvLasted.text = getString(R.string.lasted_show, book.latestChapterTitle)
|
tvLasted.text = getString(R.string.lasted_show, book.latestChapterTitle)
|
||||||
@@ -599,6 +605,7 @@ class BookInfoActivity :
|
|||||||
val color = animation.animatedValue as Int
|
val color = animation.animatedValue as Int
|
||||||
binding.lbKind.applyColorScheme(color, colorOnSurface)
|
binding.lbKind.applyColorScheme(color, colorOnSurface)
|
||||||
binding.collTopBar.setContentScrimColor(color)
|
binding.collTopBar.setContentScrimColor(color)
|
||||||
|
binding.cdRemark.strokeColor = color
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -618,6 +625,7 @@ class BookInfoActivity :
|
|||||||
}
|
}
|
||||||
binding.div.setTextColor(color)
|
binding.div.setTextColor(color)
|
||||||
binding.tvChapterIndex.setTextColor(color)
|
binding.tvChapterIndex.setTextColor(color)
|
||||||
|
binding.tvRemark.setTextColor(color)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -844,7 +852,19 @@ class BookInfoActivity :
|
|||||||
tvName.maxLines = if (tvName.maxLines == 3) 10 else 3
|
tvName.maxLines = if (tvName.maxLines == 3) 10 else 3
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
cdRemark.setOnClickListener {
|
||||||
|
alert(R.string.edit_remark) {
|
||||||
|
val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply {
|
||||||
|
editLayout.hint = "编辑备注"
|
||||||
|
editView.setText(book?.remark)
|
||||||
|
}
|
||||||
|
customView { alertBinding.root }
|
||||||
|
okButton {
|
||||||
|
viewModel.saveRemark(alertBinding.editView.text.toString())
|
||||||
|
}
|
||||||
|
cancelButton()
|
||||||
|
}
|
||||||
|
}
|
||||||
refreshLayout.setOnRefreshListener {
|
refreshLayout.setOnRefreshListener {
|
||||||
refreshLayout.isRefreshing = false
|
refreshLayout.isRefreshing = false
|
||||||
refreshBook()
|
refreshBook()
|
||||||
|
|||||||
@@ -378,6 +378,17 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun saveRemark(remark: String, success: (() -> Unit)? = null) {
|
||||||
|
execute {
|
||||||
|
bookData.value?.let {
|
||||||
|
it.remark = remark
|
||||||
|
it.save()
|
||||||
|
}
|
||||||
|
}.onSuccess {
|
||||||
|
success?.invoke()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun saveBook(book: Book?, success: (() -> Unit)? = null) {
|
fun saveBook(book: Book?, success: (() -> Unit)? = null) {
|
||||||
book ?: return
|
book ?: return
|
||||||
execute {
|
execute {
|
||||||
|
|||||||
@@ -340,6 +340,33 @@
|
|||||||
app:layout_constraintStart_toEndOf="@id/div"
|
app:layout_constraintStart_toEndOf="@id/div"
|
||||||
tools:text="@string/read_chapter_index" />
|
tools:text="@string/read_chapter_index" />
|
||||||
|
|
||||||
|
<com.google.android.material.card.MaterialCardView
|
||||||
|
android:id="@+id/cd_remark"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
app:cardBackgroundColor="@android:color/transparent"
|
||||||
|
android:layout_marginHorizontal="16dp"
|
||||||
|
android:layout_marginVertical="8dp"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/tv_chapter">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_remark"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:clickable="false"
|
||||||
|
android:focusable="false"
|
||||||
|
android:layout_margin="12dp"
|
||||||
|
android:lineSpacingExtra="4dp"
|
||||||
|
android:text="@string/book_intro"
|
||||||
|
android:textIsSelectable="true"
|
||||||
|
android:textSize="12sp"
|
||||||
|
tools:text="@string/book_intro" />
|
||||||
|
|
||||||
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/tv_detail"
|
android:id="@+id/tv_detail"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
@@ -356,7 +383,7 @@
|
|||||||
android:visibility="visible"
|
android:visibility="visible"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/tv_chapter"
|
app:layout_constraintTop_toBottomOf="@id/cd_remark"
|
||||||
tools:text="@string/book_intro" />
|
tools:text="@string/book_intro" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|||||||
@@ -72,7 +72,6 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="@drawable/bg_gradient_mask"
|
android:background="@drawable/bg_gradient_mask"
|
||||||
android:paddingTop="8dp"
|
|
||||||
android:paddingBottom="4dp"
|
android:paddingBottom="4dp"
|
||||||
app:layout_constraintTop_toTopOf="parent">
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
@@ -235,7 +234,6 @@
|
|||||||
app:iconPadding="4dp"
|
app:iconPadding="4dp"
|
||||||
app:iconSize="20dp" />
|
app:iconSize="20dp" />
|
||||||
|
|
||||||
<!-- 查看目录按钮 -->
|
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:id="@+id/tv_toc_view"
|
android:id="@+id/tv_toc_view"
|
||||||
style="@style/Widget.Material3Expressive.Button.TextButton"
|
style="@style/Widget.Material3Expressive.Button.TextButton"
|
||||||
@@ -251,7 +249,6 @@
|
|||||||
app:iconPadding="4dp"
|
app:iconPadding="4dp"
|
||||||
app:iconSize="20dp" />
|
app:iconSize="20dp" />
|
||||||
|
|
||||||
<!-- 更换分组按钮 -->
|
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:id="@+id/tv_change_group"
|
android:id="@+id/tv_change_group"
|
||||||
style="@style/Widget.Material3Expressive.Button.TextButton"
|
style="@style/Widget.Material3Expressive.Button.TextButton"
|
||||||
@@ -267,7 +264,6 @@
|
|||||||
app:iconPadding="4dp"
|
app:iconPadding="4dp"
|
||||||
app:iconSize="20dp" />
|
app:iconSize="20dp" />
|
||||||
|
|
||||||
<!-- 更换来源按钮(保持原样) -->
|
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:id="@+id/btn_change_source"
|
android:id="@+id/btn_change_source"
|
||||||
style="@style/Widget.Material3Expressive.Button.TextButton"
|
style="@style/Widget.Material3Expressive.Button.TextButton"
|
||||||
@@ -310,7 +306,6 @@
|
|||||||
app:layout_constraintTop_toBottomOf="@id/tv_toc"
|
app:layout_constraintTop_toBottomOf="@id/tv_toc"
|
||||||
tools:text="@string/read_dur_progress" />
|
tools:text="@string/read_dur_progress" />
|
||||||
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/tv_chapter"
|
android:id="@+id/tv_chapter"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
@@ -349,12 +344,40 @@
|
|||||||
app:layout_constraintStart_toEndOf="@id/div"
|
app:layout_constraintStart_toEndOf="@id/div"
|
||||||
tools:text="@string/read_chapter_index" />
|
tools:text="@string/read_chapter_index" />
|
||||||
|
|
||||||
|
<com.google.android.material.card.MaterialCardView
|
||||||
|
android:id="@+id/cd_remark"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
app:cardBackgroundColor="@android:color/transparent"
|
||||||
|
android:layout_marginHorizontal="16dp"
|
||||||
|
android:layout_marginVertical="8dp"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/tv_chapter">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_remark"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:clickable="false"
|
||||||
|
android:focusable="false"
|
||||||
|
android:layout_margin="12dp"
|
||||||
|
android:lineSpacingExtra="4dp"
|
||||||
|
android:text="@string/book_intro"
|
||||||
|
android:textIsSelectable="true"
|
||||||
|
android:textSize="12sp"
|
||||||
|
tools:text="@string/book_intro" />
|
||||||
|
|
||||||
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/tv_detail"
|
android:id="@+id/tv_detail"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginHorizontal="16dp"
|
android:layout_marginHorizontal="16dp"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="8dp"
|
||||||
android:paddingBottom="120dp"
|
android:paddingBottom="120dp"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:focusable="true"
|
android:focusable="true"
|
||||||
@@ -365,7 +388,7 @@
|
|||||||
android:visibility="visible"
|
android:visibility="visible"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/tv_chapter"
|
app:layout_constraintTop_toBottomOf="@id/cd_remark"
|
||||||
tools:text="@string/book_intro" />
|
tools:text="@string/book_intro" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|||||||
@@ -168,6 +168,22 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content" />
|
android:layout_height="wrap_content" />
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/til_remark"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
style="@style/Widget.Material3.TextInputLayout.FilledBox.Dense"
|
||||||
|
android:hint="@string/book_remark"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/til_book_jj">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/tie_remark"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
</androidx.core.widget.NestedScrollView>
|
</androidx.core.widget.NestedScrollView>
|
||||||
|
|
||||||
|
|||||||
@@ -1360,4 +1360,6 @@
|
|||||||
<string name="cover_show_stroke">显示字体描边</string>
|
<string name="cover_show_stroke">显示字体描边</string>
|
||||||
<string name="default_color">使用默认字体颜色</string>
|
<string name="default_color">使用默认字体颜色</string>
|
||||||
<string name="enable_slider_vibrator">滑动进度条时震动</string>
|
<string name="enable_slider_vibrator">滑动进度条时震动</string>
|
||||||
|
<string name="edit_remark">编辑备注</string>
|
||||||
|
<string name="book_remark">书籍备注</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1363,4 +1363,6 @@
|
|||||||
<string name="cover_show_stroke">显示字体描边</string>
|
<string name="cover_show_stroke">显示字体描边</string>
|
||||||
<string name="default_color">使用默认字体颜色</string>
|
<string name="default_color">使用默认字体颜色</string>
|
||||||
<string name="enable_slider_vibrator">滑动进度条时震动</string>
|
<string name="enable_slider_vibrator">滑动进度条时震动</string>
|
||||||
|
<string name="edit_remark">编辑备注</string>
|
||||||
|
<string name="book_remark">书籍备注</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user