From 88d243c27d35c892b54e91c21b94e5a7a3eef44b Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 30 Jul 2023 15:52:40 +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 --- .../ui/book/bookmark/AllBookmarkViewModel.kt | 39 +++++++----------- .../io/legado/app/ui/book/toc/TocActivity.kt | 2 +- .../io/legado/app/ui/book/toc/TocViewModel.kt | 41 ++++--------------- .../io/legado/app/utils/FileDocExtensions.kt | 4 ++ .../java/io/legado/app/utils/UriExtensions.kt | 28 +++++++++++++ 5 files changed, 57 insertions(+), 57 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/bookmark/AllBookmarkViewModel.kt b/app/src/main/java/io/legado/app/ui/book/bookmark/AllBookmarkViewModel.kt index 55391327d..7531eef0c 100644 --- a/app/src/main/java/io/legado/app/ui/book/bookmark/AllBookmarkViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/bookmark/AllBookmarkViewModel.kt @@ -2,41 +2,32 @@ package io.legado.app.ui.book.bookmark import android.app.Application import android.net.Uri -import androidx.documentfile.provider.DocumentFile import io.legado.app.base.BaseViewModel import io.legado.app.constant.AppLog import io.legado.app.data.appDb -import io.legado.app.utils.* -import java.io.File -import java.io.FileOutputStream +import io.legado.app.utils.FileDoc +import io.legado.app.utils.GSON +import io.legado.app.utils.createFileIfNotExist +import io.legado.app.utils.openOutputStream +import io.legado.app.utils.toastOnUi +import io.legado.app.utils.writeToOutputStream import java.text.SimpleDateFormat -import java.util.* +import java.util.Date +import java.util.Locale class AllBookmarkViewModel(application: Application) : BaseViewModel(application) { - @Suppress("BlockingMethodInNonBlockingContext") + /** + * 导出书签 + */ fun saveToFile(treeUri: Uri) { execute { val dateFormat = SimpleDateFormat("yyMMddHHmmss", Locale.getDefault()) - val bookmark = appDb.bookmarkDao.all - if (treeUri.isContentScheme()) { - val doc = DocumentFile.fromTreeUri(context, treeUri) - ?.createFile("", "bookmark-${dateFormat.format(Date())}") - doc?.let { - context.contentResolver.openOutputStream(doc.uri)!!.use { - GSON.writeToOutputStream(it, bookmark) - } - } - } else { - val path = treeUri.path!! - val file = FileUtils.createFileIfNotExist( - File(path), - "bookmark-${dateFormat.format(Date())}" - ) - FileOutputStream(file).use { - GSON.writeToOutputStream(it, bookmark) - } + val fileName = "bookmark-${dateFormat.format(Date())}" + val dirDoc = FileDoc.fromUri(treeUri, true) + dirDoc.createFileIfNotExist(fileName).openOutputStream().getOrThrow().use { + GSON.writeToOutputStream(it, appDb.bookmarkDao.all) } }.onError { AppLog.put("导出失败\n${it.localizedMessage}", it, true) diff --git a/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt b/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt index 712f48cab..ab8aa76be 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt @@ -157,7 +157,7 @@ class TocActivity : VMBaseActivity(), viewModel.chapterListCallBack?.upChapterList(searchView?.query?.toString()) } - R.id.menu_export -> exportDir.launch() + R.id.menu_export_bookmark -> exportDir.launch() R.id.menu_log -> showDialogFragment() } diff --git a/app/src/main/java/io/legado/app/ui/book/toc/TocViewModel.kt b/app/src/main/java/io/legado/app/ui/book/toc/TocViewModel.kt index fe936e0e4..023c8520e 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/TocViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/TocViewModel.kt @@ -3,7 +3,6 @@ package io.legado.app.ui.book.toc import android.app.Application import android.net.Uri -import androidx.documentfile.provider.DocumentFile import androidx.lifecycle.MutableLiveData import io.legado.app.R import io.legado.app.base.BaseViewModel @@ -12,16 +11,11 @@ import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.exception.NoStackTraceException import io.legado.app.model.localBook.LocalBook -import io.legado.app.utils.FileUtils +import io.legado.app.utils.FileDoc import io.legado.app.utils.GSON -import io.legado.app.utils.isContentScheme +import io.legado.app.utils.createFileIfNotExist import io.legado.app.utils.toastOnUi -import io.legado.app.utils.writeToOutputStream -import java.io.File -import java.io.FileOutputStream -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale +import io.legado.app.utils.writeText class TocViewModel(application: Application) : BaseViewModel(application) { var bookUrl: String = "" @@ -78,34 +72,17 @@ class TocViewModel(application: Application) : BaseViewModel(application) { bookMarkCallBack?.upBookmark(newText) } - @Suppress("BlockingMethodInNonBlockingContext") fun saveBookmark(treeUri: Uri) { execute { val book = bookData.value ?: throw NoStackTraceException(context.getString(R.string.no_book)) - val dateFormat = SimpleDateFormat("yyMMddHHmmss", Locale.getDefault()) - val bookmark = appDb.bookmarkDao.getByBook(book.name, book.author) - if (treeUri.isContentScheme()) { - val doc = DocumentFile.fromTreeUri(context, treeUri) - ?.createFile("", "bookmark-${dateFormat.format(Date())}") - doc?.let { - context.contentResolver.openOutputStream(doc.uri)!!.use { - GSON.writeToOutputStream(it, bookmark) - } - } - } else { - val path = treeUri.path!! - val file = FileUtils.createFileIfNotExist( - File(path), "bookmark-${ - dateFormat.format( - Date() - ) - }" + val fileName = "bookmark-${book.name} ${book.author}" + val doc = FileDoc.fromUri(treeUri, true) + doc.createFileIfNotExist(fileName).writeText( + GSON.toJson( + appDb.bookmarkDao.getByBook(book.name, book.author) ) - FileOutputStream(file).use { - GSON.writeToOutputStream(it, bookmark) - } - } + ) }.onError { AppLog.put("导出失败\n${it.localizedMessage}", it, true) }.onSuccess { diff --git a/app/src/main/java/io/legado/app/utils/FileDocExtensions.kt b/app/src/main/java/io/legado/app/utils/FileDocExtensions.kt index af8b20f21..a62e5fb10 100644 --- a/app/src/main/java/io/legado/app/utils/FileDocExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/FileDocExtensions.kt @@ -232,6 +232,10 @@ fun FileDoc.openInputStream(): Result { return uri.inputStream(appCtx) } +fun FileDoc.openOutputStream(): Result { + return uri.outputStream(appCtx) +} + fun FileDoc.exists( fileName: String, vararg subDirs: String diff --git a/app/src/main/java/io/legado/app/utils/UriExtensions.kt b/app/src/main/java/io/legado/app/utils/UriExtensions.kt index 2dab574bb..ba50ffd2a 100644 --- a/app/src/main/java/io/legado/app/utils/UriExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/UriExtensions.kt @@ -17,7 +17,9 @@ import okio.source import splitties.init.appCtx import java.io.File import java.io.FileInputStream +import java.io.FileOutputStream import java.io.InputStream +import java.io.OutputStream import java.nio.charset.Charset fun Uri.isContentScheme() = this.scheme == "content" @@ -204,6 +206,32 @@ fun Uri.inputStream(context: Context): Result { } } +fun Uri.outputStream(context: Context): Result { + val uri = this + return kotlin.runCatching { + try { + if (isContentScheme()) { + DocumentFile.fromSingleUri(context, uri) + ?: throw NoStackTraceException("未获取到文件") + return@runCatching context.contentResolver.openOutputStream(uri)!! + } else { + val path = RealPathUtil.getPath(context, uri) + ?: throw NoStackTraceException("未获取到文件") + val file = File(path) + if (file.exists()) { + return@runCatching FileOutputStream(file) + } else { + throw NoStackTraceException("文件不存在") + } + } + } catch (e: Exception) { + e.printOnDebug() + AppLog.put("读取inputStream失败:${e.localizedMessage}", e) + throw e + } + } +} + fun Uri.toRequestBody(contentType: MediaType? = null): RequestBody { val uri = this return object : RequestBody() {