Horis пре 2 година
родитељ
комит
f3169e47aa

+ 1 - 0
app/src/main/java/io/legado/app/App.kt

@@ -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()

+ 6 - 1
app/src/main/java/io/legado/app/constant/BookType.kt

@@ -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
 
 
 
 

+ 3 - 0
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")
     @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()
 }
 }

+ 4 - 0
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) {
 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

+ 2 - 0
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.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)

+ 7 - 2
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.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()

+ 15 - 3
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.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) {
-            viewModel.inBookshelf = true
-            upTvBookshelf()
+        when (it.resultCode) {
+            RESULT_OK -> {
+                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)

+ 1 - 0
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)?) {
     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
                 }
                 }

+ 14 - 2
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.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()

+ 33 - 1
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.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
+    }
+
 }
 }

+ 3 - 2
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)?) {
     fun removeFromBookshelf(success: (() -> Unit)?) {
-        execute {
-            ReadBook.book?.delete()
+        val book = ReadBook.book
+        Coroutine.async {
+            book?.delete()
         }.onSuccess {
         }.onSuccess {
             success?.invoke()
             success?.invoke()
         }
         }

+ 2 - 7
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.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 {
-                context.startActivity<BookInfoActivity> {
-                    putExtra("name", it.name)
-                    putExtra("author", it.author)
-                }
-            }
+            callBack.openBookInfoActivity()
         }
         }
         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()