From 3ac79b06e4c36654635bce3d7826f6c228562527 Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Mon, 13 Mar 2023 08:10:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=96=87=E4=BB=B6=E7=B1=BB?= =?UTF-8?q?=E4=B9=A6=E6=BA=90=E5=8E=8B=E7=BC=A9=E6=96=87=E4=BB=B6=E8=A7=A3?= =?UTF-8?q?=E5=8E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/constant/AppPattern.kt | 2 + .../app/ui/book/info/BookInfoActivity.kt | 27 ++++++- .../app/ui/book/info/BookInfoViewModel.kt | 29 ++++++-- .../java/io/legado/app/utils/ArchiveUtils.kt | 74 +++++++++++++++++++ app/src/main/res/values-es-rES/strings.xml | 1 + app/src/main/res/values-ja-rJP/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-zh-rHK/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values-zh/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 11 files changed, 132 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/io/legado/app/utils/ArchiveUtils.kt diff --git a/app/src/main/java/io/legado/app/constant/AppPattern.kt b/app/src/main/java/io/legado/app/constant/AppPattern.kt index 0e999f227..c979e12ce 100644 --- a/app/src/main/java/io/legado/app/constant/AppPattern.kt +++ b/app/src/main/java/io/legado/app/constant/AppPattern.kt @@ -24,6 +24,8 @@ object AppPattern { //本地书籍支持类型 val bookFileRegex = Regex(".*\\.(txt|epub|umd|pdf)", RegexOption.IGNORE_CASE) + //压缩文件支持类型 + val archiveFileRegex = Regex(".*\\.(zip|rar|7z)", RegexOption.IGNORE_CASE) /** * 所有标点 diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index 129bc38af..379ab6363 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -507,6 +507,13 @@ class BookInfoActivity : viewModel.importOrDownloadWebFile(webFile) { onClick?.invoke(it) } + } else if (webFile.isSupportDecompress) { + /* 解压筛选后再选择导入项 */ + viewModel.importOrDownloadWebFile(webFile) { uri -> + viewModel.deCompress(uri) { + showDecompressFileImportAlert(it) + } + } } else { alert( title = getString(R.string.draw), @@ -514,8 +521,8 @@ class BookInfoActivity : ) { neutralButton(R.string.open_fun) { /* download only */ - viewModel.importOrDownloadWebFile(webFile) { uri -> - openFileUri(uri, "*/*") + viewModel.importOrDownloadWebFile(webFile) { + openFileUri(it, "*/*") } } noButton() @@ -524,6 +531,22 @@ class BookInfoActivity : } } + private fun showDecompressFileImportAlert( + fileDocs: List + ) { + if (fileDocs.isEmpty()) { + toastOnUi(R.string.unsupport_archivefile_entry) + return + } + val selectorNames = fileDocs.map { it.name } + selector( + R.string.import_select_book, + selectorNames + ) { _, _, index -> + viewModel.importBook(fileDocs[index]) + } + } + private fun readBook(book: Book) { if (!viewModel.inBookshelf) { viewModel.saveBook(book) { diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt index f73f7601d..aa325b73e 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt @@ -25,9 +25,7 @@ import io.legado.app.model.BookCover import io.legado.app.model.ReadBook import io.legado.app.model.localBook.LocalBook import io.legado.app.model.webBook.WebBook -import io.legado.app.utils.isContentScheme -import io.legado.app.utils.postEvent -import io.legado.app.utils.toastOnUi +import io.legado.app.utils.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers.IO @@ -242,7 +240,8 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { book.downloadUrls!!.map { val mFileName = "${fileName}.${LocalBook.parseFileSuffix(it)}" val isSupportedFile = AppPattern.bookFileRegex.matches(mFileName) - WebFile(it, mFileName, isSupportedFile) + val isSupportDecompress = AppPattern.archiveFileRegex.matches(mFileName) + WebFile(it, mFileName, isSupportedFile, isSupportDecompress) } }.onError { context.toastOnUi("LoadWebFileError\n${it.localizedMessage}") @@ -251,6 +250,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { } } + /* 导入或者下载在线文件 */ fun importOrDownloadWebFile(webFile: WebFile, success: ((T) -> Unit)?) { bookSource ?: return execute { @@ -272,6 +272,22 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { } } + fun deCompress(archiveFileUri: Uri, onSuccess: (List) -> Unit) { + execute { + ArchiveUtils.deCompress(archiveFileUri).list { + AppPattern.bookFileRegex.matches(it.name) + } ?: emptyList() + }.onError { + context.toastOnUi("DeCompress Error:\n${it.localizedMessage}") + }.onSuccess { + onSuccess.invoke(it) + } + } + + fun importBook(fileDoc: FileDoc) { + LocalBook.importFile(fileDoc.uri).let { changeToLocalBook(it) } + } + fun changeTo(source: BookSource, book: Book, toc: List) { changeSourceCoroutine?.cancel() changeSourceCoroutine = execute { @@ -398,7 +414,10 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { data class WebFile( val url: String, val name: String, - val isSupported: Boolean + // txt epub umd pdf等文件 + val isSupported: Boolean, + // 压缩包形式的txt epub umd pdf文件 + val isSupportDecompress: Boolean ) { override fun toString(): String { return name diff --git a/app/src/main/java/io/legado/app/utils/ArchiveUtils.kt b/app/src/main/java/io/legado/app/utils/ArchiveUtils.kt new file mode 100644 index 000000000..eb08550ab --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/ArchiveUtils.kt @@ -0,0 +1,74 @@ +package io.legado.app.utils + +import android.net.Uri +import androidx.documentfile.provider.DocumentFile +import java.io.File +import java.util.regex.Pattern + +import splitties.init.appCtx + +/* 自动判断压缩文件后缀 然后再调用具体的实现 */ +object ArchiveUtils { + + // 临时目录 下次启动自动删除 + val TEMP_PATH: String by lazy { + appCtx.externalCache.getFile("ArchiveTemp").createFolderReplace().absolutePath + } + + val ZIP_REGEX = Regex(".*\\.zip", RegexOption.IGNORE_CASE) + val RAR_REGEX = Regex(".*\\.rar", RegexOption.IGNORE_CASE) + val SERVEZ_REGEX = Regex(".*\\.7z", RegexOption.IGNORE_CASE) + + fun deCompress( + archiveUri: Uri, + path: String? = TEMP_PATH + ): FileDoc { + return deCompress(FileDoc.fromUri(archiveUri, false), path) + } + + fun deCompress( + archivePath: String, + path: String? = TEMP_PATH + ): FileDoc { + return deCompress(Uri.parse(archivePath)), false), path) + } + + fun deCompress( + archiveFile: File, + path: String? = TEMP_PATH + ): FileDoc { + return deCompress(FileDoc.fromFile(archiveFile), path) + } + + fun deCompress( + archiveDoc: DocumentFile, + path: String? = TEMP_PATH + ): FileDoc { + return deCompress(FileDoc.fromDocumentFile(archiveDoc), path) + } + + fun deCompress( + archiveFileDoc: FileDoc, + path: String? = TEMP_PATH + ): FileDoc { + if (archiveFileDoc.isDir) throw IllegalArgumentException("Unexpected Folder input") + val name = archiveFileDoc.name + archiveFileDoc.uri.inputStream(appCtx).getOrThrow().use { + when { + ZIP_REGEX.matches(name) -> ZipUtils.unZipToPath(it, path) + RAR_REGEX.matches(name) -> RarUtils.unRarToPath(it, path) + SERVEZ_REGEX.matches(name) -> SevenZipUtils.un7zToPath(it, path) + else -> throw IllegalArgumentException("Unexpected archive format") + } + } + return getCacheFolderFileDoc(name, path) + } + + private fun getCacheFolderFileDoc( + archiveName: String, + workPath: String + ): FileDoc { + return FileDoc.fromUri(Uri.parse(workPath), true) + .createFolderIfNotExist(MD5Utils.md5Encode16(archiveName)) + } +} \ No newline at end of file diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 4343c31e6..9f57dbfa3 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1080,4 +1080,5 @@ 保留分组 服务器配置 Remote webDav url exists, Continue? + Cannot find supported files in archive diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index b7885f90e..0db86d8a4 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -1083,4 +1083,5 @@ 保留分组 服务器配置 Remote webDav url exists, Continue? + Cannot find supported files in archive diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 859049346..17a8f285f 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1083,4 +1083,5 @@ 保留分组 服务器配置 Remote webDav url exists, Continue? + Cannot find supported files in archive diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 902830842..4e33cc53a 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -1080,4 +1080,5 @@ 保留分组 服务器配置 远程webDav链接已存在,是否继续 + 压缩文件内没有支持的文件 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index d90258a84..91f3058a0 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1082,4 +1082,5 @@ 保留分组 服务器配置 远程webDav链接已存在,是否继续 + 压缩文件内没有支持的文件 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index cc4582ccc..5dacb47c1 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1082,4 +1082,5 @@ 保留分组 服务器配置 远程webDav链接已存在,是否继续 + 压缩文件内没有支持的文件 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c4440b8a2..468fcb9db 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1083,4 +1083,5 @@ Keep group 服务器配置 Remote webDav url exists, Continue? + Cannot find supported files in archive