Browse Source

书架管理添加筛选

kunfei 4 years ago
parent
commit
68d7b28a7e

+ 64 - 16
app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageActivity.kt

@@ -6,6 +6,7 @@ import android.view.Menu
 import android.view.MenuItem
 import android.view.MenuItem
 import androidx.activity.viewModels
 import androidx.activity.viewModels
 import androidx.appcompat.widget.PopupMenu
 import androidx.appcompat.widget.PopupMenu
+import androidx.appcompat.widget.SearchView
 import androidx.recyclerview.widget.ItemTouchHelper
 import androidx.recyclerview.widget.ItemTouchHelper
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.LinearLayoutManager
 import io.legado.app.R
 import io.legado.app.R
@@ -34,6 +35,7 @@ import io.legado.app.utils.viewbindingdelegate.viewBinding
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.flow.conflate
 import kotlinx.coroutines.flow.conflate
+import kotlinx.coroutines.flow.flowOn
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 import kotlinx.coroutines.withContext
@@ -55,23 +57,26 @@ class BookshelfManageActivity :
     private val adapter by lazy { BookAdapter(this, this) }
     private val adapter by lazy { BookAdapter(this, this) }
     private var booksFlowJob: Job? = null
     private var booksFlowJob: Job? = null
     private var menu: Menu? = null
     private var menu: Menu? = null
-    private var groupId: Long = -1
+    private var searchView: SearchView? = null
 
 
     override fun onActivityCreated(savedInstanceState: Bundle?) {
     override fun onActivityCreated(savedInstanceState: Bundle?) {
-        groupId = intent.getLongExtra("groupId", -1)
+        viewModel.groupId = intent.getLongExtra("groupId", -1)
         launch {
         launch {
-            binding.titleBar.subtitle = withContext(IO) {
-                appDb.bookGroupDao.getByID(groupId)?.groupName
+            viewModel.groupName = withContext(IO) {
+                appDb.bookGroupDao.getByID(viewModel.groupId)?.groupName
                     ?: getString(R.string.no_group)
                     ?: getString(R.string.no_group)
             }
             }
+            binding.titleBar.subtitle = viewModel.groupName
         }
         }
-        initView()
+        initRecyclerView()
+        initOtherView()
         initGroupData()
         initGroupData()
-        initBookData()
+        upBookData()
     }
     }
 
 
     override fun onCompatCreateOptionsMenu(menu: Menu): Boolean {
     override fun onCompatCreateOptionsMenu(menu: Menu): Boolean {
         menuInflater.inflate(R.menu.bookshelf_manage, menu)
         menuInflater.inflate(R.menu.bookshelf_manage, menu)
+        initSearchView(menu)
         return super.onCompatCreateOptionsMenu(menu)
         return super.onCompatCreateOptionsMenu(menu)
     }
     }
 
 
@@ -93,7 +98,37 @@ class BookshelfManageActivity :
         selectGroup(groupRequestCode, 0)
         selectGroup(groupRequestCode, 0)
     }
     }
 
 
-    private fun initView() {
+    private fun showTitle() {
+        binding.titleBar.title = getString(R.string.bookshelf_management)
+        binding.titleBar.subtitle = viewModel.groupName
+    }
+
+    private fun initSearchView(menu: Menu) {
+        searchView = menu.findItem(R.id.menu_screen).actionView as SearchView
+        searchView?.run {
+            setOnCloseListener {
+                showTitle()
+                false
+            }
+            setOnSearchClickListener {
+                binding.titleBar.title = ""
+                binding.titleBar.subtitle = ""
+            }
+            setOnQueryTextListener(object : SearchView.OnQueryTextListener {
+                override fun onQueryTextSubmit(query: String?): Boolean {
+                    return false
+                }
+
+                override fun onQueryTextChange(newText: String?): Boolean {
+                    upBookData(newText)
+                    return false
+                }
+
+            })
+        }
+    }
+
+    private fun initRecyclerView() {
         binding.recyclerView.setEdgeEffectColor(primaryColor)
         binding.recyclerView.setEdgeEffectColor(primaryColor)
         binding.recyclerView.layoutManager = LinearLayoutManager(this)
         binding.recyclerView.layoutManager = LinearLayoutManager(this)
         binding.recyclerView.addItemDecoration(VerticalDivider(this))
         binding.recyclerView.addItemDecoration(VerticalDivider(this))
@@ -107,6 +142,9 @@ class BookshelfManageActivity :
         dragSelectTouchHelper.activeSlideSelect()
         dragSelectTouchHelper.activeSlideSelect()
         // Note: need judge selection first, so add ItemTouchHelper after it.
         // Note: need judge selection first, so add ItemTouchHelper after it.
         ItemTouchHelper(itemTouchCallback).attachToRecyclerView(binding.recyclerView)
         ItemTouchHelper(itemTouchCallback).attachToRecyclerView(binding.recyclerView)
+    }
+
+    private fun initOtherView() {
         binding.selectActionBar.setMainActionText(R.string.move_to_group)
         binding.selectActionBar.setMainActionText(R.string.move_to_group)
         binding.selectActionBar.inflateMenu(R.menu.bookshelf_menage_sel)
         binding.selectActionBar.inflateMenu(R.menu.bookshelf_menage_sel)
         binding.selectActionBar.setOnMenuItemClickListener(this)
         binding.selectActionBar.setOnMenuItemClickListener(this)
@@ -136,18 +174,25 @@ class BookshelfManageActivity :
         }
         }
     }
     }
 
 
