@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -30,6 +30,15 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
<io.legado.app.ui.widget.anima.RotateLoading
|
||||
android:id="@+id/rotate_loading"
|
||||
android:layout_width="36dp"
|
||||
android:layout_height="36dp"
|
||||
android:layout_margin="6dp"
|
||||
android:visibility="gone"
|
||||
android:layout_gravity="center"
|
||||
app:loading_width="2dp" />
|
||||
|
||||
</io.legado.app.ui.widget.dynamiclayout.DynamicFrameLayout>
|
||||
|
||||
<!-- <io.legado.app.ui.widget.SelectActionBar-->
|
||||
@@ -47,10 +56,12 @@
|
||||
android:layout_margin="16dp"
|
||||
android:gravity="center"
|
||||
android:visibility="gone"
|
||||
android:text="webDav book文件夹为空"
|
||||
android:text="webDav books文件夹为空"
|
||||
app:layout_constraintTop_toBottomOf="@+id/title_bar"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
app:layout_constraintRight_toRightOf="parent"
|
||||
tools:text="Empty" />
|
||||
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
Reference in New Issue
Block a user