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

View File

@@ -81,6 +81,7 @@ class App : Application() {
val clearTime = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1)
appDb.searchBookDao.clearExpired(clearTime)
}
appDb.bookDao.deleteNotShelfBook()
RuleBigDataHelp.clearInvalid()
BookHelp.clearInvalidCache()
Backup.clearCache()

View File

@@ -43,9 +43,14 @@ object BookType {
*/
const val archive = 0b1000000000
/**
* 1024 未正式加入到书架的临时阅读书籍
*/
const val notShelf = 0b100_0000_0000
@Target(AnnotationTarget.VALUE_PARAMETER)
@Retention(AnnotationRetention.SOURCE)
@IntDef(text, updateError, audio, image, webFile, local, archive)
@IntDef(text, updateError, audio, image, webFile, local, archive, notShelf)
annotation class Type

View File

@@ -148,4 +148,7 @@ interface BookDao {
@Query("update books set `group` = `group` - :group where `group` & :group > 0")
fun removeGroup(group: Long)
@Query("delete from books where type & ${BookType.notShelf} > 0")
fun deleteNotShelfBook()
}

View File

@@ -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) {
val curBook = appDb.bookDao.getBook(oldBook.bookUrl)!!
durChapterTime = curBook.durChapterTime

View File

@@ -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.provider.ChapterProvider
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.toastOnUi
import kotlinx.coroutines.CoroutineScope
@@ -97,6 +98,7 @@ object ReadBook : CoroutineScope by MainScope() {
durChapterPos = book.durChapterPos
isLocalBook = book.isLocal
clearTextChapter()
callBack?.upContent()
callBack?.upMenuView()
callBack?.upPageAnim()
upWebBook(book)

View File

@@ -6,7 +6,10 @@ import io.legado.app.data.entities.BookChapter
import io.legado.app.data.entities.BookSource
import io.legado.app.data.entities.SearchBook
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.removeType
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.http.StrResponse
import io.legado.app.model.Debug
@@ -144,7 +147,8 @@ object WebBook {
book: Book,
canReName: Boolean = true,
): Book {
book.type = bookSource.getBookType()
book.removeType(bookSource.getAllBookType())
book.addType(bookSource.getBookType())
if (!book.infoHtml.isNullOrEmpty()) {
BookInfo.analyzeBookInfo(
bookSource = bookSource,
@@ -220,7 +224,8 @@ object WebBook {
book: Book,
runPerJs: Boolean = false
): Result<List<BookChapter>> {
book.type = bookSource.getBookType()
book.removeType(bookSource.getAllBookType())
book.addType(bookSource.getBookType())
return kotlin.runCatching {
if (runPerJs) {
runPreUpdateJs(bookSource, book).getOrThrow()

View File

@@ -22,6 +22,7 @@ import io.legado.app.data.entities.BookSource
import io.legado.app.databinding.ActivityBookInfoBinding
import io.legado.app.exception.NoStackTraceException
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.isAudio
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.info.edit.BookInfoEditActivity
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.source.edit.BookSourceEditActivity
import io.legado.app.ui.book.toc.TocActivityResult
@@ -106,9 +108,16 @@ class BookInfoActivity :
ActivityResultContracts.StartActivityForResult()
) {
viewModel.upBook(intent)
if (it.resultCode == RESULT_OK) {
viewModel.inBookshelf = true
upTvBookshelf()
when (it.resultCode) {
RESULT_OK -> {
viewModel.inBookshelf = true
upTvBookshelf()
}
RESULT_DELETED -> {
setResult(RESULT_OK)
finish()
}
}
}
private val infoEditResult = registerForActivityResult(
@@ -550,6 +559,7 @@ class BookInfoActivity :
LocalConfig.deleteBookOriginal = checkBox.isChecked
}
viewModel.delBook(LocalConfig.deleteBookOriginal) {
setResult(RESULT_OK)
finish()
}
}
@@ -557,6 +567,7 @@ class BookInfoActivity :
}
} else {
viewModel.delBook(LocalConfig.deleteBookOriginal) {
setResult(RESULT_OK)
finish()
}
}
@@ -637,6 +648,7 @@ class BookInfoActivity :
private fun readBook(book: Book) {
if (!viewModel.inBookshelf) {
book.addType(BookType.notShelf)
viewModel.saveBook(book) {
viewModel.saveChapterList {
startReadActivity(book)

View File

@@ -424,6 +424,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
fun addToBookshelf(success: (() -> Unit)?) {
execute {
bookData.value?.let { book ->
book.removeType(BookType.notShelf)
if (book.order == 0) {
book.order = appDb.bookDao.minOrder - 1
}

View File

@@ -12,11 +12,21 @@ import io.legado.app.constant.BookType
import io.legado.app.data.entities.Book
import io.legado.app.databinding.ActivityBookInfoEditBinding
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.isImage
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.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 splitties.init.appCtx
import java.io.FileOutputStream
@@ -100,11 +110,13 @@ class BookInfoEditActivity :
book.name = tieBookName.text?.toString() ?: ""
book.author = tieBookAuthor.text?.toString() ?: ""
val local = if (book.isLocal) BookType.local else 0
book.type = when (spType.selectedItemPosition) {
val bookType = when (spType.selectedItemPosition) {
2 -> BookType.image or local
1 -> BookType.audio 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()
book.customCoverUrl = if (customCoverUrl == book.coverUrl) null else customCoverUrl
book.customIntro = tieBookIntro.text?.toString()

View File

@@ -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.changesource.ChangeBookSourceDialog
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.BgTextConfigDialog.Companion.BG_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()) {
it.uri?.let { uri ->
ACache.get().put(AppConst.imagePathKey, uri.toString())
@@ -232,7 +240,6 @@ class ReadBookActivity : BaseReadBookActivity(),
binding.readMenu.upSeekBar()
}
}
private var upContent = true
//恢复跳转前进度对话框的交互结果
private var confirmRestoreProcess: Boolean? = null
@@ -284,6 +291,9 @@ class ReadBookActivity : BaseReadBookActivity(),
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
if (!ReadBook.inBookshelf) {
viewModel.removeFromBookshelf(null)
}
viewModel.initData(intent ?: return)
}
@@ -953,6 +963,9 @@ class ReadBookActivity : BaseReadBookActivity(),
override fun notifyBookChanged() {
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)) {
setMessage(getString(R.string.check_add_bookshelf, book.name))
okButton {
ReadBook.book?.removeType(BookType.notShelf)
ReadBook.book?.save()
ReadBook.inBookshelf = true
setResult(Activity.RESULT_OK)
}
@@ -1477,6 +1501,9 @@ class ReadBookActivity : BaseReadBookActivity(),
popupAction.dismiss()
binding.readView.onDestroy()
ReadBook.unregister(this)
if (!ReadBook.inBookshelf) {
viewModel.removeFromBookshelf(null)
}
if (!BuildConfig.DEBUG) {
Backup.autoBack(this)
}
@@ -1578,4 +1605,9 @@ class ReadBookActivity : BaseReadBookActivity(),
}
}
}
companion object {
const val RESULT_DELETED = 100
}
}

View File

@@ -316,8 +316,9 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
}
fun removeFromBookshelf(success: (() -> Unit)?) {
execute {
ReadBook.book?.delete()
val book = ReadBook.book
Coroutine.async {
book?.delete()
}.onSuccess {
success?.invoke()
}

View File

@@ -35,7 +35,6 @@ import io.legado.app.lib.theme.getPrimaryTextColor
import io.legado.app.lib.theme.primaryColor
import io.legado.app.lib.theme.primaryTextColor
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.widget.seekbar.SeekBarChangeListener
import io.legado.app.utils.ColorUtils
@@ -332,12 +331,7 @@ class ReadMenu @JvmOverloads constructor(
private fun bindEvent() = binding.run {
vwMenuBg.setOnClickListener { runMenuOut() }
titleBar.toolbar.setOnClickListener {
ReadBook.book?.let {
context.startActivity<BookInfoActivity> {
putExtra("name", it.name)
putExtra("author", it.author)
}
}
callBack.openBookInfoActivity()
}
val chapterViewClickListener = OnClickListener {
if (ReadBook.isLocalBook) {
@@ -575,6 +569,7 @@ class ReadMenu @JvmOverloads constructor(
fun openChapterList()
fun openSearchActivity(searchWord: String?)
fun openSourceEditActivity()
fun openBookInfoActivity()
fun showReadStyle()
fun showMoreSetting()
fun showReadAloudDialog()