kunfei 4 lat temu
rodzic
commit
52622c41d6

+ 7 - 5
app/src/main/java/io/legado/app/help/book/BookHelp.kt

@@ -34,6 +34,8 @@ object BookHelp {
     private const val cacheEpubFolderName = "epub"
     private val downloadImages = CopyOnWriteArraySet<String>()
 
+    val cachePath = FileUtils.getPath(downloadDir, cacheFolderName)
+
     fun clearCache() {
         FileUtils.delete(
             FileUtils.getPath(downloadDir, cacheFolderName)
@@ -196,18 +198,18 @@ object BookHelp {
         return ZipFile(uri.path)
     }
 
-    fun getChapterFiles(book: Book): List<String> {
-        val fileNameList = arrayListOf<String>()
+    fun getChapterFiles(book: Book): Set<String> {
         if (book.isLocalTxt) {
-            return fileNameList
+            return emptySet()
         }
+        val fileNames = hashSetOf<String>()
         FileUtils.createFolderIfNotExist(
             downloadDir,
             subDirs = arrayOf(cacheFolderName, book.getFolderName())
         ).list()?.let {
-            fileNameList.addAll(it)
+            fileNames.addAll(it)
         }
-        return fileNameList
+        return fileNames
     }
 
     /**

+ 5 - 13
app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt

@@ -26,7 +26,6 @@ import io.legado.app.ui.about.AppLogDialog
 import io.legado.app.ui.document.HandleFileContract
 import io.legado.app.utils.*
 import io.legado.app.utils.viewbindingdelegate.viewBinding
-import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.flow.*
@@ -72,7 +71,6 @@ class CacheActivity : VMBaseActivity<ActivityCacheBookBinding, CacheViewModel>()
         initRecyclerView()
         initGroupData()
         initBookData()
-        initCacheData()
     }
 
     override fun onCompatCreateOptionsMenu(menu: Menu): Boolean {
@@ -191,17 +189,6 @@ class CacheActivity : VMBaseActivity<ActivityCacheBookBinding, CacheViewModel>()
         }
     }
 
-    private fun initCacheData() {
-        launch {
-            viewModel.bookCacheFlow.conflate().collect {
-                viewModel.cacheChapters[it.first] = it.second
-                withContext(Dispatchers.Main) {
-                    adapter.notifyItemRangeChanged(0, adapter.itemCount, true)
-                }
-            }
-        }
-    }
-
     override fun observeLiveBus() {
         viewModel.upAdapterLiveData.observe(this) {
             adapter.getItems().forEachIndexed { index, book ->
@@ -232,6 +219,11 @@ class CacheActivity : VMBaseActivity<ActivityCacheBookBinding, CacheViewModel>()
         }
         observeEvent<BookChapter>(EventBus.SAVE_CONTENT) {
             viewModel.cacheChapters[it.bookUrl]?.add(it.url)
+            adapter.getItems().forEachIndexed { index, book ->
+                if (book.bookUrl == it.bookUrl) {
+                    adapter.notifyItemChanged(index, true)
+                }
+            }
         }
     }
 

+ 59 - 18
app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt

@@ -25,14 +25,12 @@ import io.legado.app.help.book.ContentProcessor
 import io.legado.app.help.config.AppConfig
 import io.legado.app.help.coroutine.OrderCoroutine
 import io.legado.app.utils.*
-import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.ensureActive
-import kotlinx.coroutines.flow.flow
-import kotlinx.coroutines.flow.flowOn
 import kotlinx.coroutines.sync.Mutex
 import kotlinx.coroutines.sync.withLock
 import me.ag2s.epublib.domain.*
+import me.ag2s.epublib.domain.Date
 import me.ag2s.epublib.epub.EpubWriter
 import me.ag2s.epublib.util.ResourceUtil
 import splitties.init.appCtx
@@ -40,6 +38,8 @@ import java.io.ByteArrayOutputStream
 import java.io.File
 import java.io.FileOutputStream
 import java.nio.charset.Charset
+import java.nio.file.*
+import java.util.*
 import java.util.concurrent.ConcurrentHashMap
 import kotlin.coroutines.coroutineContext
 
@@ -49,26 +49,67 @@ class CacheViewModel(application: Application) : BaseViewModel(application) {
     val exportProgress = ConcurrentHashMap<String, Int>()
     val exportMsg = ConcurrentHashMap<String, String>()
     private val mutex = Mutex()
-
     val cacheChapters = hashMapOf<String, HashSet<String>>()
 
-    val bookCacheFlow = flow {
-        //直接获取全部缓存信息,避免切换分组重新获取
-        val books = appDb.bookDao.getByTypeOnLine(BookType.text or BookType.image)
-        books.forEach { book ->
-            val chapterCaches = hashSetOf<String>()
-            val cacheNames = BookHelp.getChapterFiles(book)
-            appDb.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter ->
-                if (cacheNames.contains(chapter.getFileName())) {
-                    chapterCaches.add(chapter.url)
+    @Volatile
+    private var exportNumber = 0
+
+    init {
+        loadCacheFiles()
+    }
+
+    private fun loadCacheFiles() {
+        execute {
+            //直接获取全部缓存信息,避免切换分组重新获取
+//            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+//                val visitor = object : SimpleFileVisitor<Path>() {
+//
+//                    var names: HashSet<String>? = null
+//
+//                    override fun preVisitDirectory(
+//                        dir: Path,
+//                        attrs: BasicFileAttributes?
+//                    ): FileVisitResult {
+//                        if (dir.name != "book_cache") {
+//                            names = hashSetOf()
+//                        }
+//                        return FileVisitResult.CONTINUE
+//                    }
+//
+//                    override fun visitFile(
+//                        file: Path,
+//                        attrs: BasicFileAttributes?
+//                    ): FileVisitResult {
+//                        names!!.add(file.name)
+//                        return FileVisitResult.CONTINUE
+//                    }
+//
+//                    override fun postVisitDirectory(dir: Path, exc: IOException?): FileVisitResult {
+//                        if (dir.name != "book_cache") {
+//                            cacheChapters[dir.name] = names!!
+//                        }
+//                        return FileVisitResult.CONTINUE
+//                    }
+//                }
+//                withContext(Dispatchers.IO) {
+//                    Files.walkFileTree(Paths.get(BookHelp.cachePath), emptySet(), 2, visitor)
+//                }
+//                return@execute
+//            }
+            val books = appDb.bookDao.getByTypeOnLine(BookType.text or BookType.image)
+            books.forEach { book ->
+                val chapterCaches = hashSetOf<String>()
+                val cacheNames = BookHelp.getChapterFiles(book)
+                appDb.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter ->
+                    if (cacheNames.contains(chapter.getFileName())) {
+                        chapterCaches.add(chapter.url)
+                    }
                 }
+                cacheChapters[book.bookUrl] = chapterCaches
+                upAdapterLiveData.postValue(book.bookUrl)
             }
-            emit(Pair(book.bookUrl, chapterCaches))
         }
-    }.flowOn(Dispatchers.IO)
-
-    @Volatile
-    private var exportNumber = 0
+    }
 
     private fun getExportFileName(book: Book): String {
         val jsStr = AppConfig.bookExportFileName