From 571677dd2807036ae1bcd2c68864c8a694894472 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 23 Feb 2020 18:02:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/model/localBook/AnalyzeTxtFile.kt | 3 ++ .../app/ui/book/read/ReadBookActivity.kt | 8 +++++ .../app/ui/book/read/ReadBookViewModel.kt | 1 + .../app/ui/book/read/config/TocRegexDialog.kt | 35 +++++++++++++++++-- .../main/res/layout/dialog_toc_regex_edit.xml | 5 ++- 5 files changed, 48 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt index 86e64bb02..fad747b34 100644 --- a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt @@ -205,6 +205,9 @@ object AnalyzeTxtFile { } private fun getTocRule(book: Book, bookStream: RandomAccessFile, charset: Charset): Pattern? { + if (book.tocUrl.isNotEmpty()) { + return Pattern.compile(book.tocUrl, Pattern.MULTILINE) + } val tocRules = getTocRules() var rulePattern: Pattern? = null //首先获取128k的数据 diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index 2e7fa5bde..903dc3ebd 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -62,6 +62,7 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo ReadAloudDialog.CallBack, ChangeSourceDialog.CallBack, ReadBook.CallBack, + TocRegexDialog.CallBack, ColorPickerDialogListener { private val requestCodeChapterList = 568 private val requestCodeEditSource = 111 @@ -600,6 +601,13 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo */ override fun onDialogDismissed(dialogId: Int) = Unit + override fun onTocRegexDialogResult(tocRegex: String) { + ReadBook.book?.let { + it.tocUrl = tocRegex + viewModel.loadChapterList(it) + } + } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (resultCode == Activity.RESULT_OK) { diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index db7529cab..2ebab7875 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -99,6 +99,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { execute { if (book.isLocalBook()) { AnalyzeTxtFile.analyze(context, book).let { + App.db.bookChapterDao().delByBook(book.bookUrl) App.db.bookChapterDao().insert(*it.toTypedArray()) App.db.bookDao().update(book) ReadBook.chapterSize = it.size diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/TocRegexDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/TocRegexDialog.kt index 10ca38a5b..ba9b23a44 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/TocRegexDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/TocRegexDialog.kt @@ -12,6 +12,7 @@ import androidx.appcompat.widget.Toolbar import androidx.fragment.app.FragmentManager import androidx.lifecycle.LiveData import androidx.lifecycle.Observer +import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import io.legado.app.App @@ -44,7 +45,7 @@ class TocRegexDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { private lateinit var adapter: TocRegexAdapter private var tocRegexLiveData: LiveData>? = null var selectedName: String? = null - var durRegex: String? = null + private var durRegex: String? = null override fun onStart() { super.onStart() @@ -80,6 +81,20 @@ class TocRegexDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { val itemTouchCallback = ItemTouchCallback() itemTouchCallback.onItemTouchCallbackListener = adapter itemTouchCallback.isCanDrag = true + ItemTouchHelper(itemTouchCallback).attachToRecyclerView(recycler_view) + tv_cancel.onClick { + dismiss() + } + tv_ok.onClick { + adapter.getItems().forEach { tocRule -> + if (selectedName == tocRule.name) { + val callBack = activity as? CallBack + callBack?.onTocRegexDialogResult(tocRule.rule) + dismiss() + return@onClick + } + } + } } private fun initData() { @@ -138,14 +153,14 @@ class TocRegexDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { rootView?.let { tocRule.name = tv_rule_name.text.toString() tocRule.rule = tv_rule_regex.text.toString() - saveRule(rule, tocRule) + saveRule(tocRule, rule) } } cancelButton() }.show().applyTint() } - private fun saveRule(oldRule: TxtTocRule?, rule: TxtTocRule) { + private fun saveRule(rule: TxtTocRule, oldRule: TxtTocRule? = null) { launch(IO) { if (rule.serialNumber < 0) { rule.serialNumber = adapter.getItems().lastOrNull()?.serialNumber ?: 0 + 1 @@ -181,6 +196,16 @@ class TocRegexDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { updateItems(0, itemCount - 1, true) } } + swt_enabled.setOnCheckedChangeListener { buttonView, isChecked -> + if (buttonView.isPressed) { + getItem(holder.layoutPosition)?.let { + it.enable = isChecked + launch(IO) { + App.db.txtTocRule().update(it) + } + } + } + } iv_edit.onClick { editRule(getItem(holder.layoutPosition)) } @@ -228,4 +253,8 @@ class TocRegexDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener { } } + interface CallBack { + fun onTocRegexDialogResult(tocRegex: String) {} + } + } \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_toc_regex_edit.xml b/app/src/main/res/layout/dialog_toc_regex_edit.xml index 13abef871..07c0816a4 100644 --- a/app/src/main/res/layout/dialog_toc_regex_edit.xml +++ b/app/src/main/res/layout/dialog_toc_regex_edit.xml @@ -2,7 +2,10 @@ + android:layout_height="match_parent" + android:paddingTop="10dp" + android:paddingStart="10dp" + android:paddingEnd="10dp">