This commit is contained in:
Horis
2024-07-05 12:53:46 +08:00
parent 37c61fcc86
commit 369cad6869
12 changed files with 91 additions and 18 deletions
+1
View File
@@ -81,6 +81,7 @@ class App : Application() {
val clearTime = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1) val clearTime = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1)
appDb.searchBookDao.clearExpired(clearTime) appDb.searchBookDao.clearExpired(clearTime)
} }
appDb.bookDao.deleteNotShelfBook()
RuleBigDataHelp.clearInvalid() RuleBigDataHelp.clearInvalid()
BookHelp.clearInvalidCache() BookHelp.clearInvalidCache()
Backup.clearCache() Backup.clearCache()
@@ -43,9 +43,14 @@ object BookType {
*/ */
const val archive = 0b1000000000 const val archive = 0b1000000000
/**
* 1024 未正式加入到书架的临时阅读书籍
*/
const val notShelf = 0b100_0000_0000
@Target(AnnotationTarget.VALUE_PARAMETER) @Target(AnnotationTarget.VALUE_PARAMETER)
@Retention(AnnotationRetention.SOURCE) @Retention(AnnotationRetention.SOURCE)
@IntDef(text, updateError, audio, image, webFile, local, archive) @IntDef(text, updateError, audio, image, webFile, local, archive, notShelf)
annotation class Type annotation class Type
@@ -148,4 +148,7 @@ interface BookDao {
@Query("update books set `group` = `group` - :group where `group` & :group > 0") @Query("update books set `group` = `group` - :group where `group` & :group > 0")
fun removeGroup(group: Long) fun removeGroup(group: Long)
@Query("delete from books where type & ${BookType.notShelf} > 0")
fun deleteNotShelfBook()
} }
@@ -223,6 +223,10 @@ fun BookSource.getBookType(): Int {
} }
} }
fun BookSource.getAllBookType(): Int {
return BookType.text or BookType.image or BookType.audio or BookType.webFile
}
fun Book.sync(oldBook: Book) { fun Book.sync(oldBook: Book) {
val curBook = appDb.bookDao.getBook(oldBook.bookUrl)!! val curBook = appDb.bookDao.getBook(oldBook.bookUrl)!!
durChapterTime = curBook.durChapterTime durChapterTime = curBook.durChapterTime
@@ -22,6 +22,7 @@ import io.legado.app.service.BaseReadAloudService
import io.legado.app.ui.book.read.page.entities.TextChapter import io.legado.app.ui.book.read.page.entities.TextChapter
import io.legado.app.ui.book.read.page.provider.ChapterProvider import io.legado.app.ui.book.read.page.provider.ChapterProvider
import io.legado.app.ui.book.read.page.provider.LayoutProgressListener import io.legado.app.ui.book.read.page.provider.LayoutProgressListener
import io.legado.app.utils.LogUtils
import io.legado.app.utils.stackTraceStr import io.legado.app.utils.stackTraceStr
import io.legado.app.utils.toastOnUi import io.legado.app.utils.toastOnUi
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@@ -97,6 +98,7 @@ object ReadBook : CoroutineScope by MainScope() {
durChapterPos = book.durChapterPos durChapterPos = book.durChapterPos
isLocalBook = book.isLocal isLocalBook = book.isLocal
clearTextChapter() clearTextChapter()
callBack?.upContent()
callBack?.upMenuView() callBack?.upMenuView()
callBack?.upPageAnim() callBack?.upPageAnim()
upWebBook(book) upWebBook(book)
@@ -6,7 +6,10 @@ 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.data.entities.SearchBook import io.legado.app.data.entities.SearchBook
import io.legado.app.exception.NoStackTraceException import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.book.addType
import io.legado.app.help.book.getAllBookType
import io.legado.app.help.book.getBookType import io.legado.app.help.book.getBookType
import io.legado.app.help.book.removeType
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.http.StrResponse import io.legado.app.help.http.StrResponse
import io.legado.app.model.Debug import io.legado.app.model.Debug
@@ -144,7 +147,8 @@ object WebBook {
book: Book, book: Book,
canReName: Boolean = true, canReName: Boolean = true,
): Book { ): Book {
book.type = bookSource.getBookType() book.removeType(bookSource.getAllBookType())
book.addType(bookSource.getBookType())
if (!book.infoHtml.isNullOrEmpty()) { if (!book.infoHtml.isNullOrEmpty()) {
BookInfo.analyzeBookInfo( BookInfo.analyzeBookInfo(
bookSource = bookSource, bookSource = bookSource,
@@ -220,7 +224,8 @@ object WebBook {
book: Book, book: Book,
runPerJs: Boolean = false runPerJs: Boolean = false
): Result<List<BookChapter>> { ): Result<List<BookChapter>> {
book.type = bookSource.getBookType() book.removeType(bookSource.getAllBookType())
book.addType(bookSource.getBookType())
return kotlin.runCatching { return kotlin.runCatching {
if (runPerJs) { if (runPerJs) {
runPreUpdateJs(bookSource, book).getOrThrow() runPreUpdateJs(bookSource, book).getOrThrow()
@@ -22,6 +22,7 @@ import io.legado.app.data.entities.BookSource
import io.legado.app.databinding.ActivityBookInfoBinding import io.legado.app.databinding.ActivityBookInfoBinding
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.getRemoteUrl import io.legado.app.help.book.getRemoteUrl
import io.legado.app.help.book.isAudio import io.legado.app.help.book.isAudio
import io.legado.app.help.book.isLocal import io.legado.app.help.book.isLocal
@@ -45,6 +46,7 @@ import io.legado.app.ui.book.changesource.ChangeBookSourceDialog
import io.legado.app.ui.book.group.GroupSelectDialog import io.legado.app.ui.book.group.GroupSelectDialog
import io.legado.app.ui.book.info.edit.BookInfoEditActivity import io.legado.app.ui.book.info.edit.BookInfoEditActivity
import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.book.read.ReadBookActivity
import io.legado.app.ui.book.read.ReadBookActivity.Companion.RESULT_DELETED
import io.legado.app.ui.book.search.SearchActivity import io.legado.app.ui.book.search.SearchActivity
import io.legado.app.ui.book.source.edit.BookSourceEditActivity import io.legado.app.ui.book.source.edit.BookSourceEditActivity
import io.legado.app.ui.book.toc.TocActivityResult import io.legado.app.ui.book.toc.TocActivityResult
@@ -106,9 +108,16 @@ class BookInfoActivity :
ActivityResultContracts.StartActivityForResult() ActivityResultContracts.StartActivityForResult()
) { ) {
viewModel.upBook(intent) viewModel.upBook(intent)
if (it.resultCode == RESULT_OK) { when (it.resultCode) {
viewModel.inBookshelf = true RESULT_OK -> {
upTvBookshelf() viewModel.inBookshelf = true
upTvBookshelf()
}
RESULT_DELETED -> {
setResult(RESULT_OK)
finish()
}
} }
} }
private val infoEditResult = registerForActivityResult( private val infoEditResult = registerForActivityResult(
@@ -550,6 +559,7 @@ class BookInfoActivity :
LocalConfig.deleteBookOriginal = checkBox.isChecked LocalConfig.deleteBookOriginal = checkBox.isChecked
} }
viewModel.delBook(LocalConfig.deleteBookOriginal) { viewModel.delBook(LocalConfig.deleteBookOriginal) {
setResult(RESULT_OK)
finish() finish()
} }
} }
@@ -557,6 +567,7 @@ class BookInfoActivity :
} }
} else { } else {
viewModel.delBook(LocalConfig.deleteBookOriginal) { viewModel.delBook(LocalConfig.deleteBookOriginal) {
setResult(RESULT_OK)
finish() finish()
} }
} }
@@ -637,6 +648,7 @@ class BookInfoActivity :
private fun readBook(book: Book) { private fun readBook(book: Book) {
if (!viewModel.inBookshelf) { if (!viewModel.inBookshelf) {
book.addType(BookType.notShelf)
viewModel.saveBook(book) { viewModel.saveBook(book) {
viewModel.saveChapterList { viewModel.saveChapterList {
startReadActivity(book) startReadActivity(book)
@@ -424,6 +424,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
fun addToBookshelf(success: (() -> Unit)?) { fun addToBookshelf(success: (() -> Unit)?) {
execute { execute {
bookData.value?.let { book -> bookData.value?.let { book ->
book.removeType(BookType.notShelf)
if (book.order == 0) { if (book.order == 0) {
book.order = appDb.bookDao.minOrder - 1 book.order = appDb.bookDao.minOrder - 1
} }
@@ -12,11 +12,21 @@ import io.legado.app.constant.BookType
import io.legado.app.data.entities.Book import io.legado.app.data.entities.Book
import io.legado.app.databinding.ActivityBookInfoEditBinding import io.legado.app.databinding.ActivityBookInfoEditBinding
import io.legado.app.help.book.BookHelp import io.legado.app.help.book.BookHelp
import io.legado.app.help.book.addType
import io.legado.app.help.book.isAudio import io.legado.app.help.book.isAudio
import io.legado.app.help.book.isImage import io.legado.app.help.book.isImage
import io.legado.app.help.book.isLocal import io.legado.app.help.book.isLocal
import io.legado.app.help.book.removeType
import io.legado.app.ui.book.changecover.ChangeCoverDialog import io.legado.app.ui.book.changecover.ChangeCoverDialog
import io.legado.app.utils.* import io.legado.app.utils.FileUtils
import io.legado.app.utils.MD5Utils
import io.legado.app.utils.SelectImageContract
import io.legado.app.utils.externalFiles
import io.legado.app.utils.inputStream
import io.legado.app.utils.launch
import io.legado.app.utils.readUri
import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.toastOnUi
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
import splitties.init.appCtx import splitties.init.appCtx
import java.io.FileOutputStream import java.io.FileOutputStream
@@ -100,11 +110,13 @@ class BookInfoEditActivity :
book.name = tieBookName.text?.toString() ?: "" book.name = tieBookName.text?.toString() ?: ""
book.author = tieBookAuthor.text?.toString() ?: "" book.author = tieBookAuthor.text?.toString() ?: ""
val local = if (book.isLocal) BookType.local else 0 val local = if (book.isLocal) BookType.local else 0
book.type = when (spType.selectedItemPosition) { val bookType = when (spType.selectedItemPosition) {
2 -> BookType.image or local 2 -> BookType.image or local
1 -> BookType.audio or local 1 -> BookType.audio or local
else -> BookType.text or local else -> BookType.text or local
} }
book.removeType(BookType.local, BookType.image, BookType.audio, BookType.text)
book.addType(bookType)
val customCoverUrl = tieCoverUrl.text?.toString() val customCoverUrl = tieCoverUrl.text?.toString()
book.customCoverUrl = if (customCoverUrl == book.coverUrl) null else customCoverUrl book.customCoverUrl = if (customCoverUrl == book.coverUrl) null else customCoverUrl
book.customIntro = tieBookIntro.text?.toString() book.customIntro = tieBookIntro.text?.toString()
@@ -66,6 +66,7 @@ import io.legado.app.ui.book.audio.AudioPlayActivity
import io.legado.app.ui.book.bookmark.BookmarkDialog import io.legado.app.ui.book.bookmark.BookmarkDialog
import io.legado.app.ui.book.changesource.ChangeBookSourceDialog import io.legado.app.ui.book.changesource.ChangeBookSourceDialog
import io.legado.app.ui.book.changesource.ChangeChapterSourceDialog import io.legado.app.ui.book.changesource.ChangeChapterSourceDialog
import io.legado.app.ui.book.info.BookInfoActivity
import io.legado.app.ui.book.read.config.AutoReadDialog import io.legado.app.ui.book.read.config.AutoReadDialog
import io.legado.app.ui.book.read.config.BgTextConfigDialog.Companion.BG_COLOR import io.legado.app.ui.book.read.config.BgTextConfigDialog.Companion.BG_COLOR
import io.legado.app.ui.book.read.config.BgTextConfigDialog.Companion.TEXT_COLOR import io.legado.app.ui.book.read.config.BgTextConfigDialog.Companion.TEXT_COLOR
@@ -189,6 +190,13 @@ class ReadBookActivity : BaseReadBookActivity(),
} }
} }
} }
private val bookInfoActivity =
registerForActivityResult(StartActivityContract(BookInfoActivity::class.java)) {
if (it.resultCode == RESULT_OK) {
setResult(RESULT_DELETED)
super.finish()
}
}
private val selectImageDir = registerForActivityResult(HandleFileContract()) { private val selectImageDir = registerForActivityResult(HandleFileContract()) {
it.uri?.let { uri -> it.uri?.let { uri ->
ACache.get().put(AppConst.imagePathKey, uri.toString()) ACache.get().put(AppConst.imagePathKey, uri.toString())
@@ -232,7 +240,6 @@ class ReadBookActivity : BaseReadBookActivity(),
binding.readMenu.upSeekBar() binding.readMenu.upSeekBar()
} }
} }
private var upContent = true
//恢复跳转前进度对话框的交互结果 //恢复跳转前进度对话框的交互结果
private var confirmRestoreProcess: Boolean? = null private var confirmRestoreProcess: Boolean? = null
@@ -284,6 +291,9 @@ class ReadBookActivity : BaseReadBookActivity(),
override fun onNewIntent(intent: Intent?) { override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent) super.onNewIntent(intent)
if (!ReadBook.inBookshelf) {
viewModel.removeFromBookshelf(null)
}
viewModel.initData(intent ?: return) viewModel.initData(intent ?: return)
} }
@@ -953,6 +963,9 @@ class ReadBookActivity : BaseReadBookActivity(),
override fun notifyBookChanged() { override fun notifyBookChanged() {
bookChanged = true bookChanged = true
if (!ReadBook.inBookshelf) {
viewModel.removeFromBookshelf { super.finish() }
}
} }
/** /**
@@ -1063,6 +1076,15 @@ class ReadBookActivity : BaseReadBookActivity(),
} }
} }
override fun openBookInfoActivity() {
ReadBook.book?.let {
bookInfoActivity.launch {
putExtra("name", it.name)
putExtra("author", it.author)
}
}
}
/** /**
* 替换 * 替换
*/ */
@@ -1462,6 +1484,8 @@ class ReadBookActivity : BaseReadBookActivity(),
alert(title = getString(R.string.add_to_bookshelf)) { alert(title = getString(R.string.add_to_bookshelf)) {
setMessage(getString(R.string.check_add_bookshelf, book.name)) setMessage(getString(R.string.check_add_bookshelf, book.name))
okButton { okButton {
ReadBook.book?.removeType(BookType.notShelf)
ReadBook.book?.save()
ReadBook.inBookshelf = true ReadBook.inBookshelf = true
setResult(Activity.RESULT_OK) setResult(Activity.RESULT_OK)
} }
@@ -1477,6 +1501,9 @@ class ReadBookActivity : BaseReadBookActivity(),
popupAction.dismiss() popupAction.dismiss()
binding.readView.onDestroy() binding.readView.onDestroy()
ReadBook.unregister(this) ReadBook.unregister(this)
if (!ReadBook.inBookshelf) {
viewModel.removeFromBookshelf(null)
}
if (!BuildConfig.DEBUG) { if (!BuildConfig.DEBUG) {
Backup.autoBack(this) Backup.autoBack(this)
} }
@@ -1578,4 +1605,9 @@ class ReadBookActivity : BaseReadBookActivity(),
} }
} }
} }
companion object {
const val RESULT_DELETED = 100
}
} }
@@ -316,8 +316,9 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
} }
fun removeFromBookshelf(success: (() -> Unit)?) { fun removeFromBookshelf(success: (() -> Unit)?) {
execute { val book = ReadBook.book
ReadBook.book?.delete() Coroutine.async {
book?.delete()
}.onSuccess { }.onSuccess {
success?.invoke() success?.invoke()
} }
@@ -35,7 +35,6 @@ import io.legado.app.lib.theme.getPrimaryTextColor
import io.legado.app.lib.theme.primaryColor import io.legado.app.lib.theme.primaryColor
import io.legado.app.lib.theme.primaryTextColor import io.legado.app.lib.theme.primaryTextColor
import io.legado.app.model.ReadBook import io.legado.app.model.ReadBook
import io.legado.app.ui.book.info.BookInfoActivity
import io.legado.app.ui.browser.WebViewActivity import io.legado.app.ui.browser.WebViewActivity
import io.legado.app.ui.widget.seekbar.SeekBarChangeListener import io.legado.app.ui.widget.seekbar.SeekBarChangeListener
import io.legado.app.utils.ColorUtils import io.legado.app.utils.ColorUtils
@@ -332,12 +331,7 @@ class ReadMenu @JvmOverloads constructor(
private fun bindEvent() = binding.run { private fun bindEvent() = binding.run {
vwMenuBg.setOnClickListener { runMenuOut() } vwMenuBg.setOnClickListener { runMenuOut() }
titleBar.toolbar.setOnClickListener { titleBar.toolbar.setOnClickListener {
ReadBook.book?.let { callBack.openBookInfoActivity()
context.startActivity<BookInfoActivity> {
putExtra("name", it.name)
putExtra("author", it.author)
}
}
} }
val chapterViewClickListener = OnClickListener { val chapterViewClickListener = OnClickListener {
if (ReadBook.isLocalBook) { if (ReadBook.isLocalBook) {
@@ -575,6 +569,7 @@ class ReadMenu @JvmOverloads constructor(
fun openChapterList() fun openChapterList()
fun openSearchActivity(searchWord: String?) fun openSearchActivity(searchWord: String?)
fun openSourceEditActivity() fun openSourceEditActivity()
fun openBookInfoActivity()
fun showReadStyle() fun showReadStyle()
fun showMoreSetting() fun showMoreSetting()
fun showReadAloudDialog() fun showReadAloudDialog()