|
|
@@ -25,10 +25,9 @@ import io.legado.app.ui.widget.SelectActionBar
|
|
|
import io.legado.app.utils.*
|
|
|
import io.legado.app.utils.viewbindingdelegate.viewBinding
|
|
|
import kotlinx.coroutines.Dispatchers.IO
|
|
|
-import kotlinx.coroutines.Dispatchers.Main
|
|
|
+import kotlinx.coroutines.Job
|
|
|
import kotlinx.coroutines.flow.conflate
|
|
|
import kotlinx.coroutines.launch
|
|
|
-import kotlinx.coroutines.withContext
|
|
|
import java.io.File
|
|
|
|
|
|
/**
|
|
|
@@ -41,10 +40,10 @@ class ImportBookActivity : VMBaseActivity<ActivityImportBookBinding, ImportBookV
|
|
|
|
|
|
override val binding by viewBinding(ActivityImportBookBinding::inflate)
|
|
|
override val viewModel by viewModels<ImportBookViewModel>()
|
|
|
- private val bookFileRegex = Regex("(?i).*\\.(txt|epub|umd)")
|
|
|
private var rootDoc: FileDoc? = null
|
|
|
private val subDocs = arrayListOf<FileDoc>()
|
|
|
private val adapter by lazy { ImportBookAdapter(this, this) }
|
|
|
+ private var scanDocJob: Job? = null
|
|
|
|
|
|
private val selectFolder = registerForActivityResult(HandleFileContract()) {
|
|
|
it.uri?.let { uri ->
|
|
|
@@ -62,7 +61,6 @@ class ImportBookActivity : VMBaseActivity<ActivityImportBookBinding, ImportBookV
|
|
|
initView()
|
|
|
initEvent()
|
|
|
initData()
|
|
|
- initRootDoc()
|
|
|
}
|
|
|
|
|
|
override fun onCompatCreateOptionsMenu(menu: Menu): Boolean {
|
|
|
@@ -84,15 +82,15 @@ class ImportBookActivity : VMBaseActivity<ActivityImportBookBinding, ImportBookV
|
|
|
R.id.menu_import_file_name -> alertImportFileName()
|
|
|
R.id.menu_sort_name -> {
|
|
|
viewModel.sort = 0
|
|
|
- upPath()
|
|
|
+ upSort()
|
|
|
}
|
|
|
R.id.menu_sort_size -> {
|
|
|
viewModel.sort = 1
|
|
|
- upPath()
|
|
|
+ upSort()
|
|
|
}
|
|
|
R.id.menu_sort_time -> {
|
|
|
viewModel.sort = 2
|
|
|
- upPath()
|
|
|
+ upSort()
|
|
|
}
|
|
|
}
|
|
|
return super.onCompatOptionsItemSelected(item)
|
|
|
@@ -140,11 +138,19 @@ class ImportBookActivity : VMBaseActivity<ActivityImportBookBinding, ImportBookV
|
|
|
}
|
|
|
|
|
|
private fun initData() {
|
|
|
+ viewModel.dataFlowStart = {
|
|
|
+ initRootDoc()
|
|
|
+ }
|
|
|
launch {
|
|
|
appDb.bookDao.flowLocalUri().conflate().collect {
|
|
|
adapter.upBookHas(it)
|
|
|
}
|
|
|
}
|
|
|
+ launch {
|
|
|
+ viewModel.dataFlow.conflate().collect { docs ->
|
|
|
+ adapter.setItems(docs)
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
private fun initRootDoc() {
|
|
|
@@ -197,9 +203,16 @@ class ImportBookActivity : VMBaseActivity<ActivityImportBookBinding, ImportBookV
|
|
|
.request()
|
|
|
}
|
|
|
|
|
|
+ private fun upSort() {
|
|
|
+ if (scanDocJob?.isCancelled == true || scanDocJob?.isCompleted == true) {
|
|
|
+ viewModel.dataCallback?.setItems(adapter.getItems())
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
@Synchronized
|
|
|
private fun upPath() {
|
|
|
rootDoc?.let {
|
|
|
+ scanDocJob?.cancel()
|
|
|
upDocs(it)
|
|
|
}
|
|
|
}
|
|
|
@@ -215,44 +228,7 @@ class ImportBookActivity : VMBaseActivity<ActivityImportBookBinding, ImportBookV
|
|
|
binding.tvPath.text = path
|
|
|
adapter.selectedUris.clear()
|
|
|
adapter.clearItems()
|
|
|
- launch(IO) {
|
|
|
- runCatching {
|
|
|
- val docList = DocumentUtils.listFiles(lastDoc.uri) { item ->
|
|
|
- when {
|
|
|
- item.name.startsWith(".") -> false
|
|
|
- item.isDir -> true
|
|
|
- else -> item.name.matches(bookFileRegex)
|
|
|
- }
|
|
|
- }
|
|
|
- when (viewModel.sort) {
|
|
|
- 2 -> docList.sortWith(
|
|
|
- compareBy(
|
|
|
- { !it.isDir },
|
|
|
- { it.date },
|
|
|
- { it.name }
|
|
|
- )
|
|
|
- )
|
|
|
- 1 -> docList.sortWith(
|
|
|
- compareBy(
|
|
|
- { !it.isDir },
|
|
|
- { it.size },
|
|
|
- { it.name }
|
|
|
- )
|
|
|
- )
|
|
|
- else -> docList.sortWith(
|
|
|
- compareBy(
|
|
|
- { !it.isDir },
|
|
|
- { it.name }
|
|
|
- )
|
|
|
- )
|
|
|
- }
|
|
|
- withContext(Main) {
|
|
|
- adapter.setItems(docList)
|
|
|
- }
|
|
|
- }.onFailure {
|
|
|
- toastOnUi("获取文件列表出错\n${it.localizedMessage}")
|
|
|
- }
|
|
|
- }
|
|
|
+ viewModel.loadDoc(lastDoc.uri)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -263,8 +239,9 @@ class ImportBookActivity : VMBaseActivity<ActivityImportBookBinding, ImportBookV
|
|
|
adapter.clearItems()
|
|
|
val lastDoc = subDocs.lastOrNull() ?: doc
|
|
|
binding.refreshProgressBar.isAutoLoading = true
|
|
|
- launch(IO) {
|
|
|
- viewModel.scanDoc(lastDoc, true, find) {
|
|
|
+ scanDocJob?.cancel()
|
|
|
+ scanDocJob = launch(IO) {
|
|
|
+ viewModel.scanDoc(lastDoc, true, this) {
|
|
|
launch {
|
|
|
binding.refreshProgressBar.isAutoLoading = false
|
|
|
}
|
|
|
@@ -288,12 +265,6 @@ class ImportBookActivity : VMBaseActivity<ActivityImportBookBinding, ImportBookV
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private val find: (docItem: FileDoc) -> Unit = {
|
|
|
- launch {
|
|
|
- adapter.addItem(it)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
@Synchronized
|
|
|
override fun nextDoc(fileDoc: FileDoc) {
|
|
|
subDocs.add(fileDoc)
|