Просмотр исходного кода

feat: 1. 修复书记文件名为中文时显示乱码的问题
2. 添加上传和下载书籍时的加载框以及异常提示

谢意帆 4 лет назад
Родитель
Сommit
f935d7f197

+ 15 - 5
app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt

@@ -40,6 +40,7 @@ import io.legado.app.ui.book.source.edit.BookSourceEditActivity
 import io.legado.app.ui.book.toc.TocActivityResult
 import io.legado.app.ui.login.SourceLoginActivity
 import io.legado.app.ui.widget.dialog.PhotoDialog
+import io.legado.app.ui.widget.dialog.WaitDialog
 import io.legado.app.utils.*
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import kotlinx.coroutines.Dispatchers.IO
@@ -206,11 +207,20 @@ class BookInfoActivity :
             R.id.menu_upload -> {
                 launch {
                     val uri = Uri.parse(viewModel.bookData.value?.bookUrl.toString())
-                    if (RemoteBookWebDav.upload(uri))
-                        toastOnUi(getString(R.string.upload_book_success))
-                    else
-                        toastOnUi(getString(R.string.upload_book_fail))
-
+                    val waitDialog = WaitDialog(this@BookInfoActivity)
+                    waitDialog.setText("上传中.....")
+                    waitDialog.show()
+                    try {
+                        val isUpload = RemoteBookWebDav.upload(uri)
+                        if (isUpload)
+                            toastOnUi(getString(R.string.upload_book_success))
+                        else
+                            toastOnUi(getString(R.string.upload_book_fail))
+                    }catch (e : Exception){
+                        toastOnUi(e.localizedMessage)
+                    }finally {
+                        waitDialog.dismiss()
+                    }
                 }
             }
         }

+ 7 - 2
app/src/main/java/io/legado/app/ui/book/remote/RemoteBookActivity.kt

@@ -10,6 +10,7 @@ import io.legado.app.base.VMBaseActivity
 
 
 import io.legado.app.databinding.ActivityRemoteBookBinding
+import io.legado.app.ui.widget.dialog.WaitDialog
 import io.legado.app.utils.toastOnUi
 
 import io.legado.app.utils.viewbindingdelegate.viewBinding
@@ -50,9 +51,13 @@ class RemoteBookActivity : VMBaseActivity<ActivityRemoteBookBinding,RemoteBookVi
 
     @SuppressLint("NotifyDataSetChanged")
     override fun addToBookshelf(remoteBook: RemoteBook) {
-        viewModel.addToBookshelf(remoteBook){
-            toastOnUi(getString(R.string.download_book_fail))
+        val waitDialog = WaitDialog(this)
+        waitDialog.show()
+        viewModel.addToBookshelf(remoteBook, success = {
+            toastOnUi(getString(R.string.download_book_success))
             adapter.notifyDataSetChanged()
+        }){
+            waitDialog.dismiss()
         }
     }
 }

+ 6 - 1
app/src/main/java/io/legado/app/ui/book/remote/RemoteBookViewModel.kt

@@ -5,6 +5,7 @@ import android.net.Uri
 import io.legado.app.base.BaseViewModel
 import io.legado.app.model.localBook.LocalBook
 import io.legado.app.ui.book.remote.manager.RemoteBookWebDav
+import io.legado.app.utils.toastOnUi
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.channels.awaitClose
 import kotlinx.coroutines.flow.callbackFlow
@@ -69,12 +70,16 @@ class RemoteBookViewModel(application: Application): BaseViewModel(application){
     /**
      * 添加书籍到本地书架
      */
-    fun addToBookshelf(remoteBook: RemoteBook, finally: () -> Unit) {
+    fun addToBookshelf(remoteBook: RemoteBook, success: () -> Unit, finally: () -> Unit) {
         execute {
             val downloadBookPath = RemoteBookWebDav.getRemoteBook(remoteBook)
             downloadBookPath?.let {
                 LocalBook.importFile(it)
             }
+        }.onSuccess {
+            success.invoke()
+        }.onError {
+            context.toastOnUi(it.localizedMessage)
         }.onFinally {
             finally.invoke()
         }

+ 13 - 5
app/src/main/java/io/legado/app/ui/book/remote/manager/RemoteBookWebDav.kt

@@ -19,6 +19,7 @@ import io.legado.app.utils.readBytes
 import kotlinx.coroutines.runBlocking
 import splitties.init.appCtx
 import java.io.File
+import java.net.URLDecoder
 
 object RemoteBookWebDav : RemoteBookManager() {
     private val remoteBookUrl get() = "${rootWebDavUrl}${remoteBookFolder}"
@@ -48,6 +49,9 @@ object RemoteBookWebDav : RemoteBookManager() {
         }
     }
 
+    /**
+     * 获取远程书籍列表
+     */
     @Throws(Exception::class)
     override suspend fun getRemoteBookList(): MutableList<RemoteBook> {
         val remoteBooks = mutableListOf<RemoteBook>()
@@ -61,9 +65,10 @@ object RemoteBookWebDav : RemoteBookManager() {
             remoteWebDavFileList = remoteWebDavFileList!!.reversed()
             //转化远程文件信息到本地对象
             remoteWebDavFileList!!.forEach { webDavFile ->
-                val webDavFileName = webDavFile.displayName
-                val webDavUrlName = "${remoteBookUrl}${File.separator}${webDavFile.displayName}"
-
+                var webDavFileName = webDavFile.displayName
+                var webDavUrlName = "${remoteBookUrl}${File.separator}${webDavFile.displayName}"
+                webDavFileName = URLDecoder.decode(webDavFileName,"utf-8")
+                webDavUrlName = URLDecoder.decode(webDavUrlName,"utf-8")
                 // 转码
                 //val trueFileName = String(webDavFileName.toByteArray(Charset.forName("GBK")), Charset.forName("UTF-8"))
                 //val trueUrlName = String(webDavUrlName.toByteArray(Charset.forName("GBK")), Charset.forName("UTF-8"))
@@ -86,6 +91,9 @@ object RemoteBookWebDav : RemoteBookManager() {
         return remoteBooks
     }
 
+    /**
+     * 下载指定的远程书籍到本地
+     */
     override suspend fun getRemoteBook(remoteBook: RemoteBook): Uri? {
         return kotlin.runCatching {
             AppWebDav.authorization?.let {
@@ -98,7 +106,7 @@ object RemoteBookWebDav : RemoteBookManager() {
                 }
             }
         }.onFailure {
-            it.printStackTrace()
+            throw it
         }.getOrNull()
     }
 
@@ -122,7 +130,7 @@ object RemoteBookWebDav : RemoteBookManager() {
                 }
             }
         }.onFailure {
-            return false
+            throw it
         }
         return true
     }