|
@@ -1,8 +1,6 @@
|
|
|
package io.legado.app.ui.book.import.local
|
|
package io.legado.app.ui.book.import.local
|
|
|
|
|
|
|
|
import android.app.Application
|
|
import android.app.Application
|
|
|
-import android.net.Uri
|
|
|
|
|
-import androidx.documentfile.provider.DocumentFile
|
|
|
|
|
import io.legado.app.base.BaseViewModel
|
|
import io.legado.app.base.BaseViewModel
|
|
|
import io.legado.app.constant.AppLog
|
|
import io.legado.app.constant.AppLog
|
|
|
import io.legado.app.constant.AppPattern.archiveFileRegex
|
|
import io.legado.app.constant.AppPattern.archiveFileRegex
|
|
@@ -11,19 +9,19 @@ import io.legado.app.constant.PreferKey
|
|
|
import io.legado.app.model.localBook.LocalBook
|
|
import io.legado.app.model.localBook.LocalBook
|
|
|
import io.legado.app.utils.AlphanumComparator
|
|
import io.legado.app.utils.AlphanumComparator
|
|
|
import io.legado.app.utils.FileDoc
|
|
import io.legado.app.utils.FileDoc
|
|
|
|
|
+import io.legado.app.utils.delete
|
|
|
import io.legado.app.utils.getPrefInt
|
|
import io.legado.app.utils.getPrefInt
|
|
|
-import io.legado.app.utils.isContentScheme
|
|
|
|
|
import io.legado.app.utils.list
|
|
import io.legado.app.utils.list
|
|
|
import io.legado.app.utils.toastOnUi
|
|
import io.legado.app.utils.toastOnUi
|
|
|
import kotlinx.coroutines.Dispatchers.IO
|
|
import kotlinx.coroutines.Dispatchers.IO
|
|
|
import kotlinx.coroutines.Dispatchers.Main
|
|
import kotlinx.coroutines.Dispatchers.Main
|
|
|
|
|
+import kotlinx.coroutines.FlowPreview
|
|
|
import kotlinx.coroutines.channels.awaitClose
|
|
import kotlinx.coroutines.channels.awaitClose
|
|
|
import kotlinx.coroutines.flow.callbackFlow
|
|
import kotlinx.coroutines.flow.callbackFlow
|
|
|
import kotlinx.coroutines.flow.flowOn
|
|
import kotlinx.coroutines.flow.flowOn
|
|
|
import kotlinx.coroutines.flow.map
|
|
import kotlinx.coroutines.flow.map
|
|
|
import kotlinx.coroutines.isActive
|
|
import kotlinx.coroutines.isActive
|
|
|
import kotlinx.coroutines.withContext
|
|
import kotlinx.coroutines.withContext
|
|
|
-import java.io.File
|
|
|
|
|
import java.util.Collections
|
|
import java.util.Collections
|
|
|
import kotlin.coroutines.coroutineContext
|
|
import kotlin.coroutines.coroutineContext
|
|
|
|
|
|
|
@@ -33,20 +31,24 @@ class ImportBookViewModel(application: Application) : BaseViewModel(application)
|
|
|
var sort = context.getPrefInt(PreferKey.localBookImportSort)
|
|
var sort = context.getPrefInt(PreferKey.localBookImportSort)
|
|
|
var dataCallback: DataCallback? = null
|
|
var dataCallback: DataCallback? = null
|
|
|
var dataFlowStart: (() -> Unit)? = null
|
|
var dataFlowStart: (() -> Unit)? = null
|
|
|
- val dataFlow = callbackFlow<List<FileDoc>> {
|
|
|
|
|
|
|
+ val dataFlow = callbackFlow<List<ImportBook>> {
|
|
|
|
|
|
|
|
- val list = Collections.synchronizedList(ArrayList<FileDoc>())
|
|
|
|
|
|
|
+ val list = Collections.synchronizedList(ArrayList<ImportBook>())
|
|
|
|
|
|
|
|
dataCallback = object : DataCallback {
|
|
dataCallback = object : DataCallback {
|
|
|
|
|
|
|
|
override fun setItems(fileDocs: List<FileDoc>) {
|
|
override fun setItems(fileDocs: List<FileDoc>) {
|
|
|
list.clear()
|
|
list.clear()
|
|
|
- list.addAll(fileDocs)
|
|
|
|
|
|
|
+ fileDocs.mapTo(list) {
|
|
|
|
|
+ ImportBook(it)
|
|
|
|
|
+ }
|
|
|
trySend(list)
|
|
trySend(list)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
override fun addItems(fileDocs: List<FileDoc>) {
|
|
override fun addItems(fileDocs: List<FileDoc>) {
|
|
|
- list.addAll(fileDocs)
|
|
|
|
|
|
|
+ fileDocs.mapTo(list) {
|
|
|
|
|
+ ImportBook(it)
|
|
|
|
|
+ }
|
|
|
trySend(list)
|
|
trySend(list)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -64,6 +66,10 @@ class ImportBookViewModel(application: Application) : BaseViewModel(application)
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ override fun upAdapter() {
|
|
|
|
|
+ trySend(list)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
withContext(Main) {
|
|
withContext(Main) {
|
|
@@ -76,21 +82,17 @@ class ImportBookViewModel(application: Application) : BaseViewModel(application)
|
|
|
|
|
|
|
|
}.map { docList ->
|
|
}.map { docList ->
|
|
|
val comparator = when (sort) {
|
|
val comparator = when (sort) {
|
|
|
- 2 -> compareBy<FileDoc>({ !it.isDir }, { -it.lastModified })
|
|
|
|
|
|
|
+ 2 -> compareBy<ImportBook>({ !it.isDir }, { -it.lastModified })
|
|
|
1 -> compareBy({ !it.isDir }, { -it.size })
|
|
1 -> compareBy({ !it.isDir }, { -it.size })
|
|
|
else -> compareBy { !it.isDir }
|
|
else -> compareBy { !it.isDir }
|
|
|
} then compareBy(AlphanumComparator) { it.name }
|
|
} then compareBy(AlphanumComparator) { it.name }
|
|
|
docList.sortedWith(comparator)
|
|
docList.sortedWith(comparator)
|
|
|
}.flowOn(IO)
|
|
}.flowOn(IO)
|
|
|
|
|
|
|
|
- fun addToBookshelf(uriList: HashSet<String>, finally: () -> Unit) {
|
|
|
|
|
|
|
+ fun addToBookshelf(bookList: HashSet<ImportBook>, finally: () -> Unit) {
|
|
|
execute {
|
|
execute {
|
|
|
- val fileUris = uriList.map {
|
|
|
|
|
- if (it.isContentScheme()) {
|
|
|
|
|
- Uri.parse(it)
|
|
|
|
|
- } else {
|
|
|
|
|
- Uri.fromFile(File(it))
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ val fileUris = bookList.map {
|
|
|
|
|
+ it.file.uri
|
|
|
}
|
|
}
|
|
|
LocalBook.importFiles(fileUris)
|
|
LocalBook.importFiles(fileUris)
|
|
|
}.onError {
|
|
}.onError {
|
|
@@ -101,17 +103,10 @@ class ImportBookViewModel(application: Application) : BaseViewModel(application)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- fun deleteDoc(uriList: HashSet<String>, finally: () -> Unit) {
|
|
|
|
|
|
|
+ fun deleteDoc(bookList: HashSet<ImportBook>, finally: () -> Unit) {
|
|
|
execute {
|
|
execute {
|
|
|
- uriList.forEach {
|
|
|
|
|
- val uri = Uri.parse(it)
|
|
|
|
|
- if (uri.isContentScheme()) {
|
|
|
|
|
- DocumentFile.fromSingleUri(context, uri)?.delete()
|
|
|
|
|
- } else {
|
|
|
|
|
- uri.path?.let { path ->
|
|
|
|
|
- File(path).delete()
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ bookList.forEach {
|
|
|
|
|
+ it.file.delete()
|
|
|
}
|
|
}
|
|
|
}.onFinally {
|
|
}.onFinally {
|
|
|
finally.invoke()
|
|
finally.invoke()
|
|
@@ -190,6 +185,8 @@ class ImportBookViewModel(application: Application) : BaseViewModel(application)
|
|
|
|
|
|
|
|
fun screen(key: String?)
|
|
fun screen(key: String?)
|
|
|
|
|
|
|
|
|
|
+ fun upAdapter()
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|