viewBinding

pull/517/head
gedoor 5 years ago
parent 1225af46a4
commit 8a57fe3b28
  1. 3
      app/src/main/java/io/legado/app/data/entities/rule/BookInfoRule.kt
  2. 2
      app/src/main/java/io/legado/app/data/entities/rule/ContentRule.kt
  3. 2
      app/src/main/java/io/legado/app/data/entities/rule/ExploreRule.kt
  4. 3
      app/src/main/java/io/legado/app/data/entities/rule/SearchRule.kt
  5. 2
      app/src/main/java/io/legado/app/data/entities/rule/TocRule.kt
  6. 34
      app/src/main/java/io/legado/app/ui/filepicker/FilePickerDialog.kt
  7. 30
      app/src/main/java/io/legado/app/ui/filepicker/adapter/FileAdapter.kt
  8. 22
      app/src/main/java/io/legado/app/ui/filepicker/adapter/PathAdapter.kt
  9. 4
      app/src/main/java/io/legado/app/ui/main/MainActivity.kt
  10. 6
      app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt
  11. 78
      app/src/main/java/io/legado/app/ui/replace/GroupManageDialog.kt
  12. 47
      app/src/main/java/io/legado/app/ui/replace/ReplaceRuleAdapter.kt
  13. 42
      app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt
  14. 16
      app/src/main/java/io/legado/app/ui/rss/article/BaseRssArticlesAdapter.kt
  15. 41
      app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter.kt
  16. 80
      app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter1.kt
  17. 80
      app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter2.kt
  18. 42
      app/src/main/java/io/legado/app/ui/rss/article/RssArticlesFragment.kt
  19. 7
      app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt
  20. 28
      app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesAdapter.kt
  21. 27
      app/src/main/java/io/legado/app/ui/rss/source/debug/RssSourceDebugAdapter.kt
  22. 17
      app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditAdapter.kt
  23. 80
      app/src/main/java/io/legado/app/ui/rss/source/manage/GroupManageDialog.kt
  24. 45
      app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceAdapter.kt
  25. 31
      app/src/main/java/io/legado/app/ui/widget/KeyboardToolPop.kt
  26. 59
      app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt
  27. 7
      app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt
  28. 15
      app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt
  29. 42
      app/src/main/java/io/legado/app/ui/widget/dialog/TextListDialog.kt
  30. 6
      app/src/main/java/io/legado/app/ui/widget/dynamiclayout/DynamicFrameLayout.kt
  31. 26
      app/src/main/java/io/legado/app/ui/widget/font/FontAdapter.kt
  32. 18
      app/src/main/java/io/legado/app/ui/widget/font/FontSelectDialog.kt
  33. 3
      app/src/main/java/io/legado/app/ui/widget/number/NumberPickerDialog.kt
  34. 26
      app/src/main/java/io/legado/app/ui/widget/prefs/IconListPreference.kt
  35. 11
      app/src/main/java/io/legado/app/ui/widget/text/AutoCompleteTextView.kt
  36. 4
      app/src/main/res/layout/view_dynamic.xml

