diff --git a/app/src/main/java/io/legado/app/exception/NoBooksDirException.kt b/app/src/main/java/io/legado/app/exception/NoBooksDirException.kt new file mode 100644 index 000000000..d53e89b42 --- /dev/null +++ b/app/src/main/java/io/legado/app/exception/NoBooksDirException.kt @@ -0,0 +1,6 @@ +package io.legado.app.exception + +import io.legado.app.R +import splitties.init.appCtx + +class NoBooksDirException: NoStackTraceException(appCtx.getString(R.string.no_books_dir)) \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt index 2797bbe16..9400d09eb 100644 --- a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt +++ b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt @@ -13,6 +13,7 @@ import io.legado.app.data.entities.BaseSource import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter import io.legado.app.exception.EmptyFileException +import io.legado.app.exception.NoBooksDirException import io.legado.app.exception.NoStackTraceException import io.legado.app.exception.TocEmptyException import io.legado.app.help.AppWebDav @@ -160,7 +161,7 @@ object LocalBook { //updateTime变量不要修改,否则会导致读取不到缓存 val (fileName, _, _, updateTime, _) = FileDoc.fromUri(uri, false).apply { if (size == 0L) throw EmptyFileException("Unexpected empty File") - + bookUrl = toString() } var book = appDb.bookDao.getBook(bookUrl) @@ -251,7 +252,7 @@ object LocalBook { source: BaseSource? = null, ): Uri { AppConfig.defaultBookTreeUri - ?: throw NoStackTraceException("没有设置书籍保存位置!") + ?: throw NoBooksDirException() val inputStream = when { str.isAbsUrl() -> AnalyzeUrl(str, source = source).getInputStream() str.isDataUrl() -> ByteArrayInputStream( @@ -278,7 +279,7 @@ object LocalBook { ): Uri { inputStream.use { val defaultBookTreeUri = AppConfig.defaultBookTreeUri - if (defaultBookTreeUri.isNullOrBlank()) throw NoStackTraceException("没有设置书籍保存位置!") + if (defaultBookTreeUri.isNullOrBlank()) throw NoBooksDirException() val treeUri = Uri.parse(defaultBookTreeUri) return if (treeUri.isContentScheme()) { val treeDoc = DocumentFile.fromTreeUri(appCtx, treeUri) @@ -326,7 +327,7 @@ object LocalBook { if (webDavUrl.isNullOrBlank()) return null try { AppConfig.defaultBookTreeUri - ?: throw NoStackTraceException("没有设置书籍保存位置!") + ?: throw NoBooksDirException() // 兼容旧版链接 val webdav: WebDav = kotlin.runCatching { WebDav.fromPath(webDavUrl) 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 9fd0b0399..f94ceabd2 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 @@ -40,6 +40,7 @@ import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.book.search.SearchActivity import io.legado.app.ui.book.source.edit.BookSourceEditActivity import io.legado.app.ui.book.toc.TocActivityResult +import io.legado.app.ui.document.HandleFileContract import io.legado.app.ui.login.SourceLoginActivity import io.legado.app.ui.widget.dialog.PhotoDialog import io.legado.app.ui.widget.dialog.WaitDialog @@ -77,6 +78,11 @@ class BookInfoActivity : } } } + private val localBookTreeSelect = registerForActivityResult(HandleFileContract()) { + it.uri?.let { treeUri -> + AppConfig.defaultBookTreeUri = treeUri.toString() + } + } private val readBookResult = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { @@ -215,6 +221,16 @@ class BookInfoActivity : return super.onCompatOptionsItemSelected(item) } + override fun observeLiveBus() { + viewModel.actionLive.observe(this) { + when (it) { + "selectBooksDir" -> localBookTreeSelect.launch { + title = getString(R.string.select_book_folder) + } + } + } + } + private fun upLoadBook( book: Book, bookWebDav: RemoteBookWebDav? = AppWebDav.defaultBookWebDav 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 90c09bff1..6a1a64071 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 @@ -1,21 +1,21 @@ package io.legado.app.ui.book.info -import android.net.Uri import android.app.Application import android.content.Intent +import android.net.Uri import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import io.legado.app.R import io.legado.app.base.BaseViewModel import io.legado.app.constant.AppLog import io.legado.app.constant.AppPattern -import io.legado.app.constant.BookSourceType import io.legado.app.constant.BookType import io.legado.app.constant.EventBus import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookSource +import io.legado.app.exception.NoBooksDirException import io.legado.app.exception.NoStackTraceException import io.legado.app.help.AppWebDav import io.legado.app.help.book.* @@ -37,6 +37,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { var bookSource: BookSource? = null private var changeSourceCoroutine: Coroutine<*>? = null val waitDialogData = MutableLiveData() + val actionLive = MutableLiveData() fun initData(intent: Intent) { execute { @@ -252,24 +253,30 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { /* 导入或者下载在线文件 */ fun importOrDownloadWebFile(webFile: WebFile, success: ((T) -> Unit)?) { - bookSource ?: return - execute { - waitDialogData.postValue(true) - if (webFile.isSupported) { - val book = LocalBook.importFileOnLine(webFile.url, webFile.name, bookSource) - changeToLocalBook(book) - } else { - LocalBook.saveBookFile(webFile.url, webFile.name, bookSource) - } - }.onSuccess { - @Suppress("unchecked_cast") - success?.invoke(it as T) - }.onError { - context.toastOnUi("ImportWebFileError\n${it.localizedMessage}") - webFiles.remove(webFile) - }.onFinally { - waitDialogData.postValue(false) - } + bookSource ?: return + execute { + waitDialogData.postValue(true) + if (webFile.isSupported) { + val book = LocalBook.importFileOnLine(webFile.url, webFile.name, bookSource) + changeToLocalBook(book) + } else { + LocalBook.saveBookFile(webFile.url, webFile.name, bookSource) + } + }.onSuccess { + @Suppress("unchecked_cast") + success?.invoke(it as T) + }.onError { + when (it) { + is NoBooksDirException -> actionLive.postValue("selectBooksDir") + else -> { + AppLog.put("ImportWebFileError\n${it.localizedMessage}", it) + context.toastOnUi("ImportWebFileError\n${it.localizedMessage}") + webFiles.remove(webFile) + } + } + }.onFinally { + waitDialogData.postValue(false) + } } fun deCompress(archiveFileUri: Uri, onSuccess: (List) -> Unit) { @@ -289,7 +296,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { fileDoc.uri.inputStream(context).getOrThrow(), fileDoc.name ) - LocalBook.importFile(uri).let { changeToLocalBook(it) } + changeToLocalBook(LocalBook.importFile(uri)) } fun changeTo(source: BookSource, book: Book, toc: List) { diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 9f57dbfa3..f38f3af61 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1081,4 +1081,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 0db86d8a4..63d96ac55 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -1084,4 +1084,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 17a8f285f..34578550d 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1084,4 +1084,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 4e33cc53a..8c79296b3 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -1081,4 +1081,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 91f3058a0..4229d7a57 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1083,4 +1083,5 @@ 服务器配置 远程webDav链接已存在,是否继续 压缩文件内没有支持的文件 + 没有设置书籍保存位置! diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 5dacb47c1..7897d104e 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1083,4 +1083,5 @@ 服务器配置 远程webDav链接已存在,是否继续 压缩文件内没有支持的文件 + 没有设置书籍保存位置! diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 468fcb9db..cbf4f1cd5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1084,4 +1084,5 @@ 服务器配置 Remote webDav url exists, Continue? Cannot find supported files in archive + 没有设置书籍保存位置!