From f44e73a974b2a42b417cf0ad5aa5682ed3adc3a1 Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 14 Mar 2023 10:18:39 +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 --- .../app/ui/book/info/BookInfoActivity.kt | 9 ++-- .../app/ui/book/info/BookInfoViewModel.kt | 14 +++--- .../java/io/legado/app/utils/ArchiveUtils.kt | 13 +++-- .../io/legado/app/utils/compress/RarUtils.kt | 48 ++++++++++--------- .../app/utils/compress/SevenZipUtils.kt | 45 +++++++++-------- .../io/legado/app/utils/compress/ZipUtils.kt | 21 ++++---- 6 files changed, 80 insertions(+), 70 deletions(-) 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 a533c5b4c..bc5e5a73f 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 @@ -49,6 +49,7 @@ import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import java.io.File class BookInfoActivity : VMBaseActivity(toolBarTheme = Theme.Dark), @@ -559,18 +560,18 @@ class BookInfoActivity : } private fun showDecompressFileImportAlert( - fileDocs: List + files: List ) { - if (fileDocs.isEmpty()) { + if (files.isEmpty()) { toastOnUi(R.string.unsupport_archivefile_entry) return } - val selectorNames = fileDocs.map { it.name } + val selectorNames = files.map { it.name } selector( R.string.import_select_book, selectorNames ) { _, _, index -> - viewModel.importBook(fileDocs[index]) + viewModel.importBook(files[index]) } } 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 6a1a64071..fcd489c1e 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 @@ -28,6 +28,8 @@ import io.legado.app.model.webBook.WebBook import io.legado.app.utils.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers.IO +import java.io.File +import java.io.FileInputStream class BookInfoViewModel(application: Application) : BaseViewModel(application) { val bookData = MutableLiveData() @@ -279,11 +281,11 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { } } - fun deCompress(archiveFileUri: Uri, onSuccess: (List) -> Unit) { + fun deCompress(archiveFileUri: Uri, onSuccess: (List) -> Unit) { execute { - ArchiveUtils.deCompress(archiveFileUri).list { + ArchiveUtils.deCompress(archiveFileUri).filter { AppPattern.bookFileRegex.matches(it.name) - } ?: emptyList() + } }.onError { context.toastOnUi("DeCompress Error:\n${it.localizedMessage}") }.onSuccess { @@ -291,10 +293,10 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { } } - fun importBook(fileDoc: FileDoc) { + fun importBook(file: File) { val uri = LocalBook.saveBookFile( - fileDoc.uri.inputStream(context).getOrThrow(), - fileDoc.name + FileInputStream(file), + file.name ) changeToLocalBook(LocalBook.importFile(uri)) } diff --git a/app/src/main/java/io/legado/app/utils/ArchiveUtils.kt b/app/src/main/java/io/legado/app/utils/ArchiveUtils.kt index afa70c8dc..1d092f373 100644 --- a/app/src/main/java/io/legado/app/utils/ArchiveUtils.kt +++ b/app/src/main/java/io/legado/app/utils/ArchiveUtils.kt @@ -20,40 +20,40 @@ object ArchiveUtils { fun deCompress( archiveUri: Uri, path: String = TEMP_PATH - ): FileDoc { + ): List { return deCompress(FileDoc.fromUri(archiveUri, false), path) } fun deCompress( archivePath: String, path: String = TEMP_PATH - ): FileDoc { + ): List { return deCompress(Uri.parse(archivePath), path) } fun deCompress( archiveFile: File, path: String = TEMP_PATH - ): FileDoc { + ): List { return deCompress(FileDoc.fromFile(archiveFile), path) } fun deCompress( archiveDoc: DocumentFile, path: String = TEMP_PATH - ): FileDoc { + ): List { return deCompress(FileDoc.fromDocumentFile(archiveDoc), path) } fun deCompress( archiveFileDoc: FileDoc, path: String = TEMP_PATH - ): FileDoc { + ): List { if (archiveFileDoc.isDir) throw IllegalArgumentException("Unexpected Folder input") val name = archiveFileDoc.name val workPathFileDoc = getCacheFolderFileDoc(name, path) val workPath = workPathFileDoc.toString() - archiveFileDoc.uri.inputStream(appCtx).getOrThrow().use { + return archiveFileDoc.uri.inputStream(appCtx).getOrThrow().use { when { name.endsWith(".zip", ignoreCase = true) -> ZipUtils.unZipToPath(it, workPath) name.endsWith(".rar", ignoreCase = true) -> RarUtils.unRarToPath(it, workPath) @@ -61,7 +61,6 @@ object ArchiveUtils { else -> throw IllegalArgumentException("Unexpected archive format") } } - return workPathFileDoc } private fun getCacheFolderFileDoc( diff --git a/app/src/main/java/io/legado/app/utils/compress/RarUtils.kt b/app/src/main/java/io/legado/app/utils/compress/RarUtils.kt index b2645971e..c95b10793 100644 --- a/app/src/main/java/io/legado/app/utils/compress/RarUtils.kt +++ b/app/src/main/java/io/legado/app/utils/compress/RarUtils.kt @@ -13,57 +13,57 @@ import java.io.InputStream object RarUtils { @Throws(NullPointerException::class, SecurityException::class) - fun unRarToPath(inputStream: InputStream, path: String) { - unRarToPath(inputStream, File(path)) + fun unRarToPath(inputStream: InputStream, path: String): List { + return unRarToPath(inputStream, File(path)) } @Throws(NullPointerException::class, SecurityException::class) - fun unRarToPath(byteArray: ByteArray, path: String) { - unRarToPath(byteArray, File(path)) + fun unRarToPath(byteArray: ByteArray, path: String): List { + return unRarToPath(byteArray, File(path)) } @Throws(NullPointerException::class, SecurityException::class) - fun unRarToPath(zipPath: String, path: String) { - unRarToPath(zipPath, File(path)) + fun unRarToPath(zipPath: String, path: String): List { + return unRarToPath(zipPath, File(path)) } @Throws(NullPointerException::class, SecurityException::class) - fun unRarToPath(file: File, path: String) { - unRarToPath(file, File(path)) + fun unRarToPath(file: File, path: String): List { + return unRarToPath(file, File(path)) } @Throws(NullPointerException::class, SecurityException::class) - fun unRarToPath(inputStream: InputStream, destDir: File?) { - Archive(inputStream).use { - unRarToPath(it, destDir) - } - inputStream.close() - } - - @Throws(NullPointerException::class, SecurityException::class) - fun unRarToPath(byteArray: ByteArray, destDir: File?) { - Archive(ByteArrayInputStream(byteArray)).use { + fun unRarToPath(inputStream: InputStream, destDir: File?): List { + return Archive(inputStream).use { unRarToPath(it, destDir) } } @Throws(NullPointerException::class, SecurityException::class) - fun unRarToPath(filePath: String, destDir: File?) { - Archive(File(filePath)).use { + fun unRarToPath(byteArray: ByteArray, destDir: File?): List { + return Archive(ByteArrayInputStream(byteArray)).use { unRarToPath(it, destDir) } } @Throws(NullPointerException::class, SecurityException::class) - fun unRarToPath(file: File, destDir: File?) { - Archive(file).use { + fun unRarToPath(filePath: String, destDir: File?): List { + return Archive(File(filePath)).use { unRarToPath(it, destDir) } } @Throws(NullPointerException::class, SecurityException::class) - fun unRarToPath(archive: Archive, destDir: File?) { + fun unRarToPath(file: File, destDir: File?): List { + return Archive(file).use { + unRarToPath(it, destDir) + } + } + + @Throws(NullPointerException::class, SecurityException::class) + fun unRarToPath(archive: Archive, destDir: File?): List { destDir ?: throw NullPointerException("解决路径不能为空") + val files = arrayListOf() var entry: FileHeader? while (archive.nextFileHeader().also { entry = it } != null) { val entryFile = File(destDir, entry!!.fileName) @@ -86,8 +86,10 @@ object RarUtils { } FileOutputStream(entryFile).use { archive.getInputStream(entry).copyTo(it) + files.add(entryFile) } } + return files } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/utils/compress/SevenZipUtils.kt b/app/src/main/java/io/legado/app/utils/compress/SevenZipUtils.kt index 0b1782b49..c6ce35a68 100644 --- a/app/src/main/java/io/legado/app/utils/compress/SevenZipUtils.kt +++ b/app/src/main/java/io/legado/app/utils/compress/SevenZipUtils.kt @@ -17,59 +17,60 @@ import java.nio.channels.FileChannel object SevenZipUtils { @Throws(NullPointerException::class, SecurityException::class) - fun un7zToPath(inputStream: InputStream, path: String) { - un7zToPath(inputStream, File(path)) + fun un7zToPath(inputStream: InputStream, path: String): List { + return un7zToPath(inputStream, File(path)) } @Throws(NullPointerException::class, SecurityException::class) - fun un7zToPath(byteArray: ByteArray, path: String) { - un7zToPath(byteArray, File(path)) + fun un7zToPath(byteArray: ByteArray, path: String): List { + return un7zToPath(byteArray, File(path)) } @Throws(NullPointerException::class, SecurityException::class) - fun un7zToPath(pfd: ParcelFileDescriptor, path: String) { - un7zToPath(pfd, File(path)) + fun un7zToPath(pfd: ParcelFileDescriptor, path: String): List { + return un7zToPath(pfd, File(path)) } @Throws(NullPointerException::class, SecurityException::class) - fun un7zToPath(fileChannel: FileChannel, path: String) { - un7zToPath(fileChannel, File(path)) + fun un7zToPath(fileChannel: FileChannel, path: String): List { + return un7zToPath(fileChannel, File(path)) } @Throws(NullPointerException::class, SecurityException::class) - fun un7zToPath(inputStream: InputStream, destDir: File?) { - un7zToPath(SevenZFile(SeekableInMemoryByteChannel(inputStream.readBytes())), destDir) + fun un7zToPath(inputStream: InputStream, destDir: File?): List { + return un7zToPath(SevenZFile(SeekableInMemoryByteChannel(inputStream.readBytes())), destDir) } @Throws(NullPointerException::class, SecurityException::class) - fun un7zToPath(byteArray: ByteArray, destDir: File?) { - un7zToPath(SevenZFile(SeekableInMemoryByteChannel(byteArray)), destDir) + fun un7zToPath(byteArray: ByteArray, destDir: File?): List { + return un7zToPath(SevenZFile(SeekableInMemoryByteChannel(byteArray)), destDir) } @Throws(NullPointerException::class, SecurityException::class) - fun un7zToPath(pfd: ParcelFileDescriptor, destDir: File?) { - un7zToPath(SevenZFile(ParcelFileDescriptorChannel(pfd)), destDir) + fun un7zToPath(pfd: ParcelFileDescriptor, destDir: File?): List { + return un7zToPath(SevenZFile(ParcelFileDescriptorChannel(pfd)), destDir) } @SuppressLint("NewApi") @Throws(NullPointerException::class, SecurityException::class) - fun un7zToPath(fileChannel: FileChannel, destDir: File?) { - un7zToPath(SevenZFile(fileChannel), destDir) + fun un7zToPath(fileChannel: FileChannel, destDir: File?): List { + return un7zToPath(SevenZFile(fileChannel), destDir) } @Throws(NullPointerException::class, SecurityException::class) - fun un7zToPath(file: File, destDir: File?) { - un7zToPath(SevenZFile(file), destDir) + fun un7zToPath(file: File, destDir: File?): List { + return un7zToPath(SevenZFile(file), destDir) } @Throws(NullPointerException::class, SecurityException::class) - fun un7zToPath(filePath: String, destDir: File?) { - un7zToPath(SevenZFile(File(filePath)), destDir) + fun un7zToPath(filePath: String, destDir: File?): List { + return un7zToPath(SevenZFile(File(filePath)), destDir) } @Throws(NullPointerException::class, SecurityException::class) - fun un7zToPath(sevenZFile: SevenZFile, destDir: File?) { + fun un7zToPath(sevenZFile: SevenZFile, destDir: File?): List { destDir ?: throw NullPointerException("解决路径不能为空") + val files = arrayListOf() var entry: SevenZArchiveEntry? while (sevenZFile.nextEntry.also { entry = it } != null) { val entryFile = File(destDir, entry!!.name) @@ -92,7 +93,9 @@ object SevenZipUtils { } FileOutputStream(entryFile).use { sevenZFile.getInputStream(entry).copyTo(it) + files.add(entryFile) } } + return files } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/utils/compress/ZipUtils.kt b/app/src/main/java/io/legado/app/utils/compress/ZipUtils.kt index 2c64d82d5..db7bbb85b 100644 --- a/app/src/main/java/io/legado/app/utils/compress/ZipUtils.kt +++ b/app/src/main/java/io/legado/app/utils/compress/ZipUtils.kt @@ -177,35 +177,36 @@ object ZipUtils { } @Throws(SecurityException::class) - fun unZipToPath(file: File, path: String) { - FileInputStream(file).use { + fun unZipToPath(file: File, path: String): List { + return FileInputStream(file).use { unZipToPath(it, path) } } @Throws(SecurityException::class) - fun unZipToPath(file: File, dir: File) { - FileInputStream(file).use { + fun unZipToPath(file: File, dir: File): List { + return FileInputStream(file).use { unZipToPath(it, dir) } } @Throws(SecurityException::class) - fun unZipToPath(inputStream: InputStream, path: String) { - ZipInputStream(inputStream).use { + fun unZipToPath(inputStream: InputStream, path: String): List { + return ZipInputStream(inputStream).use { unZipToPath(it, File(path)) } } @Throws(SecurityException::class) - fun unZipToPath(inputStream: InputStream, dir: File) { - ZipInputStream(inputStream).use { + fun unZipToPath(inputStream: InputStream, dir: File): List { + return ZipInputStream(inputStream).use { unZipToPath(it, dir) } } @Throws(SecurityException::class) - fun unZipToPath(zipInputStream: ZipInputStream, dir: File) { + fun unZipToPath(zipInputStream: ZipInputStream, dir: File): List { + val files = arrayListOf() var entry: ZipEntry? while (zipInputStream.nextEntry.also { entry = it } != null) { val entryFile = File(dir, entry!!.name) @@ -228,8 +229,10 @@ object ZipUtils { } FileOutputStream(entryFile).use { zipInputStream.copyTo(it) + files.add(entryFile) } } + return files }