From e43435aa21f76f5fb023d4805c8ba8a36a083cd2 Mon Sep 17 00:00:00 2001 From: kunfei Date: Wed, 19 Oct 2022 22:06:51 +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 --- .../java/io/legado/app/help/book/BookHelp.kt | 12 +-- .../legado/app/ui/book/cache/CacheActivity.kt | 18 ++--- .../app/ui/book/cache/CacheViewModel.kt | 77 ++++++++++++++----- 3 files changed, 71 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/book/BookHelp.kt b/app/src/main/java/io/legado/app/help/book/BookHelp.kt index b839c4ee5..0342cada1 100644 --- a/app/src/main/java/io/legado/app/help/book/BookHelp.kt +++ b/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() + 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 { - val fileNameList = arrayListOf() + fun getChapterFiles(book: Book): Set { if (book.isLocalTxt) { - return fileNameList + return emptySet() } + val fileNames = hashSetOf() FileUtils.createFolderIfNotExist( downloadDir, subDirs = arrayOf(cacheFolderName, book.getFolderName()) ).list()?.let { - fileNameList.addAll(it) + fileNames.addAll(it) } - return fileNameList + return fileNames } /** diff --git a/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt b/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt index 22a900ed7..64cd01ef9 100644 --- a/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt +++ b/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() initRecyclerView() initGroupData() initBookData() - initCacheData() } override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { @@ -191,17 +189,6 @@ class CacheActivity : VMBaseActivity() } } - 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() } observeEvent(EventBus.SAVE_CONTENT) { viewModel.cacheChapters[it.bookUrl]?.add(it.url) + adapter.getItems().forEachIndexed { index, book -> + if (book.bookUrl == it.bookUrl) { + adapter.notifyItemChanged(index, true) + } + } } } diff --git a/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt b/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt index 2a2390086..48938a655 100644 --- a/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt +++ b/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() val exportMsg = ConcurrentHashMap() private val mutex = Mutex() - val cacheChapters = hashMapOf>() - val bookCacheFlow = flow { - //直接获取全部缓存信息,避免切换分组重新获取 - val books = appDb.bookDao.getByTypeOnLine(BookType.text or BookType.image) - books.forEach { book -> - val chapterCaches = hashSetOf() - 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() { +// +// var names: HashSet? = 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() + 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