Horis 1 tahun lalu
induk
melakukan
e78a13e5cd

+ 1 - 8
app/src/main/java/io/legado/app/data/entities/Book.kt

@@ -14,6 +14,7 @@ import io.legado.app.constant.PageAnim
 import io.legado.app.data.appDb
 import io.legado.app.help.book.BookHelp
 import io.legado.app.help.book.ContentProcessor
+import io.legado.app.help.book.getFolderNameNoCache
 import io.legado.app.help.book.isEpub
 import io.legado.app.help.book.isImage
 import io.legado.app.help.book.simulatedTotalChapterNum
@@ -21,14 +22,12 @@ import io.legado.app.help.config.AppConfig
 import io.legado.app.help.config.ReadBookConfig
 import io.legado.app.model.ReadBook
 import io.legado.app.utils.GSON
-import io.legado.app.utils.MD5Utils
 import io.legado.app.utils.fromJsonObject
 import kotlinx.parcelize.IgnoredOnParcel
 import kotlinx.parcelize.Parcelize
 import java.nio.charset.Charset
 import java.time.LocalDate
 import kotlin.math.max
-import kotlin.math.min
 
 @Parcelize
 @TypeConverters(Book.Converters::class)
@@ -316,12 +315,6 @@ data class Book(
         return folderName!!
     }
 
-    fun getFolderNameNoCache(): String {
-        return name.replace(AppPattern.fileNameRegex, "").let {
-            it.substring(0, min(9, it.length)) + MD5Utils.md5Encode16(bookUrl)
-        }
-    }
-
     fun toSearchBook() = SearchBook(
         name = name,
         author = author,

+ 8 - 0
app/src/main/java/io/legado/app/help/book/BookExtensions.kt

@@ -6,6 +6,7 @@ import android.net.Uri
 import com.script.buildScriptBindings
 import com.script.rhino.RhinoScriptEngine
 import io.legado.app.constant.AppLog
+import io.legado.app.constant.AppPattern
 import io.legado.app.constant.BookSourceType
 import io.legado.app.constant.BookType
 import io.legado.app.data.appDb
@@ -17,6 +18,7 @@ import io.legado.app.help.config.AppConfig
 import io.legado.app.model.localBook.LocalBook
 import io.legado.app.utils.FileDoc
 import io.legado.app.utils.GSON
+import io.legado.app.utils.MD5Utils
 import io.legado.app.utils.exists
 import io.legado.app.utils.find
 import io.legado.app.utils.inputStream
@@ -277,6 +279,12 @@ fun Book.updateTo(newBook: Book): Book {
     return newBook
 }
 
+fun Book.getFolderNameNoCache(): String {
+    return name.replace(AppPattern.fileNameRegex, "").let {
+        it.substring(0, min(9, it.length)) + MD5Utils.md5Encode16(bookUrl)
+    }
+}
+
 fun Book.getBookSource(): BookSource? {
     return appDb.bookSourceDao.getBookSource(origin)
 }

+ 13 - 0
app/src/main/java/io/legado/app/model/ReadBook.kt

@@ -15,6 +15,7 @@ import io.legado.app.help.book.ContentProcessor
 import io.legado.app.help.book.isImage
 import io.legado.app.help.book.isLocal
 import io.legado.app.help.book.isPdf
+import io.legado.app.help.book.isSameNameAuthor
 import io.legado.app.help.book.readSimulating
 import io.legado.app.help.book.simulatedTotalChapterNum
 import io.legado.app.help.book.update
@@ -921,6 +922,18 @@ object ReadBook : CoroutineScope by MainScope() {
         }
     }
 
+    fun onChapterListUpdated(newBook: Book) {
+        if (newBook.isSameNameAuthor(book)) {
+            book = newBook
+            chapterSize = newBook.totalChapterNum
+            simulatedChapterSize = newBook.simulatedTotalChapterNum()
+            if (simulatedChapterSize > 0 && durChapterIndex > simulatedChapterSize - 1) {
+                durChapterIndex = simulatedChapterSize - 1
+            }
+            clearTextChapter()
+        }
+    }
+
     /**
      * 注册回调
      */

+ 1 - 2
app/src/main/java/io/legado/app/model/localBook/LocalBook.kt

@@ -32,7 +32,6 @@ import io.legado.app.help.book.isPdf
 import io.legado.app.help.book.isUmd
 import io.legado.app.help.book.removeLocalUriCache
 import io.legado.app.help.book.simulatedTotalChapterNum
-import io.legado.app.help.book.update
 import io.legado.app.help.config.AppConfig
 import io.legado.app.lib.webdav.WebDav
 import io.legado.app.lib.webdav.WebDavException
@@ -152,7 +151,7 @@ object LocalBook {
             list.getOrElse(book.simulatedTotalChapterNum() - 1) { list.last() }
                 .getDisplayTitle(replaceRules, book.getUseReplaceRule())
         book.totalChapterNum = list.size
-        book.update()
+        book.latestChapterTime = System.currentTimeMillis()
         return list
     }
 

+ 4 - 3
app/src/main/java/io/legado/app/service/ExportBookService.kt

@@ -21,9 +21,9 @@ import io.legado.app.help.AppWebDav
 import io.legado.app.help.book.BookHelp
 import io.legado.app.help.book.ContentProcessor
 import io.legado.app.help.book.getExportFileName
-import io.legado.app.help.book.isLocal
 import io.legado.app.help.book.isLocalModified
 import io.legado.app.help.config.AppConfig
+import io.legado.app.model.ReadBook
 import io.legado.app.model.localBook.LocalBook
 import io.legado.app.ui.book.cache.CacheActivity
 import io.legado.app.utils.FileDoc
@@ -212,15 +212,16 @@ class ExportBookService : BaseService() {
     }
 
     private fun refreshChapterList(book: Book) {
-        if (!book.isLocal || !book.isLocalModified()) {
+        if (!book.isLocalModified()) {
             return
         }
         kotlin.runCatching {
             LocalBook.getChapterList(book)
         }.onSuccess {
-            book.latestChapterTime = System.currentTimeMillis()
             appDb.bookChapterDao.delByBook(book.bookUrl)
             appDb.bookChapterDao.insert(*it.toTypedArray())
+            appDb.bookDao.update(book)
+            ReadBook.onChapterListUpdated(book)
         }
     }
 

+ 3 - 13
app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt

@@ -26,7 +26,6 @@ import io.legado.app.help.book.isNotShelf
 import io.legado.app.help.book.isSameNameAuthor
 import io.legado.app.help.book.isWebFile
 import io.legado.app.help.book.removeType
-import io.legado.app.help.book.simulatedTotalChapterNum
 import io.legado.app.help.book.updateTo
 import io.legado.app.help.coroutine.Coroutine
 import io.legado.app.lib.webdav.ObjectNotFoundException
@@ -226,12 +225,8 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
                     appDb.bookDao.update(book)
                     appDb.bookChapterDao.delByBook(book.bookUrl)
                     appDb.bookChapterDao.insert(*it.toTypedArray())
-                    if (book.isSameNameAuthor(ReadBook.book)) {
-                        ReadBook.book = book
-                        ReadBook.chapterSize = book.totalChapterNum
-                        ReadBook.simulatedChapterSize = book.simulatedTotalChapterNum()
-                        ReadBook.clearTextChapter()
-                    }
+                    ReadBook.onChapterListUpdated(book)
+                    bookData.postValue(book)
                     chapterListData.postValue(it)
                 }
             }.onError {
@@ -258,12 +253,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
                         }
                         appDb.bookChapterDao.delByBook(oldBook.bookUrl)
                         appDb.bookChapterDao.insert(*it.toTypedArray())
-                        if (book.isSameNameAuthor(ReadBook.book)) {
-                            ReadBook.book = book
-                            ReadBook.chapterSize = book.totalChapterNum
-                            ReadBook.simulatedChapterSize = book.simulatedTotalChapterNum()
-                            ReadBook.clearTextChapter()
-                        }
+                        ReadBook.onChapterListUpdated(book)
                     }
                     bookData.postValue(book)
                     chapterListData.postValue(it)

+ 1 - 1
app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt

@@ -136,7 +136,7 @@ class BookInfoEditActivity :
         book.customIntro = if (customIntro == book.intro) null else customIntro
         BookHelp.updateCacheFolder(oldBook, book)
         viewModel.saveBook(book) {
-            setResult(Activity.RESULT_OK)
+            setResult(RESULT_OK)
             finish()
         }
     }

+ 1 - 2
app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt

@@ -1,7 +1,6 @@
 package io.legado.app.ui.book.read
 
 import android.annotation.SuppressLint
-import android.app.Activity
 import android.content.Intent
 import android.content.res.Configuration
 import android.net.Uri
@@ -1578,7 +1577,7 @@ class ReadBookActivity : BaseReadBookActivity(),
                     ReadBook.book?.removeType(BookType.notShelf)
                     ReadBook.book?.save()
                     ReadBook.inBookshelf = true
-                    setResult(Activity.RESULT_OK)
+                    setResult(RESULT_OK)
                 }
                 noButton { viewModel.removeFromBookshelf { super.finish() } }
             }

+ 2 - 14
app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt

@@ -122,7 +122,6 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
             return
         }
         ReadBook.upMsg(null)
-        ensureChapterExist()
         if (!isSameBook) {
             ReadBook.loadContent(resetPageOffset = true)
         } else {
@@ -157,12 +156,6 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
         }
     }
 
-    private fun ensureChapterExist() {
-        if (ReadBook.simulatedChapterSize > 0 && ReadBook.durChapterIndex > ReadBook.simulatedChapterSize - 1) {
-            ReadBook.durChapterIndex = ReadBook.simulatedChapterSize - 1
-        }
-    }
-
     /**
      * 加载详情页
      */
