优化
This commit is contained in:
@@ -12,6 +12,7 @@ import io.legado.app.base.VMBaseActivity
|
|||||||
|
|
||||||
|
|
||||||
import io.legado.app.databinding.ActivityRemoteBookBinding
|
import io.legado.app.databinding.ActivityRemoteBookBinding
|
||||||
|
import io.legado.app.ui.book.remote.manager.RemoteBookWebDav
|
||||||
import io.legado.app.ui.widget.dialog.WaitDialog
|
import io.legado.app.ui.widget.dialog.WaitDialog
|
||||||
import io.legado.app.utils.toastOnUi
|
import io.legado.app.utils.toastOnUi
|
||||||
|
|
||||||
@@ -50,7 +51,7 @@ class RemoteBookActivity : VMBaseActivity<ActivityRemoteBookBinding, RemoteBookV
|
|||||||
adapter.setItems(remoteBooks)
|
adapter.setItems(remoteBooks)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
viewModel.loadRemoteBookList()
|
viewModel.loadRemoteBookList(RemoteBookWebDav.rootBookUrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCompatCreateOptionsMenu(menu: Menu): Boolean {
|
override fun onCompatCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
@@ -61,14 +62,19 @@ class RemoteBookActivity : VMBaseActivity<ActivityRemoteBookBinding, RemoteBookV
|
|||||||
override fun onCompatOptionsItemSelected(item: MenuItem): Boolean {
|
override fun onCompatOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
when (item.itemId) {
|
when (item.itemId) {
|
||||||
R.id.menu_refresh -> {
|
R.id.menu_refresh -> {
|
||||||
viewModel.loadRemoteBookList()
|
viewModel.loadRemoteBookList(
|
||||||
|
viewModel.dirList.lastOrNull()?.path ?: RemoteBookWebDav.rootBookUrl
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return super.onCompatOptionsItemSelected(item)
|
return super.onCompatOptionsItemSelected(item)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun openDir(url: String) {
|
override fun openDir(remoteBook: RemoteBook) {
|
||||||
|
viewModel.dirList.add(remoteBook)
|
||||||
|
binding.titleBar.title = remoteBook.filename
|
||||||
|
viewModel.dataCallback?.clear()
|
||||||
|
viewModel.loadRemoteBookList(remoteBook.path)
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("NotifyDataSetChanged")
|
@SuppressLint("NotifyDataSetChanged")
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ class RemoteBookAdapter (context: Context, val callBack: CallBack) :
|
|||||||
binding.btnDownload.setOnClickListener {
|
binding.btnDownload.setOnClickListener {
|
||||||
getItem(holder.layoutPosition)?.let {
|
getItem(holder.layoutPosition)?.let {
|
||||||
if (it.isDir) {
|
if (it.isDir) {
|
||||||
callBack.openDir(it.path)
|
callBack.openDir(it)
|
||||||
} else {
|
} else {
|
||||||
callBack.addToBookshelf(it)
|
callBack.addToBookshelf(it)
|
||||||
}
|
}
|
||||||
@@ -61,7 +61,7 @@ class RemoteBookAdapter (context: Context, val callBack: CallBack) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface CallBack {
|
interface CallBack {
|
||||||
fun openDir(url: String)
|
fun openDir(remoteBook: RemoteBook)
|
||||||
fun addToBookshelf(remoteBook: RemoteBook)
|
fun addToBookshelf(remoteBook: RemoteBook)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,7 +5,7 @@ import android.net.Uri
|
|||||||
abstract class RemoteBookManager {
|
abstract class RemoteBookManager {
|
||||||
protected val remoteBookFolder : String = "books"
|
protected val remoteBookFolder : String = "books"
|
||||||
abstract suspend fun initRemoteContext()
|
abstract suspend fun initRemoteContext()
|
||||||
abstract suspend fun getRemoteBookList(): MutableList<RemoteBook>
|
abstract suspend fun getRemoteBookList(path: String): MutableList<RemoteBook>
|
||||||
abstract suspend fun upload(localBookUri: Uri): Boolean
|
abstract suspend fun upload(localBookUri: Uri): Boolean
|
||||||
abstract suspend fun delete(remoteBookUrl: String): Boolean
|
abstract suspend fun delete(remoteBookUrl: String): Boolean
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,10 @@ import kotlinx.coroutines.flow.flowOn
|
|||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class RemoteBookViewModel(application: Application): BaseViewModel(application){
|
class RemoteBookViewModel(application: Application): BaseViewModel(application){
|
||||||
private var dataCallback : DataCallback? = null
|
|
||||||
|
val dirList = arrayListOf<RemoteBook>()
|
||||||
|
|
||||||
|
var dataCallback: DataCallback? = null
|
||||||
|
|
||||||
val dataFlow = callbackFlow<List<RemoteBook>> {
|
val dataFlow = callbackFlow<List<RemoteBook>> {
|
||||||
|
|
||||||
@@ -49,10 +52,10 @@ class RemoteBookViewModel(application: Application): BaseViewModel(application){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun loadRemoteBookList() {
|
fun loadRemoteBookList(path: String) {
|
||||||
execute {
|
execute {
|
||||||
dataCallback?.clear()
|
dataCallback?.clear()
|
||||||
val bookList = RemoteBookWebDav.getRemoteBookList()
|
val bookList = RemoteBookWebDav.getRemoteBookList(path)
|
||||||
dataCallback?.setItems(bookList)
|
dataCallback?.setItems(bookList)
|
||||||
}.onError {
|
}.onError {
|
||||||
context.toastOnUi("获取webDav书籍出错\n${it.localizedMessage}")
|
context.toastOnUi("获取webDav书籍出错\n${it.localizedMessage}")
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import java.io.File
|
|||||||
import java.net.URLDecoder
|
import java.net.URLDecoder
|
||||||
|
|
||||||
object RemoteBookWebDav : RemoteBookManager() {
|
object RemoteBookWebDav : RemoteBookManager() {
|
||||||
private val remoteBookUrl get() = "${AppWebDav.rootWebDavUrl}${remoteBookFolder}"
|
val rootBookUrl get() = "${AppWebDav.rootWebDavUrl}${remoteBookFolder}"
|
||||||
|
|
||||||
init {
|
init {
|
||||||
runBlocking {
|
runBlocking {
|
||||||
@@ -29,7 +29,7 @@ object RemoteBookWebDav : RemoteBookManager() {
|
|||||||
|
|
||||||
override suspend fun initRemoteContext() {
|
override suspend fun initRemoteContext() {
|
||||||
AppWebDav.authorization?.let {
|
AppWebDav.authorization?.let {
|
||||||
WebDav(remoteBookUrl, it).makeAsDir()
|
WebDav(rootBookUrl, it).makeAsDir()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,11 +37,11 @@ object RemoteBookWebDav : RemoteBookManager() {
|
|||||||
* 获取远程书籍列表
|
* 获取远程书籍列表
|
||||||
*/
|
*/
|
||||||
@Throws(Exception::class)
|
@Throws(Exception::class)
|
||||||
override suspend fun getRemoteBookList(): MutableList<RemoteBook> {
|
override suspend fun getRemoteBookList(path: String): MutableList<RemoteBook> {
|
||||||
val remoteBooks = mutableListOf<RemoteBook>()
|
val remoteBooks = mutableListOf<RemoteBook>()
|
||||||
AppWebDav.authorization?.let {
|
AppWebDav.authorization?.let {
|
||||||
//读取文件列表
|
//读取文件列表
|
||||||
val remoteWebDavFileList: List<WebDavFile> = WebDav(remoteBookUrl, it).listFiles()
|
val remoteWebDavFileList: List<WebDavFile> = WebDav(path, it).listFiles()
|
||||||
//转化远程文件信息到本地对象
|
//转化远程文件信息到本地对象
|
||||||
remoteWebDavFileList.forEach { webDavFile ->
|
remoteWebDavFileList.forEach { webDavFile ->
|
||||||
var webDavFileName = webDavFile.displayName
|
var webDavFileName = webDavFile.displayName
|
||||||
@@ -93,7 +93,7 @@ object RemoteBookWebDav : RemoteBookManager() {
|
|||||||
if (!NetworkUtils.isAvailable()) return false
|
if (!NetworkUtils.isAvailable()) return false
|
||||||
|
|
||||||
val localBookName = localBookUri.path?.substringAfterLast(File.separator)
|
val localBookName = localBookUri.path?.substringAfterLast(File.separator)
|
||||||
val putUrl = "${remoteBookUrl}${File.separator}${localBookName}"
|
val putUrl = "${rootBookUrl}${File.separator}${localBookName}"
|
||||||
AppWebDav.authorization?.let {
|
AppWebDav.authorization?.let {
|
||||||
if (localBookUri.isContentScheme()) {
|
if (localBookUri.isContentScheme()) {
|
||||||
WebDav(putUrl, it).upload(
|
WebDav(putUrl, it).upload(
|
||||||
|
|||||||
Reference in New Issue
Block a user