|
|
@ -3,6 +3,7 @@ package io.legado.app.ui.book.remote |
|
|
|
import android.os.Bundle |
|
|
|
import android.os.Bundle |
|
|
|
import android.view.Menu |
|
|
|
import android.view.Menu |
|
|
|
import android.view.MenuItem |
|
|
|
import android.view.MenuItem |
|
|
|
|
|
|
|
import android.view.SubMenu |
|
|
|
import androidx.activity.viewModels |
|
|
|
import androidx.activity.viewModels |
|
|
|
import androidx.core.view.isGone |
|
|
|
import androidx.core.view.isGone |
|
|
|
import androidx.recyclerview.widget.LinearLayoutManager |
|
|
|
import androidx.recyclerview.widget.LinearLayoutManager |
|
|
@ -12,13 +13,19 @@ import io.legado.app.databinding.ActivityImportBookBinding |
|
|
|
import io.legado.app.lib.theme.backgroundColor |
|
|
|
import io.legado.app.lib.theme.backgroundColor |
|
|
|
import io.legado.app.ui.about.AppLogDialog |
|
|
|
import io.legado.app.ui.about.AppLogDialog |
|
|
|
import io.legado.app.ui.book.remote.manager.RemoteBookWebDav |
|
|
|
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.SelectActionBar |
|
|
|
import io.legado.app.ui.widget.dialog.WaitDialog |
|
|
|
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.showDialogFragment |
|
|
|
|
|
|
|
import io.legado.app.utils.toastOnUi |
|
|
|
import io.legado.app.utils.viewbindingdelegate.viewBinding |
|
|
|
import io.legado.app.utils.viewbindingdelegate.viewBinding |
|
|
|
|
|
|
|
import kotlinx.coroutines.delay |
|
|
|
import kotlinx.coroutines.flow.conflate |
|
|
|
import kotlinx.coroutines.flow.conflate |
|
|
|
|
|
|
|
import kotlinx.coroutines.flow.map |
|
|
|
import kotlinx.coroutines.launch |
|
|
|
import kotlinx.coroutines.launch |
|
|
|
import java.io.File |
|
|
|
import java.io.File |
|
|
|
|
|
|
|
import java.util.ArrayList |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* 展示远程书籍 |
|
|
|
* 展示远程书籍 |
|
|
@ -32,7 +39,9 @@ class RemoteBookActivity : VMBaseActivity<ActivityImportBookBinding, RemoteBookV |
|
|
|
override val viewModel by viewModels<RemoteBookViewModel>() |
|
|
|
override val viewModel by viewModels<RemoteBookViewModel>() |
|
|
|
private val adapter by lazy { RemoteBookAdapter(this, this) } |
|
|
|
private val adapter by lazy { RemoteBookAdapter(this, this) } |
|
|
|
private val waitDialog by lazy { WaitDialog(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?) { |
|
|
|
override fun onActivityCreated(savedInstanceState: Bundle?) { |
|
|
|
binding.titleBar.setTitle(R.string.remote_book) |
|
|
|
binding.titleBar.setTitle(R.string.remote_book) |
|
|
|
initView() |
|
|
|
initView() |
|
|
@ -48,13 +57,62 @@ class RemoteBookActivity : VMBaseActivity<ActivityImportBookBinding, RemoteBookV |
|
|
|
binding.selectActionBar.setCallBack(this) |
|
|
|
binding.selectActionBar.setCallBack(this) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun sortCheck(sortKey: Sort) { |
|
|
|
|
|
|
|
if (this.sortKey == sortKey) { |
|
|
|
|
|
|
|
sortAscending = !sortAscending |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
sortAscending = true |
|
|
|
|
|
|
|
this.sortKey = sortKey |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
private fun initData() { |
|
|
|
private fun initData() { |
|
|
|
binding.refreshProgressBar.isAutoLoading = true |
|
|
|
binding.refreshProgressBar.isAutoLoading = true |
|
|
|
launch { |
|
|
|
launch { |
|
|
|
viewModel.dataFlow.conflate().collect { remoteBooks -> |
|
|
|
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 -> |
|
|
|
binding.refreshProgressBar.isAutoLoading = false |
|
|
|
binding.refreshProgressBar.isAutoLoading = false |
|
|
|
binding.tvEmptyMsg.isGone = remoteBooks.isNotEmpty() |
|
|
|
binding.tvEmptyMsg.isGone = sortedRemoteBooks.isNotEmpty() |
|
|
|
adapter.setItems(remoteBooks) |
|
|
|
adapter.setItems(sortedRemoteBooks) |
|
|
|
|
|
|
|
delay(500) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
upPath() |
|
|
|
upPath() |
|
|
@ -75,10 +133,33 @@ class RemoteBookActivity : VMBaseActivity<ActivityImportBookBinding, RemoteBookV |
|
|
|
when (item.itemId) { |
|
|
|
when (item.itemId) { |
|
|
|
R.id.menu_refresh -> upPath() |
|
|
|
R.id.menu_refresh -> upPath() |
|
|
|
R.id.menu_log -> showDialogFragment<AppLogDialog>() |
|
|
|
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) |
|
|
|
|
|
|
|
upPath() |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return super.onCompatOptionsItemSelected(item) |
|
|
|
return super.onCompatOptionsItemSelected(item) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun onPrepareOptionsMenu(menu: Menu): Boolean { |
|
|
|
|
|
|
|
groupMenu = menu.findItem(R.id.menu_sort)?.subMenu |
|
|
|
|
|
|
|
groupMenu?.setGroupCheckable(R.id.menu_group_sort, true, true) |
|
|
|
|
|
|
|
return super.onPrepareOptionsMenu(menu) |
|
|
|
|
|
|
|
} |
|
|
|
override fun revertSelection() { |
|
|
|
override fun revertSelection() { |
|
|
|
adapter.revertSelection() |
|
|
|
adapter.revertSelection() |
|
|
|
} |
|
|
|
} |
|
|
@ -139,4 +220,8 @@ class RemoteBookActivity : VMBaseActivity<ActivityImportBookBinding, RemoteBookV |
|
|
|
override fun upCountView() { |
|
|
|
override fun upCountView() { |
|
|
|
binding.selectActionBar.upCountView(adapter.selected.size, adapter.checkableCount) |
|
|
|
binding.selectActionBar.upCountView(adapter.selected.size, adapter.checkableCount) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
enum class Sort { |
|
|
|
|
|
|
|
Default, Name, UpdateTime |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |