|
|
@ -5,8 +5,10 @@ import android.content.Context |
|
|
|
import android.content.DialogInterface |
|
|
|
import android.content.DialogInterface |
|
|
|
import android.os.Bundle |
|
|
|
import android.os.Bundle |
|
|
|
import android.view.LayoutInflater |
|
|
|
import android.view.LayoutInflater |
|
|
|
|
|
|
|
import android.view.MenuItem |
|
|
|
import android.view.View |
|
|
|
import android.view.View |
|
|
|
import android.view.ViewGroup |
|
|
|
import android.view.ViewGroup |
|
|
|
|
|
|
|
import androidx.appcompat.widget.Toolbar |
|
|
|
import androidx.fragment.app.FragmentManager |
|
|
|
import androidx.fragment.app.FragmentManager |
|
|
|
import androidx.fragment.app.viewModels |
|
|
|
import androidx.fragment.app.viewModels |
|
|
|
import androidx.recyclerview.widget.LinearLayoutManager |
|
|
|
import androidx.recyclerview.widget.LinearLayoutManager |
|
|
@ -14,15 +16,23 @@ 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.base.adapter.ItemViewHolder |
|
|
|
import io.legado.app.base.adapter.RecyclerAdapter |
|
|
|
import io.legado.app.base.adapter.RecyclerAdapter |
|
|
|
|
|
|
|
import io.legado.app.constant.AppPattern |
|
|
|
|
|
|
|
import io.legado.app.constant.PreferKey |
|
|
|
|
|
|
|
import io.legado.app.data.appDb |
|
|
|
import io.legado.app.data.entities.ReplaceRule |
|
|
|
import io.legado.app.data.entities.ReplaceRule |
|
|
|
|
|
|
|
import io.legado.app.databinding.DialogCustomGroupBinding |
|
|
|
import io.legado.app.databinding.DialogRecyclerViewBinding |
|
|
|
import io.legado.app.databinding.DialogRecyclerViewBinding |
|
|
|
import io.legado.app.databinding.ItemSourceImportBinding |
|
|
|
import io.legado.app.databinding.ItemSourceImportBinding |
|
|
|
|
|
|
|
import io.legado.app.lib.dialogs.alert |
|
|
|
import io.legado.app.lib.theme.primaryColor |
|
|
|
import io.legado.app.lib.theme.primaryColor |
|
|
|
import io.legado.app.ui.widget.dialog.WaitDialog |
|
|
|
import io.legado.app.ui.widget.dialog.WaitDialog |
|
|
|
|
|
|
|
import io.legado.app.utils.dp |
|
|
|
|
|
|
|
import io.legado.app.utils.putPrefBoolean |
|
|
|
|
|
|
|
import io.legado.app.utils.splitNotBlank |
|
|
|
import io.legado.app.utils.viewbindingdelegate.viewBinding |
|
|
|
import io.legado.app.utils.viewbindingdelegate.viewBinding |
|
|
|
import io.legado.app.utils.visible |
|
|
|
import io.legado.app.utils.visible |
|
|
|
|
|
|
|
|
|
|
|
class ImportReplaceRuleDialog : BaseDialogFragment() { |
|
|
|
class ImportReplaceRuleDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { |
|
|
|
|
|
|
|
|
|
|
|
companion object { |
|
|
|
companion object { |
|
|
|
fun start( |
|
|
|
fun start( |
|
|
@ -71,6 +81,7 @@ class ImportReplaceRuleDialog : BaseDialogFragment() { |
|
|
|
binding.toolBar.setBackgroundColor(primaryColor) |
|
|
|
binding.toolBar.setBackgroundColor(primaryColor) |
|
|
|
binding.toolBar.setTitle(R.string.import_replace_rule) |
|
|
|
binding.toolBar.setTitle(R.string.import_replace_rule) |
|
|
|
binding.rotateLoading.show() |
|
|
|
binding.rotateLoading.show() |
|
|
|
|
|
|
|
initMenu() |
|
|
|
adapter = SourcesAdapter(requireContext()) |
|
|
|
adapter = SourcesAdapter(requireContext()) |
|
|
|
binding.recyclerView.layoutManager = LinearLayoutManager(requireContext()) |
|
|
|
binding.recyclerView.layoutManager = LinearLayoutManager(requireContext()) |
|
|
|
binding.recyclerView.adapter = adapter |
|
|
|
binding.recyclerView.adapter = adapter |
|
|
@ -89,7 +100,7 @@ class ImportReplaceRuleDialog : BaseDialogFragment() { |
|
|
|
} |
|
|
|
} |
|
|
|
binding.tvFooterLeft.visible() |
|
|
|
binding.tvFooterLeft.visible() |
|
|
|
binding.tvFooterLeft.setOnClickListener { |
|
|
|
binding.tvFooterLeft.setOnClickListener { |
|
|
|
val selectAll = viewModel.isSelectAll() |
|
|
|
val selectAll = viewModel.isSelectAll |
|
|
|
viewModel.selectStatus.forEachIndexed { index, b -> |
|
|
|
viewModel.selectStatus.forEachIndexed { index, b -> |
|
|
|
if (b != !selectAll) { |
|
|
|
if (b != !selectAll) { |
|
|
|
viewModel.selectStatus[index] = !selectAll |
|
|
|
viewModel.selectStatus[index] = !selectAll |
|
|
@ -125,17 +136,65 @@ class ImportReplaceRuleDialog : BaseDialogFragment() { |
|
|
|
viewModel.import(source) |
|
|
|
viewModel.import(source) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun initMenu() { |
|
|
|
|
|
|
|
binding.toolBar.setOnMenuItemClickListener(this) |
|
|
|
|
|
|
|
binding.toolBar.inflateMenu(R.menu.import_replace) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun onMenuItemClick(item: MenuItem?): Boolean { |
|
|
|
|
|
|
|
when (item?.itemId) { |
|
|
|
|
|
|
|
R.id.menu_new_group -> alertCustomGroup(item) |
|
|
|
|
|
|
|
R.id.menu_Keep_original_name -> { |
|
|
|
|
|
|
|
item.isChecked = !item.isChecked |
|
|
|
|
|
|
|
putPrefBoolean(PreferKey.importKeepName, item.isChecked) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return true |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun alertCustomGroup(item: MenuItem) { |
|
|
|
|
|
|
|
alert(R.string.diy_edit_source_group) { |
|
|
|
|
|
|
|
val alertBinding = DialogCustomGroupBinding.inflate(layoutInflater).apply { |
|
|
|
|
|
|
|
val groups = linkedSetOf<String>() |
|
|
|
|
|
|
|
appDb.bookSourceDao.allGroup.forEach { group -> |
|
|
|
|
|
|
|
groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
textInputLayout.setHint(R.string.group_name) |
|
|
|
|
|
|
|
editView.setFilterValues(groups.toList()) |
|
|
|
|
|
|
|
editView.dropDownHeight = 180.dp |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
customView { |
|
|
|
|
|
|
|
alertBinding.root |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
okButton { |
|
|
|
|
|
|
|
viewModel.isAddGroup = alertBinding.swAddGroup.isChecked |
|
|
|
|
|
|
|
viewModel.groupName = alertBinding.editView.text?.toString() |
|
|
|
|
|
|
|
if (viewModel.groupName.isNullOrBlank()) { |
|
|
|
|
|
|
|
item.title = getString(R.string.diy_source_group) |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
val group = getString(R.string.diy_edit_source_group_title, viewModel.groupName) |
|
|
|
|
|
|
|
if (viewModel.isAddGroup) { |
|
|
|
|
|
|
|
item.title = "+$group" |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
item.title = group |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
noButton() |
|
|
|
|
|
|
|
}.show() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private fun upSelectText() { |
|
|
|
private fun upSelectText() { |
|
|
|
if (viewModel.isSelectAll()) { |
|
|
|
if (viewModel.isSelectAll) { |
|
|
|
binding.tvFooterLeft.text = getString( |
|
|
|
binding.tvFooterLeft.text = getString( |
|
|
|
R.string.select_cancel_count, |
|
|
|
R.string.select_cancel_count, |
|
|
|
viewModel.selectCount(), |
|
|
|
viewModel.selectCount, |
|
|
|
viewModel.allRules.size |
|
|
|
viewModel.allRules.size |
|
|
|
) |
|
|
|
) |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
binding.tvFooterLeft.text = getString( |
|
|
|
binding.tvFooterLeft.text = getString( |
|
|
|
R.string.select_all_count, |
|
|
|
R.string.select_all_count, |
|
|
|
viewModel.selectCount(), |
|
|
|
viewModel.selectCount, |
|
|
|
viewModel.allRules.size |
|
|
|
viewModel.allRules.size |
|
|
|
) |
|
|
|
) |
|
|
|
} |
|
|
|
} |
|
|
@ -157,6 +216,15 @@ class ImportReplaceRuleDialog : BaseDialogFragment() { |
|
|
|
binding.run { |
|
|
|
binding.run { |
|
|
|
cbSourceName.isChecked = viewModel.selectStatus[holder.layoutPosition] |
|
|
|
cbSourceName.isChecked = viewModel.selectStatus[holder.layoutPosition] |
|
|
|
cbSourceName.text = item.name |
|
|
|
cbSourceName.text = item.name |
|
|
|
|
|
|
|
val localRule = viewModel.checkRules[holder.layoutPosition] |
|
|
|
|
|
|
|
tvSourceState.text = when { |
|
|
|
|
|
|
|
localRule == null -> "新规则" |
|
|
|
|
|
|
|
item.pattern != localRule.pattern |
|
|
|
|
|
|
|
|| item.replacement != localRule.replacement |
|
|
|
|
|
|
|
|| item.isRegex != localRule.isRegex |
|
|
|
|
|
|
|
|| item.scope != localRule.scope -> "更新" |
|
|
|
|
|
|
|
else -> "已存在" |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|