@@ -183,7 +176,6 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
     fun loadChapterList(book: Book) {
         execute {
             if (loadChapterListAwait(book)) {
-                ensureChapterExist()
                 ReadBook.upMsg(null)
                 ReadBook.loadContent(resetPageOffset = true)
             }
@@ -194,13 +186,10 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
         if (book.isLocal) {
             kotlin.runCatching {
                 LocalBook.getChapterList(book).let {
-                    book.latestChapterTime = System.currentTimeMillis()
                     appDb.bookChapterDao.delByBook(book.bookUrl)
                     appDb.bookChapterDao.insert(*it.toTypedArray())
                     appDb.bookDao.update(book)
-                    ReadBook.chapterSize = it.size
-                    ReadBook.simulatedChapterSize = book.simulatedTotalChapterNum()
-                    ReadBook.clearTextChapter()
+                    ReadBook.onChapterListUpdated(book)
                 }
                 return true
             }.onFailure {
@@ -229,8 +218,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
                         }
                         appDb.bookChapterDao.delByBook(oldBook.bookUrl)
                         appDb.bookChapterDao.insert(*cList.toTypedArray())
-                        ReadBook.chapterSize = cList.size
-                        ReadBook.simulatedChapterSize = book.simulatedTotalChapterNum()
+                        ReadBook.onChapterListUpdated(book)
                         return true
                     }.onFailure {
                         ReadBook.upMsg(context.getString(R.string.error_load_toc))

+ 0 - 4
app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt

@@ -17,7 +17,6 @@ import io.legado.app.base.VMBaseActivity
 import io.legado.app.data.entities.Book
 import io.legado.app.databinding.ActivityChapterListBinding
 import io.legado.app.help.book.isLocalTxt
-import io.legado.app.help.book.simulatedTotalChapterNum
 import io.legado.app.help.config.AppConfig
 import io.legado.app.lib.theme.accentColor
 import io.legado.app.lib.theme.primaryTextColor
@@ -198,9 +197,6 @@ class TocActivity : VMBaseActivity<ActivityChapterListBinding, TocViewModel>(),
             waitDialog.dismiss()
             ReadBook.book?.let { readBook ->
                 if (readBook == book) {
-                    ReadBook.book = book
-                    ReadBook.chapterSize = book.totalChapterNum
-                    ReadBook.simulatedChapterSize = book.simulatedTotalChapterNum()
                     ReadBook.upMsg(null)
                     ReadBook.loadContent(resetPageOffset = true)
                 }

+ 2 - 1
app/src/main/java/io/legado/app/ui/book/toc/TocViewModel.kt

@@ -10,6 +10,7 @@ import io.legado.app.constant.AppLog
 import io.legado.app.data.appDb
 import io.legado.app.data.entities.Book
 import io.legado.app.exception.NoStackTraceException
+import io.legado.app.model.ReadBook
 import io.legado.app.model.localBook.LocalBook
 import io.legado.app.utils.FileDoc
 import io.legado.app.utils.GSON
@@ -38,10 +39,10 @@ class TocViewModel(application: Application) : BaseViewModel(application) {
         execute {
             appDb.bookDao.update(book)
             LocalBook.getChapterList(book).let {
-                book.latestChapterTime = System.currentTimeMillis()
                 appDb.bookChapterDao.delByBook(book.bookUrl)
                 appDb.bookChapterDao.insert(*it.toTypedArray())
                 appDb.bookDao.update(book)
+                ReadBook.onChapterListUpdated(book)
                 bookData.postValue(book)
             }
         }.onFinally {

+ 1 - 8
app/src/main/java/io/legado/app/ui/main/MainViewModel.kt

@@ -17,10 +17,8 @@ import io.legado.app.help.DefaultData
 import io.legado.app.help.book.BookHelp
 import io.legado.app.help.book.addType
 import io.legado.app.help.book.isLocal
-import io.legado.app.help.book.isSameNameAuthor
 import io.legado.app.help.book.isUpError
 import io.legado.app.help.book.removeType
-import io.legado.app.help.book.simulatedTotalChapterNum
 import io.legado.app.help.book.sync
 import io.legado.app.help.config.AppConfig
 import io.legado.app.model.CacheBook
@@ -169,12 +167,7 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
             }
             appDb.bookChapterDao.delByBook(bookUrl)
             appDb.bookChapterDao.insert(*toc.toTypedArray())
-            if (book.isSameNameAuthor(ReadBook.book)) {
-                ReadBook.book = book
-                ReadBook.chapterSize = book.totalChapterNum
-                ReadBook.simulatedChapterSize = book.simulatedTotalChapterNum()
-                ReadBook.clearTextChapter()
-            }
+            ReadBook.onChapterListUpdated(book)
             addDownload(source, book)
         }.onFailure {
             AppLog.put("${book.name} 更新目录失败\n${it.localizedMessage}", it)