@ -1,7 +1,8 @@
package io.legado.app.data.entities.rule
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
import kotlinx.parcelize.Parcelize
@Parcelize
data class BookInfoRule(

@ -1,7 +1,7 @@
package io.legado.app.data.entities.rule
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
import kotlinx.parcelize.Parcelize
@Parcelize
data class ContentRule(

@ -1,7 +1,7 @@
package io.legado.app.data.entities.rule
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
import kotlinx.parcelize.Parcelize
@Parcelize
data class ExploreRule(

@ -1,7 +1,8 @@
package io.legado.app.data.entities.rule
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
import kotlinx.parcelize.Parcelize
@Parcelize
data class SearchRule(

@ -1,7 +1,7 @@
package io.legado.app.data.entities.rule
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
import kotlinx.parcelize.Parcelize
@Parcelize
data class TocRule(

@ -14,12 +14,13 @@ import androidx.fragment.app.FragmentManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import io.legado.app.R
import io.legado.app.databinding.DialogFileChooserBinding
import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.filepicker.adapter.FileAdapter
import io.legado.app.ui.filepicker.adapter.PathAdapter
import io.legado.app.ui.widget.recycler.VerticalDivider
import io.legado.app.utils.*
import kotlinx.android.synthetic.main.dialog_file_chooser.*
import io.legado.app.utils.viewbindingdelegate.viewBinding
import java.io.File
@ -61,6 +62,7 @@ class FilePickerDialog : DialogFragment(),
}
}
private val binding by viewBinding(DialogFileChooserBinding::bind)
override var allowExtensions: Array<String>? = null
override val isSelectDir: Boolean
get() = mode == DIRECTORY
@ -92,7 +94,7 @@ class FilePickerDialog : DialogFragment(),
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
tool_bar.setBackgroundColor(primaryColor)
binding.toolBar.setBackgroundColor(primaryColor)
view.setBackgroundResource(R.color.background_card)
arguments?.let {
requestCode = it.getInt("requestCode")
@ -107,7 +109,7 @@ class FilePickerDialog : DialogFragment(),
allowExtensions = it.getStringArray("allowExtensions")
menus = it.getStringArray("menus")
}
tool_bar.title = title ?: let {
binding.toolBar.title = title ?: let {
if (isSelectDir) {
getString(R.string.folder_chooser)
} else {
@ -120,29 +122,29 @@ class FilePickerDialog : DialogFragment(),
}
private fun initMenu() {
tool_bar.inflateMenu(R.menu.file_chooser)
binding.toolBar.inflateMenu(R.menu.file_chooser)
if (isSelectDir) {
tool_bar.menu.findItem(R.id.menu_ok).isVisible = true
binding.toolBar.menu.findItem(R.id.menu_ok).isVisible = true
}
menus?.let {
it.forEach { menuTitle ->
tool_bar.menu.add(menuTitle)
binding.toolBar.menu.add(menuTitle)
}
}
tool_bar.menu.applyTint(requireContext())
tool_bar.setOnMenuItemClickListener(this)
binding.toolBar.menu.applyTint(requireContext())
binding.toolBar.setOnMenuItemClickListener(this)
}
private fun initContentView() {
fileAdapter = FileAdapter(requireContext(), this)
pathAdapter = PathAdapter(requireContext(), this)
rv_file.addItemDecoration(VerticalDivider(requireContext()))
rv_file.layoutManager = LinearLayoutManager(activity)
rv_file.adapter = fileAdapter
binding.rvFile.addItemDecoration(VerticalDivider(requireContext()))
binding.rvFile.layoutManager = LinearLayoutManager(activity)
binding.rvFile.adapter = fileAdapter
rv_path.layoutManager = LinearLayoutManager(activity, RecyclerView.HORIZONTAL, false)
rv_path.adapter = pathAdapter
binding.rvPath.layoutManager = LinearLayoutManager(activity, RecyclerView.HORIZONTAL, false)
binding.rvPath.adapter = pathAdapter
}
@ -200,10 +202,10 @@ class FilePickerDialog : DialogFragment(),
adapterCount--
}
if (adapterCount < 1) {
tv_empty.visible()
tv_empty.setText(R.string.empty)
binding.tvEmpty.visible()
binding.tvEmpty.setText(R.string.empty)
} else {
tv_empty.gone()
binding.tvEmpty.gone()
}
}

@ -2,9 +2,9 @@ package io.legado.app.ui.filepicker.adapter
import android.content.Context
import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.databinding.ItemFileFilepickerBinding
import io.legado.app.help.AppConfig
import io.legado.app.lib.theme.getPrimaryDisabledTextColor
import io.legado.app.lib.theme.getPrimaryTextColor
@ -12,14 +12,13 @@ import io.legado.app.ui.filepicker.entity.FileItem
import io.legado.app.ui.filepicker.utils.ConvertUtils
import io.legado.app.ui.filepicker.utils.FilePickerIcon
import io.legado.app.utils.FileUtils
import kotlinx.android.synthetic.main.item_path_filepicker.view.*
import org.jetbrains.anko.sdk27.listeners.onClick
import java.io.File
import java.util.*
class FileAdapter(context: Context, val callBack: CallBack) :
SimpleRecyclerAdapter<FileItem>(context, R.layout.item_file_filepicker) {
SimpleRecyclerAdapter<FileItem, ItemFileFilepickerBinding>(context) {
private var rootPath: String? = null
var currentPath: String? = null
private set
@ -86,29 +85,34 @@ class FileAdapter(context: Context, val callBack: CallBack) :
}
override fun convert(holder: ItemViewHolder, item: FileItem, payloads: MutableList<Any>) {
holder.itemView.apply {
image_view.setImageDrawable(item.icon)
text_view.text = item.name
override fun convert(
holder: ItemViewHolder,
binding: ItemFileFilepickerBinding,
item: FileItem,
payloads: MutableList<Any>
) {
binding.apply {
imageView.setImageDrawable(item.icon)
textView.text = item.name
if (item.isDirectory) {
text_view.setTextColor(primaryTextColor)
textView.setTextColor(primaryTextColor)
} else {
if (callBack.isSelectDir) {
text_view.setTextColor(disabledTextColor)
textView.setTextColor(disabledTextColor)
} else {
callBack.allowExtensions?.let {
if (it.isEmpty() || it.contains(FileUtils.getExtension(item.path))) {
text_view.setTextColor(primaryTextColor)
textView.setTextColor(primaryTextColor)
} else {
text_view.setTextColor(disabledTextColor)
textView.setTextColor(disabledTextColor)
}
} ?: text_view.setTextColor(primaryTextColor)
} ?: textView.setTextColor(primaryTextColor)
}
}
}
}
override fun registerListener(holder: ItemViewHolder) {
override fun registerListener(holder: ItemViewHolder, binding: ItemFileFilepickerBinding) {
holder.itemView.onClick {
callBack.onFileClick(holder.layoutPosition)
}

@ -2,18 +2,17 @@ package io.legado.app.ui.filepicker.adapter
import android.content.Context
import android.os.Environment
import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.databinding.ItemPathFilepickerBinding
import io.legado.app.ui.filepicker.utils.ConvertUtils
import io.legado.app.ui.filepicker.utils.FilePickerIcon
import kotlinx.android.synthetic.main.item_path_filepicker.view.*
import org.jetbrains.anko.sdk27.listeners.onClick
import java.util.*
class PathAdapter(context: Context, val callBack: CallBack) :
SimpleRecyclerAdapter<String>(context, R.layout.item_path_filepicker) {
SimpleRecyclerAdapter<String, ItemPathFilepickerBinding>(context) {
private val paths = LinkedList<String>()
private val arrowIcon = ConvertUtils.toDrawable(FilePickerIcon.getArrow())
@ -44,14 +43,19 @@ class PathAdapter(context: Context, val callBack: CallBack) :
setItems(paths)
}
override fun convert(holder: ItemViewHolder, item: String, payloads: MutableList<Any>) {
holder.itemView.apply {
text_view.text = item
image_view.setImageDrawable(arrowIcon)
override fun convert(
holder: ItemViewHolder,
binding: ItemPathFilepickerBinding,
item: String,
payloads: MutableList<Any>
) {
binding.apply {
textView.text = item
imageView.setImageDrawable(arrowIcon)
}
}
override fun registerListener(holder: ItemViewHolder) {
override fun registerListener(holder: ItemViewHolder, binding: ItemPathFilepickerBinding) {
holder.itemView.onClick {
callBack.onPathClick(holder.layoutPosition)
}
@ -65,6 +69,6 @@ class PathAdapter(context: Context, val callBack: CallBack) :
private const val ROOT_HINT = "SD"
@Suppress("DEPRECATION")
val sdCardDirectory = Environment.getExternalStorageDirectory().absolutePath
val sdCardDirectory: String = Environment.getExternalStorageDirectory().absolutePath
}
}

@ -47,10 +47,6 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
private var pagePosition = 0
private val fragmentMap = hashMapOf<Int, Fragment>()
override fun getViewBinding(): ActivityMainBinding {
return ActivityMainBinding.inflate(layoutInflater)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
ATH.applyEdgeEffectColor(binding.viewPagerMain)
ATH.applyBottomNavigationColor(binding.bottomNavigationView)

@ -2,8 +2,6 @@ package io.legado.app.ui.main.bookshelf.books
import android.content.Context
import android.os.Bundle
import android.view.ViewGroup
import androidx.viewbinding.ViewBinding
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.constant.BookType
import io.legado.app.data.entities.Book
@ -16,10 +14,6 @@ import org.jetbrains.anko.sdk27.listeners.onLongClick
class BooksAdapterGrid(context: Context, private val callBack: CallBack) :
BaseBooksAdapter<ItemBookshelfGridBinding>(context) {
override fun getViewBinding(parent: ViewGroup, position: Int): ViewBinding {
return ItemBookshelfGridBinding.inflate(inflater, parent, false)
}
override fun convert(
holder: ItemViewHolder,
binding: ItemBookshelfGridBinding,

@ -7,7 +7,6 @@ import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.DialogFragment
import androidx.recyclerview.widget.LinearLayoutManager
@ -16,19 +15,21 @@ import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.constant.AppPattern
import io.legado.app.databinding.DialogEditTextBinding
import io.legado.app.databinding.DialogRecyclerViewBinding
import io.legado.app.databinding.ItemGroupManageBinding
import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.backgroundColor
import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.widget.recycler.VerticalDivider
import io.legado.app.utils.*
import kotlinx.android.synthetic.main.dialog_edit_text.view.*
import kotlinx.android.synthetic.main.dialog_recycler_view.*
import kotlinx.android.synthetic.main.item_group_manage.view.*
import io.legado.app.utils.viewbindingdelegate.viewBinding
import org.jetbrains.anko.sdk27.listeners.onClick
class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener {
private lateinit var viewModel: ReplaceRuleViewModel
private lateinit var adapter: GroupAdapter
private val binding by viewBinding(DialogRecyclerViewBinding::bind)
override fun onStart() {
super.onStart()
@ -48,19 +49,19 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
view.setBackgroundColor(backgroundColor)
tool_bar.setBackgroundColor(primaryColor)
binding.toolBar.setBackgroundColor(primaryColor)
initData()
}
private fun initData() {
tool_bar.title = getString(R.string.group_manage)
tool_bar.inflateMenu(R.menu.group_manage)
tool_bar.menu.applyTint(requireContext())
tool_bar.setOnMenuItemClickListener(this)
private fun initData() = with(binding) {
toolBar.title = getString(R.string.group_manage)
toolBar.inflateMenu(R.menu.group_manage)
toolBar.menu.applyTint(requireContext())
toolBar.setOnMenuItemClickListener(this@GroupManageDialog)
adapter = GroupAdapter(requireContext())
recycler_view.layoutManager = LinearLayoutManager(requireContext())
recycler_view.addItemDecoration(VerticalDivider(requireContext()))
recycler_view.adapter = adapter
recyclerView.layoutManager = LinearLayoutManager(requireContext())
recyclerView.addItemDecoration(VerticalDivider(requireContext()))
recyclerView.adapter = adapter
App.db.replaceRuleDao().liveGroup().observe(viewLifecycleOwner, {
val groups = linkedSetOf<String>()
it.map { group ->
@ -80,16 +81,14 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener {
@SuppressLint("InflateParams")
private fun addGroup() {
alert(title = getString(R.string.add_group)) {
var editText: EditText? = null
val alertBinding = DialogEditTextBinding.inflate(layoutInflater)
customView {
layoutInflater.inflate(R.layout.dialog_edit_text, null).apply {
editText = edit_view.apply {
hint = "分组名称"
}
}
alertBinding.apply {
editView.hint = "分组名称"
}.root
}
yesButton {
editText?.text?.toString()?.let {
alertBinding.editView.text?.toString()?.let {
if (it.isNotBlank()) {
viewModel.addGroup(it)
}
@ -102,41 +101,42 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener {
@SuppressLint("InflateParams")
private fun editGroup(group: String) {
alert(title = getString(R.string.group_edit)) {
var editText: EditText? = null
customView {
layoutInflater.inflate(R.layout.dialog_edit_text, null).apply {
editText = edit_view.apply {
hint = "分组名称"
setText(group)
}
}
}
val alertBinding = DialogEditTextBinding.inflate(layoutInflater)
customView = alertBinding.apply {
editView.hint = "分组名称"
editView.setText(group)
}.root
yesButton {
viewModel.upGroup(group, editText?.text?.toString())
viewModel.upGroup(group, alertBinding.editView.text?.toString())
}
noButton()
}.show().requestInputMethod()
}
private inner class GroupAdapter(context: Context) :
SimpleRecyclerAdapter<String>(context, R.layout.item_group_manage) {
SimpleRecyclerAdapter<String, ItemGroupManageBinding>(context) {
override fun convert(holder: ItemViewHolder, item: String, payloads: MutableList<Any>) {
with(holder.itemView) {
setBackgroundColor(context.backgroundColor)
tv_group.text = item
override fun convert(
holder: ItemViewHolder,
binding: ItemGroupManageBinding,
item: String,
payloads: MutableList<Any>
) {
with(binding) {
root.setBackgroundColor(context.backgroundColor)
tvGroup.text = item
}
}
override fun registerListener(holder: ItemViewHolder) {
holder.itemView.apply {
tv_edit.onClick {
override fun registerListener(holder: ItemViewHolder, binding: ItemGroupManageBinding) {
binding.apply {
tvEdit.onClick {
getItem(holder.layoutPosition)?.let {
editGroup(it)
}
}
tv_del.onClick {
tvDel.onClick {
getItem(holder.layoutPosition)?.let { viewModel.delGroup(it) }
}
}

@ -10,16 +10,16 @@ import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.data.entities.ReplaceRule
import io.legado.app.databinding.ItemReplaceRuleBinding
import io.legado.app.lib.theme.backgroundColor
import io.legado.app.ui.widget.recycler.DragSelectTouchHelper
import io.legado.app.ui.widget.recycler.ItemTouchCallback
import kotlinx.android.synthetic.main.item_replace_rule.view.*
import org.jetbrains.anko.sdk27.listeners.onClick
import java.util.*
class ReplaceRuleAdapter(context: Context, var callBack: CallBack) :
SimpleRecyclerAdapter<ReplaceRule>(context, R.layout.item_replace_rule),
SimpleRecyclerAdapter<ReplaceRule, ItemReplaceRuleBinding>(context),
ItemTouchCallback.Callback {
private val selected = linkedSetOf<ReplaceRule>()
@ -54,53 +54,58 @@ class ReplaceRuleAdapter(context: Context, var callBack: CallBack) :
return selection
}
override fun convert(holder: ItemViewHolder, item: ReplaceRule, payloads: MutableList<Any>) {
with(holder.itemView) {
override fun convert(
holder: ItemViewHolder,
binding: ItemReplaceRuleBinding,
item: ReplaceRule,
payloads: MutableList<Any>
) {
with(binding) {
val bundle = payloads.getOrNull(0) as? Bundle
if (bundle == null) {
this.setBackgroundColor(context.backgroundColor)
root.setBackgroundColor(context.backgroundColor)
if (item.group.isNullOrEmpty()) {
cb_name.text = item.name
cbName.text = item.name
} else {
cb_name.text =
cbName.text =
String.format("%s (%s)", item.name, item.group)
}
swt_enabled.isChecked = item.isEnabled
cb_name.isChecked = selected.contains(item)
swtEnabled.isChecked = item.isEnabled
cbName.isChecked = selected.contains(item)
} else {
bundle.keySet().map {
when (it) {
"selected" -> cb_name.isChecked = selected.contains(item)
"selected" -> cbName.isChecked = selected.contains(item)
"name", "group" ->
if (item.group.isNullOrEmpty()) {
cb_name.text = item.name
cbName.text = item.name
} else {
cb_name.text =
cbName.text =
String.format("%s (%s)", item.name, item.group)
}
"enabled" -> swt_enabled.isChecked = item.isEnabled
"enabled" -> swtEnabled.isChecked = item.isEnabled
}
}
}
}
}
override fun registerListener(holder: ItemViewHolder) {
holder.itemView.apply {
swt_enabled.setOnCheckedChangeListener { _, isChecked ->
override fun registerListener(holder: ItemViewHolder, binding: ItemReplaceRuleBinding) {
binding.apply {
swtEnabled.setOnCheckedChangeListener { _, isChecked ->
getItem(holder.layoutPosition)?.let {
it.isEnabled = isChecked
callBack.update(it)
}
}
iv_edit.onClick {
ivEdit.onClick {
getItem(holder.layoutPosition)?.let {
callBack.edit(it)
}
}
cb_name.onClick {
cbName.onClick {
getItem(holder.layoutPosition)?.let {
if (cb_name.isChecked) {
if (cbName.isChecked) {
selected.add(it)
} else {
selected.remove(it)
@ -108,8 +113,8 @@ class ReplaceRuleAdapter(context: Context, var callBack: CallBack) :
}
callBack.upCountView()
}
iv_menu_more.onClick {
showMenu(iv_menu_more, holder.layoutPosition)
ivMenuMore.onClick {
showMenu(ivMenuMore, holder.layoutPosition)
}
}
}

@ -20,8 +20,8 @@ import io.legado.app.ui.widget.KeyboardToolPop
import io.legado.app.ui.widget.dialog.TextDialog
import io.legado.app.utils.getViewModel
import io.legado.app.utils.postEvent
import kotlinx.android.synthetic.main.activity_replace_edit.*
import org.jetbrains.anko.displayMetrics
import org.jetbrains.anko.sdk27.listeners.onClick
import org.jetbrains.anko.selector
import org.jetbrains.anko.toast
import kotlin.math.abs
@ -58,17 +58,13 @@ class ReplaceEditActivity :
private var mSoftKeyboardTool: PopupWindow? = null
private var mIsSoftKeyBoardShowing = false
override fun getViewBinding(): ActivityReplaceEditBinding {
return ActivityReplaceEditBinding.inflate(layoutInflater)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
mSoftKeyboardTool = KeyboardToolPop(this, AppConst.keyboardToolChars, this)
window.decorView.viewTreeObserver.addOnGlobalLayoutListener(this)
viewModel.initData(intent) {
upReplaceView(it)
}
iv_help.onClick {
binding.ivHelp.onClick {
showRegexHelp()
}
}
@ -95,23 +91,23 @@ class ReplaceEditActivity :
return true
}
private fun upReplaceView(replaceRule: ReplaceRule) {
et_name.setText(replaceRule.name)
et_group.setText(replaceRule.group)
et_replace_rule.setText(replaceRule.pattern)
cb_use_regex.isChecked = replaceRule.isRegex
et_replace_to.setText(replaceRule.replacement)
et_scope.setText(replaceRule.scope)
private fun upReplaceView(replaceRule: ReplaceRule) = with(binding) {
etName.setText(replaceRule.name)
etGroup.setText(replaceRule.group)
etReplaceRule.setText(replaceRule.pattern)
cbUseRegex.isChecked = replaceRule.isRegex
etReplaceTo.setText(replaceRule.replacement)
etScope.setText(replaceRule.scope)
}
private fun getReplaceRule(): ReplaceRule {
private fun getReplaceRule(): ReplaceRule = with(binding) {
val replaceRule: ReplaceRule = viewModel.replaceRule ?: ReplaceRule()
replaceRule.name = et_name.text.toString()
replaceRule.group = et_group.text.toString()
replaceRule.pattern = et_replace_rule.text.toString()
replaceRule.isRegex = cb_use_regex.isChecked
replaceRule.replacement = et_replace_to.text.toString()
replaceRule.scope = et_scope.text.toString()
replaceRule.name = etName.text.toString()
replaceRule.group = etGroup.text.toString()
replaceRule.pattern = etReplaceRule.text.toString()
replaceRule.isRegex = cbUseRegex.isChecked
replaceRule.replacement = etReplaceTo.text.toString()
replaceRule.scope = etScope.text.toString()
return replaceRule
}
@ -158,7 +154,7 @@ class ReplaceEditActivity :
mSoftKeyboardTool?.let {
if (it.isShowing) return
if (!isFinishing) {
it.showAtLocation(ll_content, Gravity.BOTTOM, 0, 0)
it.showAtLocation(binding.llContent, Gravity.BOTTOM, 0, 0)
}
}
}
@ -176,11 +172,11 @@ class ReplaceEditActivity :
val preShowing = mIsSoftKeyBoardShowing
if (abs(keyboardHeight) > screenHeight / 5) {
mIsSoftKeyBoardShowing = true // 超过屏幕五分之一则表示弹出了输入法
root_view.setPadding(0, 0, 0, 100)
binding.rootView.setPadding(0, 0, 0, 100)
showKeyboardTopPopupWindow()
} else {
mIsSoftKeyBoardShowing = false
root_view.setPadding(0, 0, 0, 0)
binding.rootView.setPadding(0, 0, 0, 0)
if (preShowing) {
closePopupWindow()
}

@ -0,0 +1,16 @@
package io.legado.app.ui.rss.article
import android.content.Context
import androidx.viewbinding.ViewBinding
import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.data.entities.RssArticle
abstract class BaseRssArticlesAdapter<VB : ViewBinding>(context: Context, val callBack: CallBack) :
SimpleRecyclerAdapter<RssArticle, VB>(context) {
interface CallBack {
val isGridLayout: Boolean
fun readRss(rssArticle: RssArticle)
}
}

@ -1,6 +1,5 @@
package io.legado.app.ui.rss.article
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.drawable.Drawable
import com.bumptech.glide.load.DataSource
@ -9,26 +8,28 @@ import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.data.entities.RssArticle
import io.legado.app.databinding.ItemRssArticleBinding
import io.legado.app.help.ImageLoader
import io.legado.app.utils.gone
import io.legado.app.utils.visible
import kotlinx.android.synthetic.main.item_rss_article.view.*
import org.jetbrains.anko.sdk27.listeners.onClick
import org.jetbrains.anko.textColorResource
class RssArticlesAdapter(context: Context, callBack: CallBack) :
BaseRssArticlesAdapter<ItemRssArticleBinding>(context, callBack) {
class RssArticlesAdapter(context: Context, layoutId: Int, val callBack: CallBack) :
SimpleRecyclerAdapter<RssArticle>(context, layoutId) {
@SuppressLint("CheckResult")
override fun convert(holder: ItemViewHolder, item: RssArticle, payloads: MutableList<Any>) {
with(holder.itemView) {
tv_title.text = item.title
tv_pub_date.text = item.pubDate
override fun convert(
holder: ItemViewHolder,
binding: ItemRssArticleBinding,
item: RssArticle,
payloads: MutableList<Any>
) {
with(binding) {
tvTitle.text = item.title
tvPubDate.text = item.pubDate
if (item.image.isNullOrBlank() && !callBack.isGridLayout) {
image_view.gone()
imageView.gone()
} else {
ImageLoader.load(context, item.image).apply {
if (callBack.isGridLayout) {
@ -41,7 +42,7 @@ class RssArticlesAdapter(context: Context, layoutId: Int, val callBack: CallBack
target: Target<Drawable>?,
isFirstResource: Boolean
): Boolean {
image_view.gone()
imageView.gone()
return false
}
@ -52,23 +53,23 @@ class RssArticlesAdapter(context: Context, layoutId: Int, val callBack: CallBack
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
image_view.visible()
imageView.visible()
return false
}
})
}
}.into(image_view)
}.into(imageView)
}
if (item.read) {
tv_title.textColorResource = R.color.tv_text_summary
tvTitle.textColorResource = R.color.tv_text_summary
} else {
tv_title.textColorResource = R.color.primaryText
tvTitle.textColorResource = R.color.primaryText
}
}
}
override fun registerListener(holder: ItemViewHolder) {
override fun registerListener(holder: ItemViewHolder, binding: ItemRssArticleBinding) {
holder.itemView.onClick {
getItem(holder.layoutPosition)?.let {
callBack.readRss(it)
@ -76,8 +77,4 @@ class RssArticlesAdapter(context: Context, layoutId: Int, val callBack: CallBack
}
}
interface CallBack {
val isGridLayout: Boolean
fun readRss(rssArticle: RssArticle)
}
}

@ -0,0 +1,80 @@
package io.legado.app.ui.rss.article
import android.content.Context
import android.graphics.drawable.Drawable
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.data.entities.RssArticle
import io.legado.app.databinding.ItemRssArticle1Binding
import io.legado.app.help.ImageLoader
import io.legado.app.utils.gone
import io.legado.app.utils.visible
import org.jetbrains.anko.sdk27.listeners.onClick
import org.jetbrains.anko.textColorResource
class RssArticlesAdapter1(context: Context, callBack: CallBack) :
BaseRssArticlesAdapter<ItemRssArticle1Binding>(context, callBack) {
override fun convert(
holder: ItemViewHolder,
binding: ItemRssArticle1Binding,
item: RssArticle,
payloads: MutableList<Any>
) {
with(binding) {
tvTitle.text = item.title
tvPubDate.text = item.pubDate
if (item.image.isNullOrBlank() && !callBack.isGridLayout) {
imageView.gone()
} else {
ImageLoader.load(context, item.image).apply {
if (callBack.isGridLayout) {
placeholder(R.drawable.image_rss_article)
} else {
addListener(object : RequestListener<Drawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<Drawable>?,
isFirstResource: Boolean
): Boolean {
imageView.gone()
return false
}
override fun onResourceReady(
resource: Drawable?,
model: Any?,
target: Target<Drawable>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
imageView.visible()
return false
}
})
}
}.into(imageView)
}
if (item.read) {
tvTitle.textColorResource = R.color.tv_text_summary
} else {
tvTitle.textColorResource = R.color.primaryText
}
}
}
override fun registerListener(holder: ItemViewHolder, binding: ItemRssArticle1Binding) {
holder.itemView.onClick {
getItem(holder.layoutPosition)?.let {
callBack.readRss(it)
}
}
}
}

@ -0,0 +1,80 @@
package io.legado.app.ui.rss.article
import android.content.Context
import android.graphics.drawable.Drawable
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.data.entities.RssArticle
import io.legado.app.databinding.ItemRssArticle2Binding
import io.legado.app.help.ImageLoader
import io.legado.app.utils.gone
import io.legado.app.utils.visible
import org.jetbrains.anko.sdk27.listeners.onClick
import org.jetbrains.anko.textColorResource
class RssArticlesAdapter2(context: Context, callBack: CallBack) :
BaseRssArticlesAdapter<ItemRssArticle2Binding>(context, callBack) {
override fun convert(
holder: ItemViewHolder,
binding: ItemRssArticle2Binding,
item: RssArticle,
payloads: MutableList<Any>
) {
with(binding) {
tvTitle.text = item.title
tvPubDate.text = item.pubDate
if (item.image.isNullOrBlank() && !callBack.isGridLayout) {
imageView.gone()
} else {
ImageLoader.load(context, item.image).apply {
if (callBack.isGridLayout) {
placeholder(R.drawable.image_rss_article)
} else {
addListener(object : RequestListener<Drawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<Drawable>?,
isFirstResource: Boolean
): Boolean {
imageView.gone()
return false
}
override fun onResourceReady(
resource: Drawable?,
model: Any?,
target: Target<Drawable>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
imageView.visible()
return false
}
})
}
}.into(imageView)
}
if (item.read) {
tvTitle.textColorResource = R.color.tv_text_summary
} else {
tvTitle.textColorResource = R.color.primaryText
}
}
}
override fun registerListener(holder: ItemViewHolder, binding: ItemRssArticle2Binding) {
holder.itemView.onClick {
getItem(holder.layoutPosition)?.let {
callBack.readRss(it)
}
}
}
}

@ -10,6 +10,8 @@ import io.legado.app.App
import io.legado.app.R
import io.legado.app.base.VMBaseFragment
import io.legado.app.data.entities.RssArticle
import io.legado.app.databinding.FragmentRssArticlesBinding
import io.legado.app.databinding.ViewLoadMoreBinding
import io.legado.app.lib.theme.ATH
import io.legado.app.ui.rss.read.ReadRssActivity
import io.legado.app.ui.widget.recycler.LoadMoreView
@ -17,12 +19,10 @@ import io.legado.app.ui.widget.recycler.VerticalDivider
import io.legado.app.utils.getViewModel
import io.legado.app.utils.getViewModelOfActivity
import io.legado.app.utils.startActivity
import kotlinx.android.synthetic.main.fragment_rss_articles.*
import kotlinx.android.synthetic.main.view_load_more.view.*
import kotlinx.android.synthetic.main.view_refresh_recycler.*
import io.legado.app.utils.viewbindingdelegate.viewBinding
class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragment_rss_articles),
RssArticlesAdapter.CallBack {
BaseRssArticlesAdapter.CallBack {
companion object {
fun create(sortName: String, sortUrl: String): RssArticlesFragment {
@ -35,11 +35,12 @@ class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragme
}
}
private val binding by viewBinding(FragmentRssArticlesBinding::bind)
private val activityViewModel: RssSortViewModel
get() = getViewModelOfActivity(RssSortViewModel::class.java)
override val viewModel: RssArticlesViewModel
get() = getViewModel(RssArticlesViewModel::class.java)
lateinit var adapter: RssArticlesAdapter
lateinit var adapter: BaseRssArticlesAdapter<*>
private lateinit var loadMoreView: LoadMoreView
private var rssArticlesData: LiveData<List<RssArticle>>? = null
override val isGridLayout: Boolean
@ -48,31 +49,36 @@ class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragme
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
viewModel.init(arguments)
initView()
refresh_recycler_view.startLoading()
binding.refreshRecyclerView.startLoading()
initView()
initData()
}
private fun initView() {
ATH.applyEdgeEffectColor(recycler_view)
recycler_view.layoutManager = if (activityViewModel.isGridLayout) {
recycler_view.setPadding(8, 0, 8, 0)
private fun initView() = with(binding) {
ATH.applyEdgeEffectColor(refreshRecyclerView.recyclerView)
refreshRecyclerView.recyclerView.layoutManager = if (activityViewModel.isGridLayout) {
refreshRecyclerView.recyclerView.setPadding(8, 0, 8, 0)
GridLayoutManager(requireContext(), 2)
} else {
recycler_view.addItemDecoration(VerticalDivider(requireContext()))
refreshRecyclerView.recyclerView.addItemDecoration(VerticalDivider(requireContext()))
LinearLayoutManager(requireContext())
}
adapter = RssArticlesAdapter(requireContext(), activityViewModel.layoutId, this)
recycler_view.adapter = adapter
adapter = when (activityViewModel.rssSource?.articleStyle) {
1 -> RssArticlesAdapter1(requireContext(), this@RssArticlesFragment)
2 -> RssArticlesAdapter2(requireContext(), this@RssArticlesFragment)
else -> RssArticlesAdapter(requireContext(), this@RssArticlesFragment)
}
refreshRecyclerView.recyclerView.adapter = adapter
loadMoreView = LoadMoreView(requireContext())
adapter.addFooterView(loadMoreView)
refresh_recycler_view.onRefreshStart = {
adapter.addFooterView(ViewLoadMoreBinding.bind(loadMoreView))
refreshRecyclerView.onRefreshStart = {
activityViewModel.rssSource?.let {
viewModel.loadContent(it)
}
}
recycler_view.addOnScrollListener(object : RecyclerView.OnScrollListener() {
refreshRecyclerView.recyclerView.addOnScrollListener(object :
RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
if (!recyclerView.canScrollVertically(1)) {
@ -95,7 +101,7 @@ class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragme
private fun scrollToBottom() {
if (viewModel.isLoading) return
if (loadMoreView.hasMore && adapter.getActualItemCount() > 0) {
loadMoreView.rotate_loading.show()
loadMoreView.startLoad()
activityViewModel.rssSource?.let {
viewModel.loadMore(it)
}
@ -104,7 +110,7 @@ class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragme
override fun observeLiveBus() {
viewModel.loadFinally.observe(viewLifecycleOwner) {
refresh_recycler_view.stopLoading()
binding.refreshRecyclerView.stopLoading()
if (it) {
loadMoreView.startLoad()
} else {

@ -4,7 +4,6 @@ import android.app.Application
import android.content.Intent
import androidx.lifecycle.MutableLiveData
import io.legado.app.App
import io.legado.app.R
import io.legado.app.base.BaseViewModel
import io.legado.app.data.entities.RssArticle
import io.legado.app.data.entities.RssReadRecord
@ -17,12 +16,6 @@ class RssSortViewModel(application: Application) : BaseViewModel(application) {
val titleLiveData = MutableLiveData<String>()
var order = System.currentTimeMillis()
val isGridLayout get() = rssSource?.articleStyle == 2
val layoutId
get() = when (rssSource?.articleStyle) {
1 -> R.layout.item_rss_article_1
2 -> R.layout.item_rss_article_2
else -> R.layout.item_rss_article
}
fun initData(intent: Intent, finally: () -> Unit) {
execute {

@ -6,25 +6,29 @@ import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.data.entities.RssStar
import io.legado.app.databinding.ItemRssArticleBinding
import io.legado.app.help.ImageLoader
import io.legado.app.utils.gone
import io.legado.app.utils.visible
import kotlinx.android.synthetic.main.item_rss_article.view.*
import org.jetbrains.anko.sdk27.listeners.onClick
class RssFavoritesAdapter(context: Context, val callBack: CallBack) :
SimpleRecyclerAdapter<RssStar>(context, R.layout.item_rss_article) {
SimpleRecyclerAdapter<RssStar, ItemRssArticleBinding>(context) {
override fun convert(holder: ItemViewHolder, item: RssStar, payloads: MutableList<Any>) {
with(holder.itemView) {
tv_title.text = item.title
tv_pub_date.text = item.pubDate
override fun convert(
holder: ItemViewHolder,
binding: ItemRssArticleBinding,
item: RssStar,
payloads: MutableList<Any>
) {
with(binding) {
tvTitle.text = item.title
tvPubDate.text = item.pubDate
if (item.image.isNullOrBlank()) {
image_view.gone()
imageView.gone()
} else {
ImageLoader.load(context, item.image)
.addListener(object : RequestListener<Drawable> {
@ -34,7 +38,7 @@ class RssFavoritesAdapter(context: Context, val callBack: CallBack) :
target: Target<Drawable>?,
isFirstResource: Boolean
): Boolean {
image_view.gone()
imageView.gone()
return false
}
@ -45,17 +49,17 @@ class RssFavoritesAdapter(context: Context, val callBack: CallBack) :
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
image_view.visible()
imageView.visible()
return false
}
})
.into(image_view)
.into(imageView)
}
}
}
override fun registerListener(holder: ItemViewHolder) {
override fun registerListener(holder: ItemViewHolder, binding: ItemRssArticleBinding) {
holder.itemView.onClick {
getItem(holder.layoutPosition)?.let {
callBack.readRss(it)

@ -5,29 +5,34 @@ import android.view.View
import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter
import kotlinx.android.synthetic.main.item_log.view.*
import io.legado.app.databinding.ItemLogBinding
class RssSourceDebugAdapter(context: Context) :
SimpleRecyclerAdapter<String>(context, R.layout.item_log) {
override fun convert(holder: ItemViewHolder, item: String, payloads: MutableList<Any>) {
holder.itemView.apply {
if (text_view.getTag(R.id.tag1) == null) {
SimpleRecyclerAdapter<String, ItemLogBinding>(context) {
override fun convert(
holder: ItemViewHolder,
binding: ItemLogBinding,
item: String,
payloads: MutableList<Any>
) {
binding.apply {
if (textView.getTag(R.id.tag1) == null) {
val listener = object : View.OnAttachStateChangeListener {
override fun onViewAttachedToWindow(v: View) {
text_view.isCursorVisible = false
text_view.isCursorVisible = true
textView.isCursorVisible = false
textView.isCursorVisible = true
}
override fun onViewDetachedFromWindow(v: View) {}
}
text_view.addOnAttachStateChangeListener(listener)
text_view.setTag(R.id.tag1, listener)
textView.addOnAttachStateChangeListener(listener)
textView.setTag(R.id.tag1, listener)
}
text_view.text = item
textView.text = item
}
}
override fun registerListener(holder: ItemViewHolder) {
override fun registerListener(holder: ItemViewHolder, binding: ItemLogBinding) {
//nothing
}
}

@ -7,7 +7,7 @@ import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import io.legado.app.R
import kotlinx.android.synthetic.main.item_source_edit.view.*
import io.legado.app.databinding.ItemSourceEditBinding
class RssSourceEditAdapter : RecyclerView.Adapter<RssSourceEditAdapter.MyViewHolder>() {
@ -18,11 +18,9 @@ class RssSourceEditAdapter : RecyclerView.Adapter<RssSourceEditAdapter.MyViewHol
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
return MyViewHolder(
LayoutInflater.from(
parent.context
).inflate(R.layout.item_source_edit, parent, false)
)
val binding = ItemSourceEditBinding
.inflate(LayoutInflater.from(parent.context), parent, false)
return MyViewHolder(binding)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
@ -33,8 +31,9 @@ class RssSourceEditAdapter : RecyclerView.Adapter<RssSourceEditAdapter.MyViewHol
return editEntities.size
}
class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bind(editEntity: EditEntity) = with(itemView) {
class MyViewHolder(val binding: ItemSourceEditBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(editEntity: EditEntity) = with(binding) {
if (editText.getTag(R.id.tag1) == null) {
val listener = object : View.OnAttachStateChangeListener {
override fun onViewAttachedToWindow(v: View) {
@ -57,7 +56,7 @@ class RssSourceEditAdapter : RecyclerView.Adapter<RssSourceEditAdapter.MyViewHol
}
}
editText.setText(editEntity.value)
textInputLayout.hint = context.getString(editEntity.hint)
textInputLayout.hint = itemView.context.getString(editEntity.hint)
val textWatcher = object : TextWatcher {
override fun beforeTextChanged(
s: CharSequence,

@ -7,7 +7,6 @@ import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import androidx.appcompat.widget.Toolbar
import androidx.recyclerview.widget.LinearLayoutManager
import io.legado.app.App
@ -16,19 +15,21 @@ import io.legado.app.base.BaseDialogFragment
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.constant.AppPattern
import io.legado.app.databinding.DialogEditTextBinding
import io.legado.app.databinding.DialogRecyclerViewBinding
import io.legado.app.databinding.ItemGroupManageBinding
import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.accentColor
import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.widget.recycler.VerticalDivider
import io.legado.app.utils.*
import kotlinx.android.synthetic.main.dialog_edit_text.view.*
import kotlinx.android.synthetic.main.dialog_recycler_view.*
import kotlinx.android.synthetic.main.item_group_manage.view.*
import io.legado.app.utils.viewbindingdelegate.viewBinding
import org.jetbrains.anko.sdk27.listeners.onClick
class GroupManageDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener {
private lateinit var viewModel: RssSourceViewModel
private lateinit var adapter: GroupAdapter
private val binding by viewBinding(DialogRecyclerViewBinding::bind)
override fun onStart() {
super.onStart()
@ -45,19 +46,19 @@ class GroupManageDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener
return inflater.inflate(R.layout.dialog_recycler_view, container)
}
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
tool_bar.setBackgroundColor(primaryColor)
tool_bar.title = getString(R.string.group_manage)
tool_bar.inflateMenu(R.menu.group_manage)
tool_bar.menu.applyTint(requireContext())
tool_bar.setOnMenuItemClickListener(this)
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) = with(binding) {
toolBar.setBackgroundColor(primaryColor)
toolBar.title = getString(R.string.group_manage)
toolBar.inflateMenu(R.menu.group_manage)
toolBar.menu.applyTint(requireContext())
toolBar.setOnMenuItemClickListener(this@GroupManageDialog)
adapter = GroupAdapter(requireContext())
recycler_view.layoutManager = LinearLayoutManager(requireContext())
recycler_view.addItemDecoration(VerticalDivider(requireContext()))
recycler_view.adapter = adapter
tv_ok.setTextColor(requireContext().accentColor)
tv_ok.visible()
tv_ok.onClick { dismiss() }
recyclerView.layoutManager = LinearLayoutManager(requireContext())
recyclerView.addItemDecoration(VerticalDivider(requireContext()))
recyclerView.adapter = adapter
tvOk.setTextColor(requireContext().accentColor)
tvOk.visible()
tvOk.onClick { dismiss() }
App.db.rssSourceDao().liveGroup().observe(viewLifecycleOwner, {
val groups = linkedSetOf<String>()
it.map { group ->
@ -77,16 +78,14 @@ class GroupManageDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener
@SuppressLint("InflateParams")
private fun addGroup() {
alert(title = getString(R.string.add_group)) {
var editText: EditText? = null
val alertBinding = DialogEditTextBinding.inflate(layoutInflater)
customView {
layoutInflater.inflate(R.layout.dialog_edit_text, null).apply {
editText = edit_view.apply {
hint = "分组名称"
}
}
alertBinding.apply {
editView.setHint(R.string.group_name)
}.root
}
yesButton {
editText?.text?.toString()?.let {
alertBinding.editView.text?.toString()?.let {
if (it.isNotBlank()) {
viewModel.addGroup(it)
}
@ -99,40 +98,43 @@ class GroupManageDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener
@SuppressLint("InflateParams")
private fun editGroup(group: String) {
alert(title = getString(R.string.group_edit)) {
var editText: EditText? = null
val alertBinding = DialogEditTextBinding.inflate(layoutInflater)
customView {
layoutInflater.inflate(R.layout.dialog_edit_text, null).apply {
editText = edit_view.apply {
hint = "分组名称"
setText(group)
}
}
alertBinding.apply {
editView.setHint(R.string.group_name)
editView.setText(group)
}.root
}
yesButton {
viewModel.upGroup(group, editText?.text?.toString())
viewModel.upGroup(group, alertBinding.editView.text?.toString())
}
noButton()
}.show().requestInputMethod()
}
private inner class GroupAdapter(context: Context) :
SimpleRecyclerAdapter<String>(context, R.layout.item_group_manage) {
SimpleRecyclerAdapter<String, ItemGroupManageBinding>(context) {
override fun convert(holder: ItemViewHolder, item: String, payloads: MutableList<Any>) {
with(holder.itemView) {
tv_group.text = item
override fun convert(
holder: ItemViewHolder,
binding: ItemGroupManageBinding,
item: String,
payloads: MutableList<Any>
) {
with(binding) {
tvGroup.text = item
}
}
override fun registerListener(holder: ItemViewHolder) {
holder.itemView.apply {
tv_edit.onClick {
override fun registerListener(holder: ItemViewHolder, binding: ItemGroupManageBinding) {
binding.apply {
tvEdit.onClick {
getItem(holder.layoutPosition)?.let {
editGroup(it)
}
}
tv_del.onClick {
tvDel.onClick {
getItem(holder.layoutPosition)?.let {
viewModel.delGroup(it)
}

@ -10,15 +10,15 @@ import io.legado.app.R
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.databinding.ItemRssSourceBinding
import io.legado.app.lib.theme.backgroundColor
import io.legado.app.ui.widget.recycler.DragSelectTouchHelper
import io.legado.app.ui.widget.recycler.ItemTouchCallback
import kotlinx.android.synthetic.main.item_rss_source.view.*
import org.jetbrains.anko.sdk27.listeners.onClick
import java.util.*
class RssSourceAdapter(context: Context, val callBack: CallBack) :
SimpleRecyclerAdapter<RssSource>(context, R.layout.item_rss_source),
SimpleRecyclerAdapter<RssSource, ItemRssSourceBinding>(context),
ItemTouchCallback.Callback {
private val selected = linkedSetOf<RssSource>()
@ -53,40 +53,45 @@ class RssSourceAdapter(context: Context, val callBack: CallBack) :
return selection.sortedBy { it.customOrder }
}
override fun convert(holder: ItemViewHolder, item: RssSource, payloads: MutableList<Any>) {
with(holder.itemView) {
override fun convert(
holder: ItemViewHolder,
binding: ItemRssSourceBinding,
item: RssSource,
payloads: MutableList<Any>
) {
with(binding) {
val bundle = payloads.getOrNull(0) as? Bundle
if (bundle == null) {
this.setBackgroundColor(context.backgroundColor)
root.setBackgroundColor(context.backgroundColor)
if (item.sourceGroup.isNullOrEmpty()) {
cb_source.text = item.sourceName
cbSource.text = item.sourceName
} else {
cb_source.text =
cbSource.text =
String.format("%s (%s)", item.sourceName, item.sourceGroup)
}
swt_enabled.isChecked = item.enabled
cb_source.isChecked = selected.contains(item)
swtEnabled.isChecked = item.enabled
cbSource.isChecked = selected.contains(item)
} else {
bundle.keySet().map {
when (it) {
"name", "group" ->
if (item.sourceGroup.isNullOrEmpty()) {
cb_source.text = item.sourceName
cbSource.text = item.sourceName
} else {
cb_source.text =
cbSource.text =
String.format("%s (%s)", item.sourceName, item.sourceGroup)
}
"selected" -> cb_source.isChecked = selected.contains(item)
"enabled" -> swt_enabled.isChecked = item.enabled
"selected" -> cbSource.isChecked = selected.contains(item)
"enabled" -> cbSource.isChecked = item.enabled
}
}
}
}
}
override fun registerListener(holder: ItemViewHolder) {
holder.itemView.apply {
swt_enabled.setOnCheckedChangeListener { view, checked ->
override fun registerListener(holder: ItemViewHolder, binding: ItemRssSourceBinding) {
binding.apply {
swtEnabled.setOnCheckedChangeListener { view, checked ->
getItem(holder.layoutPosition)?.let {
if (view.isPressed) {
it.enabled = checked
@ -94,7 +99,7 @@ class RssSourceAdapter(context: Context, val callBack: CallBack) :
}
}
}
cb_source.setOnCheckedChangeListener { view, checked ->
cbSource.setOnCheckedChangeListener { view, checked ->
getItem(holder.layoutPosition)?.let {
if (view.isPressed) {
if (checked) {
@ -106,13 +111,13 @@ class RssSourceAdapter(context: Context, val callBack: CallBack) :
}
}
}
iv_edit.onClick {
ivEdit.onClick {
getItem(holder.layoutPosition)?.let {
callBack.edit(it)
}
}
iv_menu_more.onClick {
showMenu(iv_menu_more, holder.layoutPosition)
ivMenuMore.onClick {
showMenu(ivMenuMore, holder.layoutPosition)
}
}
}

@ -1,17 +1,15 @@
package io.legado.app.ui.widget
import android.annotation.SuppressLint
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.PopupWindow
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter
import kotlinx.android.synthetic.main.item_fillet_text.view.*
import kotlinx.android.synthetic.main.popup_keyboard_tool.view.*
import io.legado.app.databinding.ItemFilletTextBinding
import io.legado.app.databinding.PopupKeyboardToolBinding
import org.jetbrains.anko.sdk27.listeners.onClick
@ -21,9 +19,10 @@ class KeyboardToolPop(
val callBack: CallBack?
) : PopupWindow(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) {
private val binding = PopupKeyboardToolBinding.inflate(LayoutInflater.from(context))
init {
@SuppressLint("InflateParams")
contentView = LayoutInflater.from(context).inflate(R.layout.popup_keyboard_tool, null)
contentView = binding.root
isTouchable = true
isOutsideTouchable = false
@ -34,21 +33,27 @@ class KeyboardToolPop(
private fun initRecyclerView() = with(contentView) {
val adapter = Adapter(context)
recycler_view.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false)
recycler_view.adapter = adapter
binding.recyclerView.layoutManager =
LinearLayoutManager(context, RecyclerView.HORIZONTAL, false)
binding.recyclerView.adapter = adapter
adapter.setItems(chars)
}
inner class Adapter(context: Context) :
SimpleRecyclerAdapter<String>(context, R.layout.item_fillet_text) {
SimpleRecyclerAdapter<String, ItemFilletTextBinding>(context) {
override fun convert(holder: ItemViewHolder, item: String, payloads: MutableList<Any>) {
with(holder.itemView) {
text_view.text = item
override fun convert(
holder: ItemViewHolder,
binding: ItemFilletTextBinding,
item: String,
payloads: MutableList<Any>
) {
with(binding) {
textView.text = item
}
}
override fun registerListener(holder: ItemViewHolder) {
override fun registerListener(holder: ItemViewHolder, binding: ItemFilletTextBinding) {
holder.itemView.apply {
onClick {
getItem(holder.layoutPosition)?.let {

@ -2,18 +2,18 @@ package io.legado.app.ui.widget
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
import android.widget.FrameLayout
import androidx.annotation.MenuRes
import androidx.annotation.StringRes
import androidx.appcompat.widget.PopupMenu
import io.legado.app.R
import io.legado.app.databinding.ViewSelectActionBarBinding
import io.legado.app.help.AppConfig
import io.legado.app.lib.theme.*
import io.legado.app.utils.ColorUtils
import io.legado.app.utils.visible
import kotlinx.android.synthetic.main.view_select_action_bar.view.*
import org.jetbrains.anko.sdk27.listeners.onClick
@Suppress("unused")
@ -23,42 +23,43 @@ class SelectActionBar @JvmOverloads constructor(
) : FrameLayout(context, attrs) {
private var callBack: CallBack? = null
private var selMenu: PopupMenu? = null
private val binding =
ViewSelectActionBarBinding.inflate(LayoutInflater.from(context), this, true)
init {
setBackgroundColor(context.bottomBackground)
elevation =
if (AppConfig.elevation < 0) context.elevation else AppConfig.elevation.toFloat()
View.inflate(context, R.layout.view_select_action_bar, this)
val textIsDark = ColorUtils.isColorLight(context.bottomBackground)
val primaryTextColor = context.getPrimaryTextColor(textIsDark)
val secondaryTextColor = context.getSecondaryTextColor(textIsDark)
cb_selected_all.setTextColor(primaryTextColor)
TintHelper.setTint(cb_selected_all, context.accentColor, !textIsDark)
iv_menu_more.setColorFilter(secondaryTextColor)
cb_selected_all.setOnCheckedChangeListener { buttonView, isChecked ->
binding.cbSelectedAll.setTextColor(primaryTextColor)
TintHelper.setTint(binding.cbSelectedAll, context.accentColor, !textIsDark)
binding.ivMenuMore.setColorFilter(secondaryTextColor)
binding.cbSelectedAll.setOnCheckedChangeListener { buttonView, isChecked ->
if (buttonView.isPressed) {
callBack?.selectAll(isChecked)
}
}
btn_revert_selection.onClick { callBack?.revertSelection() }
btn_select_action_main.onClick { callBack?.onClickMainAction() }
iv_menu_more.onClick { selMenu?.show() }
binding.btnRevertSelection.onClick { callBack?.revertSelection() }
binding.btnSelectActionMain.onClick { callBack?.onClickMainAction() }
binding.ivMenuMore.onClick { selMenu?.show() }
}
fun setMainActionText(text: String) {
btn_select_action_main.text = text
btn_select_action_main.visible()
fun setMainActionText(text: String) = with(binding) {
btnSelectActionMain.text = text
btnSelectActionMain.visible()
}
fun setMainActionText(@StringRes id: Int) {
btn_select_action_main.setText(id)
btn_select_action_main.visible()
fun setMainActionText(@StringRes id: Int) = with(binding) {
btnSelectActionMain.setText(id)
btnSelectActionMain.visible()
}
fun inflateMenu(@MenuRes resId: Int): Menu? {
selMenu = PopupMenu(context, iv_menu_more)
selMenu = PopupMenu(context, binding.ivMenuMore)
selMenu?.inflate(resId)
iv_menu_more.visible()
binding.ivMenuMore.visible()
return selMenu?.menu
}
@ -70,22 +71,22 @@ class SelectActionBar @JvmOverloads constructor(
selMenu?.setOnMenuItemClickListener(listener)
}
fun upCountView(selectCount: Int, allCount: Int) {
fun upCountView(selectCount: Int, allCount: Int) = with(binding) {
if (selectCount == 0) {
cb_selected_all.isChecked = false
cbSelectedAll.isChecked = false
} else {
cb_selected_all.isChecked = selectCount >= allCount
cbSelectedAll.isChecked = selectCount >= allCount
}
//重置全选的文字
if (cb_selected_all.isChecked) {
cb_selected_all.text = context.getString(
if (cbSelectedAll.isChecked) {
cbSelectedAll.text = context.getString(
R.string.select_cancel_count,
selectCount,
allCount
)
} else {
cb_selected_all.text = context.getString(
cbSelectedAll.text = context.getString(
R.string.select_all_count,
selectCount,
allCount
@ -94,11 +95,11 @@ class SelectActionBar @JvmOverloads constructor(
setMenuClickable(selectCount > 0)
}
private fun setMenuClickable(isClickable: Boolean) {
btn_revert_selection.isEnabled = isClickable
btn_revert_selection.isClickable = isClickable
btn_select_action_main.isEnabled = isClickable
btn_select_action_main.isClickable = isClickable
private fun setMenuClickable(isClickable: Boolean) = with(binding) {
btnRevertSelection.isEnabled = isClickable
btnRevertSelection.isClickable = isClickable
btnSelectActionMain.isEnabled = isClickable
btnSelectActionMain.isClickable = isClickable
}
interface CallBack {

@ -7,9 +7,10 @@ import android.view.ViewGroup
import androidx.fragment.app.FragmentManager
import io.legado.app.R
import io.legado.app.base.BaseDialogFragment
import io.legado.app.databinding.DialogPhotoViewBinding
import io.legado.app.service.help.ReadBook
import io.legado.app.ui.book.read.page.provider.ImageProvider
import kotlinx.android.synthetic.main.dialog_photo_view.*
import io.legado.app.utils.viewbindingdelegate.viewBinding
class PhotoDialog : BaseDialogFragment() {
@ -31,6 +32,8 @@ class PhotoDialog : BaseDialogFragment() {
}
private val binding by viewBinding(DialogPhotoViewBinding::bind)
override fun onStart() {
super.onStart()
dialog?.window?.setLayout(
@ -57,7 +60,7 @@ class PhotoDialog : BaseDialogFragment() {
ImageProvider.getImage(book, chapterIndex, src)
}.onSuccess { bitmap ->
if (bitmap != null) {
photo_view.setImageBitmap(bitmap)
binding.photoView.setImageBitmap(bitmap)
}
}
}

@ -7,10 +7,11 @@ import android.view.ViewGroup
import androidx.fragment.app.FragmentManager
import io.legado.app.R
import io.legado.app.base.BaseDialogFragment
import io.legado.app.databinding.DialogTextViewBinding
import io.legado.app.utils.getSize
import io.legado.app.utils.viewbindingdelegate.viewBinding
import io.noties.markwon.Markwon
import io.noties.markwon.image.glide.GlideImagesPlugin
import kotlinx.android.synthetic.main.dialog_text_view.*
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@ -40,8 +41,8 @@ class TextDialog : BaseDialogFragment() {
}
private val binding by viewBinding(DialogTextViewBinding::bind)
private var time = 0L
private var autoClose: Boolean = false
override fun onStart() {
@ -62,23 +63,23 @@ class TextDialog : BaseDialogFragment() {
arguments?.let {
val content = it.getString("content") ?: ""
when (it.getInt("mode")) {
MD -> text_view.post {
MD -> binding.textView.post {
Markwon.builder(requireContext())
.usePlugin(GlideImagesPlugin.create(requireContext()))
.build()
.setMarkdown(text_view, content)
.setMarkdown(binding.textView, content)
}
else -> text_view.text = content
else -> binding.textView.text = content
}
time = it.getLong("time", 0L)
}
if (time > 0) {
badge_view.setBadgeCount((time / 1000).toInt())
binding.badgeView.setBadgeCount((time / 1000).toInt())
launch {
while (time > 0) {
delay(1000)
time -= 1000
badge_view.setBadgeCount((time / 1000).toInt())
binding.badgeView.setBadgeCount((time / 1000).toInt())
if (time <= 0) {
view.post {
dialog?.setCancelable(true)

@ -11,9 +11,10 @@ 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.databinding.DialogRecyclerViewBinding
import io.legado.app.databinding.ItemLogBinding
import io.legado.app.utils.getSize
import kotlinx.android.synthetic.main.dialog_recycler_view.*
import kotlinx.android.synthetic.main.item_log.view.*
import io.legado.app.utils.viewbindingdelegate.viewBinding
class TextListDialog : BaseDialogFragment() {
@ -28,8 +29,9 @@ class TextListDialog : BaseDialogFragment() {
}
}
private val binding by viewBinding(DialogRecyclerViewBinding::bind)
lateinit var adapter: TextAdapter
var values: ArrayList<String>? = null
private var values: ArrayList<String>? = null
override fun onStart() {
super.onStart()
@ -45,38 +47,44 @@ class TextListDialog : BaseDialogFragment() {
return inflater.inflate(R.layout.dialog_recycler_view, container)
}
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) = with(binding) {
arguments?.let {
tool_bar.title = it.getString("title")
toolBar.title = it.getString("title")
values = it.getStringArrayList("values")
}
recycler_view.layoutManager = LinearLayoutManager(requireContext())
recyclerView.layoutManager = LinearLayoutManager(requireContext())
adapter = TextAdapter(requireContext())
recycler_view.adapter = adapter
recyclerView.adapter = adapter
adapter.setItems(values)
}
class TextAdapter(context: Context) :
SimpleRecyclerAdapter<String>(context, R.layout.item_log) {
override fun convert(holder: ItemViewHolder, item: String, payloads: MutableList<Any>) {
holder.itemView.apply {
if (text_view.getTag(R.id.tag1) == null) {
SimpleRecyclerAdapter<String, ItemLogBinding>(context) {
override fun convert(
holder: ItemViewHolder,
binding: ItemLogBinding,
item: String,
payloads: MutableList<Any>
) {
binding.apply {
if (textView.getTag(R.id.tag1) == null) {
val listener = object : View.OnAttachStateChangeListener {
override fun onViewAttachedToWindow(v: View) {
text_view.isCursorVisible = false
text_view.isCursorVisible = true
textView.isCursorVisible = false
textView.isCursorVisible = true
}
override fun onViewDetachedFromWindow(v: View) {}
}
text_view.addOnAttachStateChangeListener(listener)
text_view.setTag(R.id.tag1, listener)
textView.addOnAttachStateChangeListener(listener)
textView.setTag(R.id.tag1, listener)
}
text_view.text = item
textView.text = item
}
}
override fun registerListener(holder: ItemViewHolder) {
override fun registerListener(holder: ItemViewHolder, binding: ItemLogBinding) {
//nothing
}
}

@ -4,13 +4,13 @@ import android.content.Context
import android.graphics.drawable.Drawable
import android.util.AttributeSet
import android.view.View
import android.view.ViewStub
import android.widget.FrameLayout
import android.widget.ProgressBar
import androidx.appcompat.widget.AppCompatButton
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView
import io.legado.app.R
import kotlinx.android.synthetic.main.view_dynamic.view.*
@Suppress("unused")
class DynamicFrameLayout @JvmOverloads constructor(
@ -150,7 +150,7 @@ class DynamicFrameLayout @JvmOverloads constructor(
private fun ensureErrorView() {
if (errorView == null) {
errorView = errorViewStub.inflate()
errorView = findViewById<ViewStub>(R.id.error_view_stub).inflate()
errorImage = errorView?.findViewById(R.id.iv_error_image)
errorTextView = errorView?.findViewById(R.id.tv_error_message)
actionBtn = errorView?.findViewById(R.id.btn_error_retry)
@ -166,7 +166,7 @@ class DynamicFrameLayout @JvmOverloads constructor(
private fun ensureProgressView() {
if (progressView == null) {
progressView = progressViewStub.inflate()
progressView = findViewById<ViewStub>(R.id.progress_view_stub).inflate()
progressBar = progressView?.findViewById(R.id.loading_progress)
}
}

@ -3,23 +3,27 @@ package io.legado.app.ui.widget.font
import android.content.Context
import android.graphics.Typeface
import android.os.Build
import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.databinding.ItemFontBinding
import io.legado.app.utils.DocItem
import io.legado.app.utils.RealPathUtil
import io.legado.app.utils.invisible
import io.legado.app.utils.visible
import kotlinx.android.synthetic.main.item_font.view.*
import org.jetbrains.anko.sdk27.listeners.onClick
import org.jetbrains.anko.toast
import java.io.File
class FontAdapter(context: Context, val callBack: CallBack) :
SimpleRecyclerAdapter<DocItem>(context, R.layout.item_font) {
SimpleRecyclerAdapter<DocItem, ItemFontBinding>(context) {
override fun convert(holder: ItemViewHolder, item: DocItem, payloads: MutableList<Any>) {
with(holder.itemView) {
override fun convert(
holder: ItemViewHolder,
binding: ItemFontBinding,
item: DocItem,
payloads: MutableList<Any>
) {
with(binding) {
try {
val typeface: Typeface? = if (item.isContentPath) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
@ -34,22 +38,22 @@ class FontAdapter(context: Context, val callBack: CallBack) :
} else {
Typeface.createFromFile(item.uri.toString())
}
tv_font.typeface = typeface
tvFont.typeface = typeface
} catch (e: Exception) {
e.printStackTrace()
context.toast("Read ${item.name} Error: ${e.localizedMessage}")
}
tv_font.text = item.name
this.onClick { callBack.onClick(item) }
tvFont.text = item.name
root.onClick { callBack.onClick(item) }
if (item.name == callBack.curFilePath.substringAfterLast(File.separator)) {
iv_checked.visible()
ivChecked.visible()
} else {
iv_checked.invisible()
ivChecked.invisible()
}
}
}
override fun registerListener(holder: ItemViewHolder) {
override fun registerListener(holder: ItemViewHolder, binding: ItemFontBinding) {
holder.itemView.onClick {
getItem(holder.layoutPosition)?.let {
callBack.onClick(it)

@ -15,6 +15,7 @@ import io.legado.app.App
import io.legado.app.R
import io.legado.app.base.BaseDialogFragment
import io.legado.app.constant.PreferKey
import io.legado.app.databinding.DialogFontSelectBinding
import io.legado.app.help.AppConfig
import io.legado.app.help.permission.Permissions
import io.legado.app.help.permission.PermissionsCompat
@ -23,7 +24,7 @@ import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.filepicker.FilePicker
import io.legado.app.ui.filepicker.FilePickerDialog
import io.legado.app.utils.*
import kotlinx.android.synthetic.main.dialog_font_select.*
import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.Dispatchers.Main
import kotlinx.coroutines.launch
import java.io.File
@ -40,6 +41,7 @@ class FontSelectDialog : BaseDialogFragment(),
FileUtils.createFolderIfNotExist(App.INSTANCE.filesDir, "Fonts")
}
private var adapter: FontAdapter? = null
private val binding by viewBinding(DialogFontSelectBinding::bind)
override fun onStart() {
super.onStart()
@ -56,14 +58,14 @@ class FontSelectDialog : BaseDialogFragment(),
}
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
tool_bar.setBackgroundColor(primaryColor)
tool_bar.setTitle(R.string.select_font)
tool_bar.inflateMenu(R.menu.font_select)
tool_bar.menu.applyTint(requireContext())
tool_bar.setOnMenuItemClickListener(this)
binding.toolBar.setBackgroundColor(primaryColor)
binding.toolBar.setTitle(R.string.select_font)
binding.toolBar.inflateMenu(R.menu.font_select)
binding.toolBar.menu.applyTint(requireContext())
binding.toolBar.setOnMenuItemClickListener(this)
adapter = FontAdapter(requireContext(), this)
recycler_view.layoutManager = LinearLayoutManager(context)
recycler_view.adapter = adapter
binding.recyclerView.layoutManager = LinearLayoutManager(context)
binding.recyclerView.adapter = adapter
val fontPath = getPrefString(PreferKey.fontFolder)
if (fontPath.isNullOrEmpty()) {

@ -6,7 +6,6 @@ import androidx.appcompat.app.AlertDialog
import io.legado.app.R
import io.legado.app.utils.applyTint
import io.legado.app.utils.hideSoftInput
import kotlinx.android.synthetic.main.dialog_number_picker.*
class NumberPickerDialog(context: Context) {
@ -61,7 +60,7 @@ class NumberPickerDialog(context: Context) {
}
builder.setNegativeButton(R.string.cancel, null)
val dialog = builder.show().applyTint()
numberPicker = dialog.number_picker
numberPicker = dialog.findViewById(R.id.number_picker)
numberPicker?.let { np ->
minValue?.let {
np.minValue = it

@ -17,11 +17,12 @@ 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.databinding.DialogRecyclerViewBinding
import io.legado.app.databinding.ItemIconPreferenceBinding
import io.legado.app.lib.theme.primaryColor
import io.legado.app.utils.getCompatDrawable
import io.legado.app.utils.getSize
import kotlinx.android.synthetic.main.dialog_recycler_view.*
import kotlinx.android.synthetic.main.item_icon_preference.view.*
import io.legado.app.utils.viewbindingdelegate.viewBinding
import org.jetbrains.anko.sdk27.listeners.onClick
@ -117,6 +118,7 @@ class IconListPreference(context: Context, attrs: AttributeSet) : ListPreference
var dialogEntries: Array<CharSequence>? = null
var dialogEntryValues: Array<CharSequence>? = null
var dialogIconNames: Array<CharSequence>? = null
private val binding by viewBinding(DialogRecyclerViewBinding::bind)
override fun onStart() {
super.onStart()
@ -136,11 +138,11 @@ class IconListPreference(context: Context, attrs: AttributeSet) : ListPreference
}
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
tool_bar.setBackgroundColor(primaryColor)
tool_bar.setTitle(R.string.change_icon)
recycler_view.layoutManager = LinearLayoutManager(requireContext())
binding.toolBar.setBackgroundColor(primaryColor)
binding.toolBar.setTitle(R.string.change_icon)
binding.recyclerView.layoutManager = LinearLayoutManager(requireContext())
val adapter = Adapter(requireContext())
recycler_view.adapter = adapter
binding.recyclerView.adapter = adapter
arguments?.let {
dialogValue = it.getString("value")
dialogEntries = it.getCharSequenceArray("entries")
@ -154,14 +156,15 @@ class IconListPreference(context: Context, attrs: AttributeSet) : ListPreference
inner class Adapter(context: Context) :
SimpleRecyclerAdapter<CharSequence>(context, R.layout.item_icon_preference) {
SimpleRecyclerAdapter<CharSequence, ItemIconPreferenceBinding>(context) {
override fun convert(
holder: ItemViewHolder,
binding: ItemIconPreferenceBinding,
item: CharSequence,
payloads: MutableList<Any>
) {
with(holder.itemView) {
with(binding) {
val index = findIndexOfValue(item.toString())
dialogEntries?.let {
label.text = it[index]
@ -179,14 +182,17 @@ class IconListPreference(context: Context, attrs: AttributeSet) : ListPreference
}
}
label.isChecked = item.toString() == dialogValue
onClick {
root.onClick {
onChanged?.invoke(item.toString())
this@IconDialog.dismiss()
}
}
}
override fun registerListener(holder: ItemViewHolder) {
override fun registerListener(
holder: ItemViewHolder,
binding: ItemIconPreferenceBinding
) {
holder.itemView.onClick {
getItem(holder.layoutPosition)?.let {
onChanged?.invoke(it.toString())

@ -8,12 +8,13 @@ import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.widget.AppCompatAutoCompleteTextView
import io.legado.app.R
import io.legado.app.lib.theme.ATH
import io.legado.app.utils.gone
import io.legado.app.utils.visible
import kotlinx.android.synthetic.main.item_1line_text_and_del.view.*
import org.jetbrains.anko.sdk27.listeners.onClick
@Suppress("unused")
@ -56,9 +57,11 @@ class AutoCompleteTextView @JvmOverloads constructor(
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view = convertView ?: LayoutInflater.from(context)
.inflate(R.layout.item_1line_text_and_del, parent, false)
view.text_view.text = getItem(position)
if (delCallBack != null) view.iv_delete.visible() else view.iv_delete.gone()
view.iv_delete.onClick {
val textView = view.findViewById<TextView>(R.id.text_view)
textView.text = getItem(position)
val ivDelete = view.findViewById<ImageView>(R.id.iv_delete)
if (delCallBack != null) ivDelete.visible() else ivDelete.gone()
ivDelete.onClick {
getItem(position)?.let {
remove(it)
delCallBack?.invoke(it)

@ -4,14 +4,14 @@
android:layout_height="match_parent">
<ViewStub
android:id="@+id/errorViewStub"
android:id="@+id/error_view_stub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout="@layout/view_error" />
<ViewStub
android:id="@+id/progressViewStub"
android:id="@+id/progress_view_stub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"

Loading…
Cancel
Save