Browse Source

refactor(Track A): ReadBook 会话字段 private set + 语义化写入命令

book/durChapterIndex/durChapterPos 改为 private set,外部 6 处写入
(BookInfo/BookInfoEdit/Book.delete/ReadBookController) 改走
replaceCurrentBook/clearCurrentBook/updateReadingPosition + isCurrentBook 谓词。
编译器强制外部写入点归零。
5151561 3 months ago
parent
commit
85c4f3d85a

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

@@ -402,8 +402,8 @@ data class Book(
     }
 
     fun delete() {
-        if (ReadBook.book?.bookUrl == bookUrl) {
-            ReadBook.book = null
+        if (ReadBook.isCurrentBook(bookUrl)) {
+            ReadBook.clearCurrentBook()
         }
         appDb.bookChapterDao.delByBook(bookUrl)
         appDb.bookDao.delete(this)

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

@@ -85,12 +85,15 @@ import kotlin.math.min
 @Suppress("MemberVisibilityCanBePrivate")
 object ReadBook : CoroutineScope by MainScope(), KoinComponent {
     var book: Book? = null
+        private set
     var callBack: CallBack? = null
     var inBookshelf = false
     var chapterSize = 0
     var simulatedChapterSize = 0
     var durChapterIndex = 0
+        private set
     var durChapterPos = 0
+        private set
     var isLocalBook = true
     var chapterChanged = false
     @Volatile
@@ -156,6 +159,32 @@ object ReadBook : CoroutineScope by MainScope(), KoinComponent {
 
     private const val MIN_READ_DURATION = 10 * 1000L
 
+    // region 会话所有权:外部只能通过下列语义化命令改写会话字段(book/durChapterIndex/durChapterPos
+    // 已 private set)。判定用意图化谓词替代裸实体比较,避免调用方直接持有可变 Book。
+
+    /** 当前会话是否正指向该 URL 的书。 */
+    fun isCurrentBook(bookUrl: String): Boolean = book?.bookUrl == bookUrl
+
+    /** 当前会话是否正指向与 [other] 同名同作者的书。 */
+    fun isCurrentBook(other: Book): Boolean = book?.isSameNameAuthor(other) == true
+
+    /** 用同一本书的新实例替换当前会话持有的 Book(仅替换引用,不重置章节/进度)。 */
+    fun replaceCurrentBook(book: Book) {
+        this.book = book
+    }
+
+    /** 清空当前会话持有的 Book(仅置空引用,不动章节/进度状态)。 */
+    fun clearCurrentBook() {
+        book = null
+    }
+
+    /** 更新当前章节内的阅读位置。 */
+    fun updateReadingPosition(position: Int) {
+        durChapterPos = position
+    }
+
+    // endregion
+
     fun resetData(book: Book) {
         wholeBookPageCoordinator.clear()
         ReadBook.book = book

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

@@ -675,8 +675,8 @@ class BookInfoViewModel(
                 book.durChapterTitle = it.durChapterTitle
             }
             book.save()
-            if (ReadBook.book?.isSameNameAuthor(book) == true) {
-                ReadBook.book = book
+            if (ReadBook.isCurrentBook(book)) {
+                ReadBook.replaceCurrentBook(book)
             } else if (AudioPlay.book?.isSameNameAuthor(book) == true) {
                 AudioPlay.book = book
             }
@@ -710,8 +710,8 @@ class BookInfoViewModel(
                 book.durChapterPos = it.durChapterPos
                 book.durChapterTitle = it.durChapterTitle
             }
-            if (ReadBook.book?.isSameNameAuthor(book) == true) {
-                ReadBook.book = book
+            if (ReadBook.isCurrentBook(book)) {
+                ReadBook.replaceCurrentBook(book)
             } else if (AudioPlay.book?.isSameNameAuthor(book) == true) {
                 AudioPlay.book = book
             }

+ 2 - 2
app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditViewModel.kt

@@ -147,8 +147,8 @@ class BookInfoEditViewModel(
                 applyTagGroupRulesForBook(book)
                 BookHelp.updateCacheFolder(oldBook, book)
 
-                if (ReadBook.book?.bookUrl == book.bookUrl) {
-                    ReadBook.book = book
+                if (ReadBook.isCurrentBook(book.bookUrl)) {
+                    ReadBook.replaceCurrentBook(book)
                 }
                 bookRepository.update(book)
             }

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

@@ -1122,7 +1122,7 @@ class ReadBookController(
                                 ReadBook.readAloud(startPos = line.pagePosition)
                             }
                         } else {
-                            ReadBook.durChapterPos = line.chapterPosition
+                            ReadBook.updateReadingPosition(line.chapterPosition)
                             ReadBook.readAloud(startPos = line.pagePosition)
                         }
                     } else {
@@ -1146,7 +1146,7 @@ class ReadBookController(
                                 ReadBook.readAloud(startPos = line.pagePosition)
                             }
                         } else {
-                            ReadBook.durChapterPos = line.chapterPosition
+                            ReadBook.updateReadingPosition(line.chapterPosition)
                             ReadBook.readAloud(startPos = line.pagePosition)
                         }
                     } else {