parent
328cb66b3a
commit
bc1b10b441
@ -0,0 +1,176 @@ |
|||||||
|
package io.legado.app.ui.association |
||||||
|
|
||||||
|
import android.annotation.SuppressLint |
||||||
|
import android.content.Context |
||||||
|
import android.content.DialogInterface |
||||||
|
import android.os.Bundle |
||||||
|
import android.view.LayoutInflater |
||||||
|
import android.view.MenuItem |
||||||
|
import android.view.View |
||||||
|
import android.view.ViewGroup |
||||||
|
import androidx.appcompat.widget.Toolbar |
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager |
||||||
|
import io.legado.app.R |
||||||
|
import io.legado.app.base.BaseDialogFragment |
||||||
|
import io.legado.app.base.adapter.ItemViewHolder |
||||||
|
import io.legado.app.base.adapter.SimpleRecyclerAdapter |
||||||
|
import io.legado.app.data.entities.BookSource |
||||||
|
import io.legado.app.help.SourceHelp |
||||||
|
import io.legado.app.lib.dialogs.alert |
||||||
|
import io.legado.app.lib.dialogs.customView |
||||||
|
import io.legado.app.lib.dialogs.noButton |
||||||
|
import io.legado.app.lib.dialogs.okButton |
||||||
|
import io.legado.app.ui.widget.text.AutoCompleteTextView |
||||||
|
import io.legado.app.utils.applyTint |
||||||
|
import io.legado.app.utils.getSize |
||||||
|
import io.legado.app.utils.getViewModelOfActivity |
||||||
|
import io.legado.app.utils.visible |
||||||
|
import kotlinx.android.synthetic.main.dialog_edit_text.view.* |
||||||
|
import kotlinx.android.synthetic.main.dialog_recycler_view.* |
||||||
|
import kotlinx.android.synthetic.main.item_source_import.view.* |
||||||
|
import org.jetbrains.anko.sdk27.listeners.onClick |
||||||
|
|
||||||
|
|
||||||
|
class ImportBookSourceDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { |
||||||
|
|
||||||
|
val viewModel: ImportBookSourceViewModel |
||||||
|
get() = |
||||||
|
getViewModelOfActivity(ImportBookSourceViewModel::class.java) |
||||||
|
lateinit var adapter: SourcesAdapter |
||||||
|
private var _groupName: String? = null |
||||||
|
|
||||||
|
override fun onStart() { |
||||||
|
super.onStart() |
||||||
|
val dm = requireActivity().getSize() |
||||||
|
dialog?.window?.setLayout( |
||||||
|
(dm.widthPixels * 0.9).toInt(), |
||||||
|
ViewGroup.LayoutParams.WRAP_CONTENT |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
override fun onCreateView( |
||||||
|
inflater: LayoutInflater, |
||||||
|
container: ViewGroup?, |
||||||
|
savedInstanceState: Bundle? |
||||||
|
): View? { |
||||||
|
return inflater.inflate(R.layout.dialog_recycler_view, container) |
||||||
|
} |
||||||
|
|
||||||
|
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { |
||||||
|
tool_bar.setTitle(R.string.import_book_source) |
||||||
|
initMenu() |
||||||
|
adapter = SourcesAdapter(requireContext()) |
||||||
|
val allSources = viewModel.allSources |
||||||
|
adapter.sourceCheckState = viewModel.sourceCheckState |
||||||
|
adapter.selectStatus = viewModel.selectStatus |
||||||
|
|
||||||
|
recycler_view.layoutManager = LinearLayoutManager(requireContext()) |
||||||
|
recycler_view.adapter = adapter |
||||||
|
adapter.setItems(allSources) |
||||||
|
tv_cancel.visible() |
||||||
|
tv_cancel.onClick { |
||||||
|
dismiss() |
||||||
|
} |
||||||
|
tv_ok.visible() |
||||||
|
tv_ok.onClick { |
||||||
|
importSelect() |
||||||
|
dismiss() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private fun initMenu() { |
||||||
|
tool_bar.setOnMenuItemClickListener(this) |
||||||
|
tool_bar.inflateMenu(R.menu.import_source) |
||||||
|
} |
||||||
|
|
||||||
|
@SuppressLint("InflateParams") |
||||||
|
override fun onMenuItemClick(item: MenuItem): Boolean { |
||||||
|
when (item.itemId) { |
||||||
|
R.id.menu_new_group -> { |
||||||
|
alert(R.string.diy_edit_source_group) { |
||||||
|
var editText: AutoCompleteTextView? = null |
||||||
|
customView { |
||||||
|
layoutInflater.inflate(R.layout.dialog_edit_text, null).apply { |
||||||
|
editText = edit_view |
||||||
|
} |
||||||
|
} |
||||||
|
okButton { |
||||||
|
editText?.text?.toString()?.let { group -> |
||||||
|
_groupName = group |
||||||
|
item.title = getString(R.string.diy_edit_source_group_title, _groupName) |
||||||
|
} |
||||||
|
} |
||||||
|
noButton { } |
||||||
|
}.show().applyTint() |
||||||
|
} |
||||||
|
R.id.menu_select_all -> { |
||||||
|
adapter.selectStatus.forEachIndexed { index, b -> |
||||||
|
if (!b) { |
||||||
|
adapter.selectStatus[index] = true |
||||||
|
} |
||||||
|
} |
||||||
|
adapter.notifyDataSetChanged() |
||||||
|
} |
||||||
|
R.id.menu_un_select_all -> { |
||||||
|
adapter.selectStatus.forEachIndexed { index, b -> |
||||||
|
if (b) { |
||||||
|
adapter.selectStatus[index] = false |
||||||
|
} |
||||||
|
} |
||||||
|
adapter.notifyDataSetChanged() |
||||||
|
} |
||||||
|
} |
||||||
|
return false |
||||||
|
} |
||||||
|
|
||||||
|
override fun onDismiss(dialog: DialogInterface) { |
||||||
|
super.onDismiss(dialog) |
||||||
|
activity?.finish() |
||||||
|
} |
||||||
|
|
||||||
|
private fun importSelect() { |
||||||
|
val selectSource = arrayListOf<BookSource>() |
||||||
|
adapter.selectStatus.forEachIndexed { index, b -> |
||||||
|
if (_groupName != null) { |
||||||
|
adapter.getItem(index)!!.bookSourceGroup = _groupName |
||||||
|
} |
||||||
|
if (b) { |
||||||
|
selectSource.add(adapter.getItem(index)!!) |
||||||
|
} |
||||||
|
} |
||||||
|
SourceHelp.insertBookSource(*selectSource.toTypedArray()) |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
class SourcesAdapter(context: Context) : |
||||||
|
SimpleRecyclerAdapter<BookSource>(context, R.layout.item_source_import) { |
||||||
|
|
||||||
|
lateinit var sourceCheckState: ArrayList<Boolean> |
||||||
|
lateinit var selectStatus: ArrayList<Boolean> |
||||||
|
|
||||||
|
override fun convert(holder: ItemViewHolder, item: BookSource, payloads: MutableList<Any>) { |
||||||
|
holder.itemView.apply { |
||||||
|
cb_source_name.isChecked = selectStatus[holder.layoutPosition] |
||||||
|
cb_source_name.text = item.bookSourceName |
||||||
|
tv_source_state.text = if (sourceCheckState[holder.layoutPosition]) { |
||||||
|
"已存在" |
||||||
|
} else { |
||||||
|
"新书源" |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
override fun registerListener(holder: ItemViewHolder) { |
||||||
|
holder.itemView.apply { |
||||||
|
cb_source_name.setOnCheckedChangeListener { buttonView, isChecked -> |
||||||
|
if (buttonView.isPressed) { |
||||||
|
selectStatus[holder.layoutPosition] = isChecked |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,145 @@ |
|||||||
|
package io.legado.app.ui.association |
||||||
|
|
||||||
|
import android.content.Context |
||||||
|
import android.content.DialogInterface |
||||||
|
import android.os.Bundle |
||||||
|
import android.view.LayoutInflater |
||||||
|
import android.view.MenuItem |
||||||
|
import android.view.View |
||||||
|
import android.view.ViewGroup |
||||||
|
import androidx.appcompat.widget.Toolbar |
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager |
||||||
|
import io.legado.app.R |
||||||
|
import io.legado.app.base.BaseDialogFragment |
||||||
|
import io.legado.app.base.adapter.ItemViewHolder |
||||||
|
import io.legado.app.base.adapter.SimpleRecyclerAdapter |
||||||
|
import io.legado.app.data.entities.RssSource |
||||||
|
import io.legado.app.help.SourceHelp |
||||||
|
import io.legado.app.utils.getSize |
||||||
|
import io.legado.app.utils.getViewModelOfActivity |
||||||
|
import io.legado.app.utils.visible |
||||||
|
import kotlinx.android.synthetic.main.dialog_recycler_view.* |
||||||
|
import kotlinx.android.synthetic.main.item_source_import.view.* |
||||||
|
import org.jetbrains.anko.sdk27.listeners.onClick |
||||||
|
|
||||||
|
|
||||||
|
class ImportRssSourcesDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { |
||||||
|
|
||||||
|
val viewModel: ImportRssSourceViewModel |
||||||
|
get() = |
||||||
|
getViewModelOfActivity(ImportRssSourceViewModel::class.java) |
||||||
|
lateinit var adapter: SourcesAdapter |
||||||
|
|
||||||
|
override fun onStart() { |
||||||
|
super.onStart() |
||||||
|
val dm = requireActivity().getSize() |
||||||
|
dialog?.window?.setLayout( |
||||||
|
(dm.widthPixels * 0.9).toInt(), |
||||||
|
ViewGroup.LayoutParams.WRAP_CONTENT |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
override fun onCreateView( |
||||||
|
inflater: LayoutInflater, |
||||||
|
container: ViewGroup?, |
||||||
|
savedInstanceState: Bundle? |
||||||
|
): View? { |
||||||
|
return inflater.inflate(R.layout.dialog_recycler_view, container) |
||||||
|
} |
||||||
|
|
||||||
|
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { |
||||||
|
tool_bar.title = getString(R.string.import_rss_source) |
||||||
|
initMenu() |
||||||
|
adapter = SourcesAdapter(requireContext()) |
||||||
|
val allSources = viewModel.allSources |
||||||
|
adapter.sourceCheckState = viewModel.sourceCheckState |
||||||
|
adapter.selectStatus = viewModel.selectStatus |
||||||
|
recycler_view.layoutManager = LinearLayoutManager(requireContext()) |
||||||
|
recycler_view.adapter = adapter |
||||||
|
adapter.setItems(allSources) |
||||||
|
tv_cancel.visible() |
||||||
|
tv_cancel.onClick { |
||||||
|
dismiss() |
||||||
|
} |
||||||
|
tv_ok.visible() |
||||||
|
tv_ok.onClick { |
||||||
|
importSelect() |
||||||
|
dismiss() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private fun initMenu() { |
||||||
|
tool_bar.setOnMenuItemClickListener(this) |
||||||
|
tool_bar.inflateMenu(R.menu.import_source) |
||||||
|
} |
||||||
|
|
||||||
|
override fun onMenuItemClick(item: MenuItem): Boolean { |
||||||
|
when (item.itemId) { |
||||||
|
R.id.menu_select_all -> { |
||||||
|
adapter.selectStatus.forEachIndexed { index, b -> |
||||||
|
if (!b) { |
||||||
|
adapter.selectStatus[index] = true |
||||||
|
} |
||||||
|
} |
||||||
|
adapter.notifyDataSetChanged() |
||||||
|
} |
||||||
|
R.id.menu_un_select_all -> { |
||||||
|
adapter.selectStatus.forEachIndexed { index, b -> |
||||||
|
if (b) { |
||||||
|
adapter.selectStatus[index] = false |
||||||
|
} |
||||||
|
} |
||||||
|
adapter.notifyDataSetChanged() |
||||||
|
} |
||||||
|
} |
||||||
|
return false |
||||||
|
} |
||||||
|
|
||||||
|
override fun onDismiss(dialog: DialogInterface) { |
||||||
|
super.onDismiss(dialog) |
||||||
|
activity?.finish() |
||||||
|
} |
||||||
|
|
||||||
|
private fun importSelect() { |
||||||
|
val selectSource = arrayListOf<RssSource>() |
||||||
|
adapter.selectStatus.forEachIndexed { index, b -> |
||||||
|
if (b) { |
||||||
|
selectSource.add(adapter.getItem(index)!!) |
||||||
|
} |
||||||
|
} |
||||||
|
SourceHelp.insertRssSource(*selectSource.toTypedArray()) |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
class SourcesAdapter(context: Context) : |
||||||
|
SimpleRecyclerAdapter<RssSource>(context, R.layout.item_source_import) { |
||||||
|
|
||||||
|
lateinit var sourceCheckState: ArrayList<Boolean> |
||||||
|
lateinit var selectStatus: ArrayList<Boolean> |
||||||
|
|
||||||
|
override fun convert(holder: ItemViewHolder, item: RssSource, payloads: MutableList<Any>) { |
||||||
|
holder.itemView.apply { |
||||||
|
cb_source_name.isChecked = selectStatus[holder.layoutPosition] |
||||||
|
cb_source_name.text = item.sourceName |
||||||
|
tv_source_state.text = if (sourceCheckState[holder.layoutPosition]) { |
||||||
|
"已存在" |
||||||
|
} else { |
||||||
|
"新订阅源" |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
override fun registerListener(holder: ItemViewHolder) { |
||||||
|
holder.itemView.apply { |
||||||
|
cb_source_name.setOnCheckedChangeListener { buttonView, isChecked -> |
||||||
|
if (buttonView.isPressed) { |
||||||
|
selectStatus[holder.layoutPosition] = isChecked |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue