|
@@ -1,46 +1,183 @@
|
|
|
package io.legado.app.ui.book.search
|
|
package io.legado.app.ui.book.search
|
|
|
|
|
|
|
|
|
|
+import android.annotation.SuppressLint
|
|
|
import android.os.Bundle
|
|
import android.os.Bundle
|
|
|
import android.view.View
|
|
import android.view.View
|
|
|
import android.view.ViewGroup
|
|
import android.view.ViewGroup
|
|
|
|
|
+import androidx.recyclerview.widget.RecyclerView
|
|
|
import io.legado.app.R
|
|
import io.legado.app.R
|
|
|
import io.legado.app.base.BaseDialogFragment
|
|
import io.legado.app.base.BaseDialogFragment
|
|
|
|
|
+import io.legado.app.base.adapter.ItemViewHolder
|
|
|
|
|
+import io.legado.app.data.appDb
|
|
|
|
|
+import io.legado.app.data.entities.BookSource
|
|
|
import io.legado.app.databinding.DialogSearchScopeBinding
|
|
import io.legado.app.databinding.DialogSearchScopeBinding
|
|
|
|
|
+import io.legado.app.databinding.ItemCheckBoxBinding
|
|
|
|
|
+import io.legado.app.databinding.ItemRadioButtonBinding
|
|
|
import io.legado.app.lib.theme.primaryColor
|
|
import io.legado.app.lib.theme.primaryColor
|
|
|
import io.legado.app.utils.setLayout
|
|
import io.legado.app.utils.setLayout
|
|
|
import io.legado.app.utils.viewbindingdelegate.viewBinding
|
|
import io.legado.app.utils.viewbindingdelegate.viewBinding
|
|
|
|
|
+import kotlinx.coroutines.Dispatchers.IO
|
|
|
|
|
+import kotlinx.coroutines.launch
|
|
|
|
|
+import kotlinx.coroutines.withContext
|
|
|
|
|
|
|
|
class SearchScopeDialog : BaseDialogFragment(R.layout.dialog_search_scope) {
|
|
class SearchScopeDialog : BaseDialogFragment(R.layout.dialog_search_scope) {
|
|
|
|
|
|
|
|
private val binding by viewBinding(DialogSearchScopeBinding::bind)
|
|
private val binding by viewBinding(DialogSearchScopeBinding::bind)
|
|
|
- val callback: Callback
|
|
|
|
|
- get() {
|
|
|
|
|
- return parentFragment as? Callback ?: activity as Callback
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ val callback: Callback get() = parentFragment as? Callback ?: activity as Callback
|
|
|
|
|
+ var groups: List<String>? = null
|
|
|
|
|
+ var sources: List<BookSource>? = null
|
|
|
|
|
+
|
|
|
|
|
+ val adapter by lazy {
|
|
|
|
|
+ RecyclerAdapter()
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
override fun onStart() {
|
|
override fun onStart() {
|
|
|
super.onStart()
|
|
super.onStart()
|
|
|
- setLayout(0.9f, ViewGroup.LayoutParams.WRAP_CONTENT)
|
|
|
|
|
|
|
+ setLayout(0.9f, 0.8f)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
|
|
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
|
|
|
binding.toolBar.setBackgroundColor(primaryColor)
|
|
binding.toolBar.setBackgroundColor(primaryColor)
|
|
|
|
|
+ binding.recyclerView.adapter = adapter
|
|
|
initOtherView()
|
|
initOtherView()
|
|
|
|
|
+ initData()
|
|
|
|
|
+ upData()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun initOtherView() {
|
|
private fun initOtherView() {
|
|
|
|
|
+ binding.rgScope.setOnCheckedChangeListener { group, checkedId ->
|
|
|
|
|
+ upData()
|
|
|
|
|
+ }
|
|
|
binding.tvCancel.setOnClickListener {
|
|
binding.tvCancel.setOnClickListener {
|
|
|
dismiss()
|
|
dismiss()
|
|
|
}
|
|
}
|
|
|
binding.tvAllSource.setOnClickListener {
|
|
binding.tvAllSource.setOnClickListener {
|
|
|
callback.onSearchScopeOk(SearchScope(""))
|
|
callback.onSearchScopeOk(SearchScope(""))
|
|
|
|
|
+ dismiss()
|
|
|
}
|
|
}
|
|
|
binding.tvOk.setOnClickListener {
|
|
binding.tvOk.setOnClickListener {
|
|
|
- callback.onSearchScopeOk(SearchScope(""))
|
|
|
|
|
|
|
+ if (binding.rbGroup.isChecked) {
|
|
|
|
|
+ callback.onSearchScopeOk(SearchScope(adapter.selectGroups))
|
|
|
|
|
+ } else {
|
|
|
|
|
+ val selectSource = adapter.selectSource
|
|
|
|
|
+ if (selectSource != null) {
|
|
|
|
|
+ callback.onSearchScopeOk(SearchScope(selectSource))
|
|
|
|
|
+ } else {
|
|
|
|
|
+ callback.onSearchScopeOk(SearchScope(""))
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ dismiss()
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private fun initData() {
|
|
|
|
|
+ launch {
|
|
|
|
|
+ withContext(IO) {
|
|
|
|
|
+ groups = appDb.bookSourceDao.allGroups
|
|
|
|
|
+ sources = appDb.bookSourceDao.allEnabled
|
|
|
|
|
+ }
|
|
|
|
|
+ upData()
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @SuppressLint("NotifyDataSetChanged")
|
|
|
|
|
+ private fun upData() {
|
|
|
|
|
+ launch {
|
|
|
|
|
+ adapter.notifyDataSetChanged()
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ inner class RecyclerAdapter : RecyclerView.Adapter<ItemViewHolder>() {
|
|
|
|
|
+
|
|
|
|
|
+ val selectGroups = arrayListOf<String>()
|
|
|
|
|
+ var selectSource: BookSource? = null
|
|
|
|
|
+
|
|
|
|
|
+ override fun getItemViewType(position: Int): Int {
|
|
|
|
|
+ return if (binding.rbSource.isChecked) {
|
|
|
|
|
+ 1
|
|
|
|
|
+ } else {
|
|
|
|
|
+ 0
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
|
|
|
|
|
+ return if (viewType == 1) {
|
|
|
|
|
+ ItemViewHolder(ItemRadioButtonBinding.inflate(layoutInflater, parent, false))
|
|
|
|
|
+ } else {
|
|
|
|
|
+ ItemViewHolder(ItemCheckBoxBinding.inflate(layoutInflater, parent, false))
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ override fun onBindViewHolder(
|
|
|
|
|
+ holder: ItemViewHolder,
|
|
|
|
|
+ position: Int,
|
|
|
|
|
+ payloads: MutableList<Any>
|
|
|
|
|
+ ) {
|
|
|
|
|
+ if (payloads.isEmpty()) {
|
|
|
|
|
+ super.onBindViewHolder(holder, position, payloads)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ when (holder.binding) {
|
|
|
|
|
+ is ItemCheckBoxBinding -> {
|
|
|
|
|
+ groups?.get(position)?.let {
|
|
|
|
|
+ holder.binding.checkBox.isChecked = selectGroups.contains(it)
|
|
|
|
|
+ holder.binding.checkBox.text = it
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ is ItemRadioButtonBinding -> {
|
|
|
|
|
+ sources?.get(position)?.let {
|
|
|
|
|
+ holder.binding.radioButton.isChecked = selectSource == it
|
|
|
|
|
+ holder.binding.radioButton.text = it.bookSourceName
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
|
|
|
|
|
+ when (holder.binding) {
|
|
|
|
|
+ is ItemCheckBoxBinding -> {
|
|
|
|
|
+ groups?.get(position)?.let {
|
|
|
|
|
+ holder.binding.checkBox.isChecked = selectGroups.contains(it)
|
|
|
|
|
+ holder.binding.checkBox.text = it
|
|
|
|
|
+ holder.binding.checkBox.setOnCheckedChangeListener { buttonView, isChecked ->
|
|
|
|
|
+ if (buttonView.isPressed) {
|
|
|
|
|
+ if (isChecked) {
|
|
|
|
|
+ selectGroups.add(it)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ selectGroups.remove(it)
|
|
|
|
|
+ }
|
|
|
|
|
+ notifyItemRangeChanged(0, itemCount, "up")
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ is ItemRadioButtonBinding -> {
|
|
|
|
|
+ sources?.get(position)?.let {
|
|
|
|
|
+ holder.binding.radioButton.isChecked = selectSource == it
|
|
|
|
|
+ holder.binding.radioButton.text = it.bookSourceName
|
|
|
|
|
+ holder.binding.radioButton.setOnCheckedChangeListener { buttonView, isChecked ->
|
|
|
|
|
+ if (buttonView.isPressed) {
|
|
|
|
|
+ if (isChecked) {
|
|
|
|
|
+ selectSource = it
|
|
|
|
|
+ }
|
|
|
|
|
+ notifyItemRangeChanged(0, itemCount, "up")
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ override fun getItemCount(): Int {
|
|
|
|
|
+ return if (binding.rbSource.isChecked) {
|
|
|
|
|
+ sources?.size ?: 0
|
|
|
|
|
+ } else {
|
|
|
|
|
+ groups?.size ?: 0
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
interface Callback {
|
|
interface Callback {
|
|
|
|
|
|