-    private fun initBookData() {
+    private fun upBookData(searchKey: String? = null) {
         booksFlowJob?.cancel()
         booksFlowJob?.cancel()
         booksFlowJob = launch {
         booksFlowJob = launch {
-            when (groupId) {
+            when (viewModel.groupId) {
                 AppConst.rootGroupId -> appDb.bookDao.flowNetNoGroup()
                 AppConst.rootGroupId -> appDb.bookDao.flowNetNoGroup()
                 AppConst.bookGroupAllId -> appDb.bookDao.flowAll()
                 AppConst.bookGroupAllId -> appDb.bookDao.flowAll()
                 AppConst.bookGroupLocalId -> appDb.bookDao.flowLocal()
                 AppConst.bookGroupLocalId -> appDb.bookDao.flowLocal()
                 AppConst.bookGroupAudioId -> appDb.bookDao.flowAudio()
                 AppConst.bookGroupAudioId -> appDb.bookDao.flowAudio()
                 AppConst.bookGroupNetNoneId -> appDb.bookDao.flowNetNoGroup()
                 AppConst.bookGroupNetNoneId -> appDb.bookDao.flowNetNoGroup()
                 AppConst.bookGroupLocalNoneId -> appDb.bookDao.flowLocalNoGroup()
                 AppConst.bookGroupLocalNoneId -> appDb.bookDao.flowLocalNoGroup()
-                else -> appDb.bookDao.flowByGroup(groupId)
-            }.conflate().map { books ->
+                else -> appDb.bookDao.flowByGroup(viewModel.groupId)
+            }.conflate().map { list ->
+                val books = if (searchKey.isNullOrBlank()) {
+                    list
+                } else {
+                    list.filter {
+                        it.name.contains(searchKey) || it.author.contains(searchKey)
+                    }
+                }
                 when (getPrefInt(PreferKey.bookshelfSort)) {
                 when (getPrefInt(PreferKey.bookshelfSort)) {
                     1 -> books.sortedByDescending {
                     1 -> books.sortedByDescending {
                         it.latestChapterTime
                         it.latestChapterTime
@@ -162,9 +207,10 @@ class BookshelfManageActivity :
                         it.durChapterTime
                         it.durChapterTime
                     }
                     }
                 }
                 }
-            }.conflate().collect { books ->
-                adapter.setItems(books)
-            }
+            }.flowOn(IO)
+                .conflate().collect { books ->
+                    adapter.setItems(books)
+                }
         }
         }
     }
     }
 
 
@@ -172,9 +218,11 @@ class BookshelfManageActivity :
         when (item.itemId) {
         when (item.itemId) {
             R.id.menu_group_manage -> showDialogFragment<GroupManageDialog>()
             R.id.menu_group_manage -> showDialogFragment<GroupManageDialog>()
             else -> if (item.groupId == R.id.menu_group) {
             else -> if (item.groupId == R.id.menu_group) {
+                viewModel.groupName = item.title.toString()
                 binding.titleBar.subtitle = item.title
                 binding.titleBar.subtitle = item.title
-                groupId = appDb.bookGroupDao.getByName(item.title.toString())?.groupId ?: 0
-                initBookData()
+                viewModel.groupId =
+                    appDb.bookGroupDao.getByName(item.title.toString())?.groupId ?: 0
+                upBookData()
             }
             }
         }
         }
         return super.onCompatOptionsItemSelected(item)
         return super.onCompatOptionsItemSelected(item)

+ 2 - 1
app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageViewModel.kt

@@ -13,7 +13,8 @@ import io.legado.app.utils.toastOnUi
 
 
 
 
 class BookshelfManageViewModel(application: Application) : BaseViewModel(application) {
 class BookshelfManageViewModel(application: Application) : BaseViewModel(application) {
-
+    var groupId: Long = -1L
+    var groupName: String? = null
     val batchChangeSourceState = mutableStateOf(false)
     val batchChangeSourceState = mutableStateOf(false)
     val batchChangeSourceSize = mutableStateOf(0)
     val batchChangeSourceSize = mutableStateOf(0)
     val batchChangeSourcePosition = mutableStateOf(0)
     val batchChangeSourcePosition = mutableStateOf(0)

+ 11 - 2
app/src/main/res/menu/bookshelf_manage.xml

@@ -1,11 +1,20 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto">
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="AlwaysShowAction">
+
+    <item
+        android:id="@+id/menu_screen"
+        android:icon="@drawable/ic_screen"
+        android:title="@string/screen"
+        app:actionViewClass="androidx.appcompat.widget.SearchView"
+        app:showAsAction="always" />
 
 
     <item
     <item
         android:id="@+id/menu_book_group"
         android:id="@+id/menu_book_group"
-        android:title="@string/group"
         android:icon="@drawable/ic_groups"
         android:icon="@drawable/ic_groups"
+        android:title="@string/group"
         app:showAsAction="always">
         app:showAsAction="always">
 
 
         <menu>
         <menu>