pull/2037/head
kunfei 2 years ago
parent 98f53dd9a0
commit 6dbfcf24fe
  1. 74
      app/src/main/java/io/legado/app/ui/book/remote/RemoteBookActivity.kt
  2. 12
      app/src/main/java/io/legado/app/ui/book/remote/RemoteBookViewModel.kt
  3. 5
      app/src/main/java/io/legado/app/ui/book/remote/Sort.kt
  4. 7
      app/src/main/res/menu/book_remote.xml

@ -13,19 +13,14 @@ import io.legado.app.databinding.ActivityImportBookBinding
import io.legado.app.lib.theme.backgroundColor
import io.legado.app.ui.about.AppLogDialog
import io.legado.app.ui.book.remote.manager.RemoteBookWebDav
import io.legado.app.ui.book.source.manage.BookSourceActivity
import io.legado.app.ui.widget.SelectActionBar
import io.legado.app.ui.widget.dialog.WaitDialog
import io.legado.app.utils.cnCompare
import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.toastOnUi
import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.conflate
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import java.io.File
import java.util.ArrayList
/**
* 展示远程书籍
@ -40,8 +35,6 @@ class RemoteBookActivity : VMBaseActivity<ActivityImportBookBinding, RemoteBookV
private val adapter by lazy { RemoteBookAdapter(this, this) }
private val waitDialog by lazy { WaitDialog(this) }
private var groupMenu: SubMenu? = null
private var sortKey = Sort.Default
private var sortAscending = false
override fun onActivityCreated(savedInstanceState: Bundle?) {
binding.titleBar.setTitle(R.string.remote_book)
initView()
@ -58,57 +51,18 @@ class RemoteBookActivity : VMBaseActivity<ActivityImportBookBinding, RemoteBookV
}
private fun sortCheck(sortKey: Sort) {
if (this.sortKey == sortKey) {
sortAscending = !sortAscending
if (viewModel.sortKey == sortKey) {
viewModel.sortAscending = !viewModel.sortAscending
} else {
sortAscending = true
this.sortKey = sortKey
viewModel.sortAscending = true
viewModel.sortKey = sortKey
}
}
private fun initData() {
binding.refreshProgressBar.isAutoLoading = true
launch {
viewModel.dataFlow.conflate().map { remoteBooks ->
val dirList = ArrayList<RemoteBook>()
val bookList = ArrayList<RemoteBook>()
remoteBooks.forEach {
if (it.isDir)
dirList.add(it)
else
bookList.add(it)
}
//默认情况下,为按修改时间倒序显示
if (sortAscending) when (sortKey) {
Sort.Name -> {
dirList.sortedBy { it.filename } +
bookList.sortedBy { it.filename }
}
Sort.UpdateTime -> {
dirList.sortedBy { it.lastModify } +
bookList.sortedBy { it.lastModify }
}
else -> dirList + bookList
}
else when (sortKey) {
Sort.Name -> {
dirList.sortedByDescending { it.filename } +
bookList.sortedByDescending { it.filename }
}
Sort.UpdateTime -> {
dirList.sortedByDescending { it.lastModify } +
bookList.sortedByDescending { it.lastModify }
}
//按修改时间倒序显示
else -> {
dirList.sortedByDescending { it.lastModify } +
bookList.sortedByDescending { it.lastModify }
}
}
}.conflate().collect { sortedRemoteBooks ->
viewModel.dataFlow.conflate().collect { sortedRemoteBooks ->
binding.refreshProgressBar.isAutoLoading = false
binding.tvEmptyMsg.isGone = sortedRemoteBooks.isNotEmpty()
adapter.setItems(sortedRemoteBooks)
@ -133,22 +87,14 @@ class RemoteBookActivity : VMBaseActivity<ActivityImportBookBinding, RemoteBookV
when (item.itemId) {
R.id.menu_refresh -> upPath()
R.id.menu_log -> showDialogFragment<AppLogDialog>()
R.id.menu_sort_auto -> {
item.isChecked = true
toastOnUi("menu_sort_auto")
sortCheck(Sort.Default)
upPath()
}
R.id.menu_sort_name -> {
item.isChecked = true
toastOnUi("menu_sort_name")
sortCheck(Sort.Name)
upPath()
}
R.id.menu_sort_time -> {
item.isChecked = true
toastOnUi("menu_sort_time")
sortCheck(Sort.UpdateTime)
sortCheck(Sort.Default)
upPath()
}
}
@ -158,8 +104,11 @@ class RemoteBookActivity : VMBaseActivity<ActivityImportBookBinding, RemoteBookV
override fun onPrepareOptionsMenu(menu: Menu): Boolean {
groupMenu = menu.findItem(R.id.menu_sort)?.subMenu
groupMenu?.setGroupCheckable(R.id.menu_group_sort, true, true)
groupMenu?.findItem(R.id.menu_sort_name)?.isChecked = viewModel.sortKey == Sort.Name
groupMenu?.findItem(R.id.menu_sort_time)?.isChecked = viewModel.sortKey == Sort.Default
return super.onPrepareOptionsMenu(menu)
}
override fun revertSelection() {
adapter.revertSelection()
}
@ -221,7 +170,4 @@ class RemoteBookActivity : VMBaseActivity<ActivityImportBookBinding, RemoteBookV
binding.selectActionBar.upCountView(adapter.selected.size, adapter.checkableCount)
}
enum class Sort {
Default, Name, UpdateTime
}
}

@ -10,10 +10,12 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import java.util.*
class RemoteBookViewModel(application: Application) : BaseViewModel(application) {
var sortKey = Sort.Default
var sortAscending = false
val dirList = arrayListOf<RemoteBook>()
var dataCallback: DataCallback? = null
@ -44,6 +46,14 @@ class RemoteBookViewModel(application: Application): BaseViewModel(application){
awaitClose {
dataCallback = null
}
}.map { list ->
if (sortAscending) when (sortKey) {
Sort.Name -> list.sortedWith(compareBy({ !it.isDir }, { it.filename }))
else -> list.sortedWith(compareBy({ !it.isDir }, { it.lastModify }))
} else when (sortKey) {
Sort.Name -> list.sortedWith(compareBy({ it.isDir }, { it.filename })).reversed()
else -> list.sortedWith(compareBy({ it.isDir }, { it.lastModify })).reversed()
}
}.flowOn(Dispatchers.IO)
init {

@ -0,0 +1,5 @@
package io.legado.app.ui.book.remote
enum class Sort {
Default, Name
}

@ -20,12 +20,6 @@
android:id="@+id/menu_group_sort"
android:checkableBehavior="single">
<item
android:id="@+id/menu_sort_default"
android:checkable="true"
android:checked="true"
android:title="@string/sort_default" />
<item
android:id="@+id/menu_sort_name"
android:checkable="true"
@ -36,7 +30,6 @@
android:checkable="true"
android:title="@string/sort_by_lastUpdateTime" />
</group>
</menu>

Loading…
Cancel
Save