From 369cad68699b4384ece2579fb353694d11975337 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:53:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/App.kt | 1 + .../java/io/legado/app/constant/BookType.kt | 7 +++- .../java/io/legado/app/data/dao/BookDao.kt | 3 ++ .../io/legado/app/help/book/BookExtensions.kt | 4 +++ .../main/java/io/legado/app/model/ReadBook.kt | 2 ++ .../io/legado/app/model/webBook/WebBook.kt | 9 +++-- .../app/ui/book/info/BookInfoActivity.kt | 18 ++++++++-- .../app/ui/book/info/BookInfoViewModel.kt | 1 + .../ui/book/info/edit/BookInfoEditActivity.kt | 16 +++++++-- .../app/ui/book/read/ReadBookActivity.kt | 34 ++++++++++++++++++- .../app/ui/book/read/ReadBookViewModel.kt | 5 +-- .../io/legado/app/ui/book/read/ReadMenu.kt | 9 ++--- 12 files changed, 91 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/io/legado/app/App.kt b/app/src/main/java/io/legado/app/App.kt index db8af7f99..2dc1b8efc 100644 --- a/app/src/main/java/io/legado/app/App.kt +++ b/app/src/main/java/io/legado/app/App.kt @@ -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() diff --git a/app/src/main/java/io/legado/app/constant/BookType.kt b/app/src/main/java/io/legado/app/constant/BookType.kt index 3f3670e47..23230fd84 100644 --- a/app/src/main/java/io/legado/app/constant/BookType.kt +++ b/app/src/main/java/io/legado/app/constant/BookType.kt @@ -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 diff --git a/app/src/main/java/io/legado/app/data/dao/BookDao.kt b/app/src/main/java/io/legado/app/data/dao/BookDao.kt index ddb4ebf7c..3f3eac3ed 100644 --- a/app/src/main/java/io/legado/app/data/dao/BookDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/BookDao.kt @@ -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() } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/book/BookExtensions.kt b/app/src/main/java/io/legado/app/help/book/BookExtensions.kt index c3e9746d3..18d7c3e59 100644 --- a/app/src/main/java/io/legado/app/help/book/BookExtensions.kt +++ b/app/src/main/java/io/legado/app/help/book/BookExtensions.kt @@ -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 diff --git a/app/src/main/java/io/legado/app/model/ReadBook.kt b/app/src/main/java/io/legado/app/model/ReadBook.kt index debbf4736..de7c712f8 100644 --- a/app/src/main/java/io/legado/app/model/ReadBook.kt +++ b/app/src/main/java/io/legado/app/model/ReadBook.kt @@ -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) diff --git a/app/src/main/java/io/legado/app/model/webBook/WebBook.kt b/app/src/main/java/io/legado/app/model/webBook/WebBook.kt index af03cf51c..b8cd5566b 100644 --- a/app/src/main/java/io/legado/app/model/webBook/WebBook.kt +++ b/app/src/main/java/io/legado/app/model/webBook/WebBook.kt @@ -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> { - book.type = bookSource.getBookType() + book.removeType(bookSource.getAllBookType()) + book.addType(bookSource.getBookType()) return kotlin.runCatching { if (runPerJs) { runPreUpdateJs(bookSource, book).getOrThrow() diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index 611ce1a9a..4420a0fd0 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -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) diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt index a461b135c..b779eabf6 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt @@ -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 } diff --git a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt index b497dcdc9..242522a6b 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt @@ -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() diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index 34cb19d2d..baa990707 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -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 + } + } diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index 4dc07d870..0374646d5 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -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() } diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt index e111cacaf..960b84aaa 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt @@ -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 { - 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()