From 70121781ffb3f4e813c80827edb4395cd88581cb Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 21 Feb 2022 20:14:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/help/BookHelp.kt | 21 ------- .../changesource/ChangeBookSourceDialog.kt | 6 +- .../ChangeChapterSourceAdapter.kt | 4 +- .../changesource/ChangeChapterSourceDialog.kt | 12 ++-- .../ChangeChapterSourceViewModel.kt | 6 +- .../app/ui/book/read/ReadBookActivity.kt | 7 +++ .../app/ui/book/read/ReadBookViewModel.kt | 25 +++++++- ...urce.xml => dialog_book_change_source.xml} | 0 .../layout/dialog_chapter_change_source.xml | 58 +++++++++++++++++++ 9 files changed, 104 insertions(+), 35 deletions(-) rename app/src/main/res/layout/{dialog_change_source.xml => dialog_book_change_source.xml} (100%) create mode 100644 app/src/main/res/layout/dialog_chapter_change_source.xml diff --git a/app/src/main/java/io/legado/app/help/BookHelp.kt b/app/src/main/java/io/legado/app/help/BookHelp.kt index fb0b196bb..32d63c03a 100644 --- a/app/src/main/java/io/legado/app/help/BookHelp.kt +++ b/app/src/main/java/io/legado/app/help/BookHelp.kt @@ -226,27 +226,6 @@ object BookHelp { return null } - /** - * 反转章节内容 - */ - fun reverseContent(book: Book, bookChapter: BookChapter) { - if (!book.isLocalBook()) { - val file = downloadDir.getFile( - cacheFolderName, - book.getFolderName(), - bookChapter.getFileName() - ) - if (file.exists()) { - val text = file.readText() - val stringBuilder = StringBuilder() - text.toStringArray().forEach { - stringBuilder.insert(0, it) - } - file.writeText(stringBuilder.toString()) - } - } - } - /** * 删除章节内容 */ diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceDialog.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceDialog.kt index 8ce0638d2..8fb10ec71 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceDialog.kt @@ -19,7 +19,7 @@ import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.SearchBook -import io.legado.app.databinding.DialogChangeSourceBinding +import io.legado.app.databinding.DialogBookChangeSourceBinding import io.legado.app.help.AppConfig import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.book.source.edit.BookSourceEditActivity @@ -31,7 +31,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch -class ChangeBookSourceDialog() : BaseDialogFragment(R.layout.dialog_change_source), +class ChangeBookSourceDialog() : BaseDialogFragment(R.layout.dialog_book_change_source), Toolbar.OnMenuItemClickListener, ChangeBookSourceAdapter.CallBack { @@ -42,7 +42,7 @@ class ChangeBookSourceDialog() : BaseDialogFragment(R.layout.dialog_change_sourc } } - private val binding by viewBinding(DialogChangeSourceBinding::bind) + private val binding by viewBinding(DialogBookChangeSourceBinding::bind) private val groups = linkedSetOf() private val callBack: CallBack? get() = activity as? CallBack private val viewModel: ChangeBookSourceViewModel by viewModels() diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceAdapter.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceAdapter.kt index 597230b56..73a680e53 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceAdapter.kt @@ -74,7 +74,7 @@ class ChangeChapterSourceAdapter( override fun registerListener(holder: ItemViewHolder, binding: ItemChangeSourceBinding) { holder.itemView.setOnClickListener { getItem(holder.layoutPosition)?.let { - callBack.changeTo(it) + callBack.openToc(it) } } holder.itemView.onLongClick { @@ -112,7 +112,7 @@ class ChangeChapterSourceAdapter( interface CallBack { val bookUrl: String? - fun changeTo(searchBook: SearchBook) + fun openToc(searchBook: SearchBook) fun topSource(searchBook: SearchBook) fun bottomSource(searchBook: SearchBook) fun editSource(searchBook: SearchBook) diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceDialog.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceDialog.kt index 06af7d606..03028bb66 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceDialog.kt @@ -19,7 +19,7 @@ import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.SearchBook -import io.legado.app.databinding.DialogChangeSourceBinding +import io.legado.app.databinding.DialogChapterChangeSourceBinding import io.legado.app.help.AppConfig import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.book.source.edit.BookSourceEditActivity @@ -31,7 +31,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch -class ChangeChapterSourceDialog() : BaseDialogFragment(R.layout.dialog_change_source), +class ChangeChapterSourceDialog() : BaseDialogFragment(R.layout.dialog_chapter_change_source), Toolbar.OnMenuItemClickListener, ChangeChapterSourceAdapter.CallBack { @@ -42,7 +42,7 @@ class ChangeChapterSourceDialog() : BaseDialogFragment(R.layout.dialog_change_so } } - private val binding by viewBinding(DialogChangeSourceBinding::bind) + private val binding by viewBinding(DialogChapterChangeSourceBinding::bind) private val groups = linkedSetOf() private val callBack: CallBack? get() = activity as? CallBack private val viewModel: ChangeChapterSourceViewModel by viewModels() @@ -196,9 +196,8 @@ class ChangeChapterSourceDialog() : BaseDialogFragment(R.layout.dialog_change_so return false } - override fun changeTo(searchBook: SearchBook) { - changeSource(searchBook) - dismissAllowingStateLoss() + override fun openToc(searchBook: SearchBook) { + } override val bookUrl: String? @@ -282,6 +281,7 @@ class ChangeChapterSourceDialog() : BaseDialogFragment(R.layout.dialog_change_so interface CallBack { val oldBook: Book? fun changeTo(source: BookSource, book: Book) + fun replaceContent(content: String) } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceViewModel.kt index a78743614..874efbcdd 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceViewModel.kt @@ -11,6 +11,7 @@ import io.legado.app.constant.AppPattern import io.legado.app.constant.PreferKey import io.legado.app.data.appDb import io.legado.app.data.entities.Book +import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.SearchBook import io.legado.app.help.AppConfig @@ -28,6 +29,7 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import splitties.init.appCtx import timber.log.Timber +import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.Executors import kotlin.math.min @@ -35,6 +37,7 @@ import kotlin.math.min class ChangeChapterSourceViewModel(application: Application) : BaseViewModel(application) { private val threadCount = AppConfig.threadCount private var searchPool: ExecutorCoroutineDispatcher? = null + private val searchGroup get() = appCtx.getPrefString("searchGroup") ?: "" val searchStateData = MutableLiveData() var name: String = "" var author: String = "" @@ -42,7 +45,7 @@ class ChangeChapterSourceViewModel(application: Application) : BaseViewModel(app private var screenKey: String = "" private var bookSourceList = arrayListOf() private val searchBooks = ConcurrentHashSet() - private val searchGroup get() = appCtx.getPrefString("searchGroup") ?: "" + private val tocMap = ConcurrentHashMap>() private var searchCallback: SourceCallback? = null val searchDataFlow = callbackFlow { @@ -203,6 +206,7 @@ class ChangeChapterSourceViewModel(application: Application) : BaseViewModel(app private fun loadBookToc(source: BookSource, book: Book) { WebBook.getChapterList(viewModelScope, source, book, context = searchPool!!) .onSuccess(IO) { chapters -> + tocMap[book.bookUrl] = chapters book.latestChapterTitle = chapters.last().title val searchBook: SearchBook = book.toSearchBook() searchCallback?.searchSuccess(searchBook) 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 626280270..c8f1233cc 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 @@ -71,6 +71,7 @@ class ReadBookActivity : BaseReadBookActivity(), SearchMenu.CallBack, ReadAloudDialog.CallBack, ChangeBookSourceDialog.CallBack, + ChangeChapterSourceDialog.CallBack, ReadBook.CallBack, AutoReadDialog.CallBack, TocRegexDialog.CallBack, @@ -689,6 +690,12 @@ class ReadBookActivity : BaseReadBookActivity(), viewModel.changeTo(source, book) } + override fun replaceContent(content: String) { + ReadBook.book?.let { + viewModel.saveContent(it, content) + } + } + override fun showActionMenu() { when { BaseReadAloudService.isRun -> showReadAloudDialog() 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 d4ebe3679..035cf77f6 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 @@ -27,6 +27,7 @@ import io.legado.app.ui.book.read.page.entities.TextChapter import io.legado.app.ui.book.searchContent.SearchResult import io.legado.app.utils.msg import io.legado.app.utils.postEvent +import io.legado.app.utils.toStringArray import io.legado.app.utils.toastOnUi import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.ensureActive @@ -283,16 +284,36 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { } } - fun reverseContent(book: Book) { + /** + * 保存内容 + */ + fun saveContent(book: Book, content: String) { execute { appDb.bookChapterDao.getChapter(book.bookUrl, ReadBook.durChapterIndex) ?.let { chapter -> - BookHelp.reverseContent(book, chapter) + BookHelp.saveText(book, chapter, content) ReadBook.loadContent(ReadBook.durChapterIndex, resetPageOffset = false) } } } + /** + * 反转内容 + */ + fun reverseContent(book: Book) { + execute { + val chapter = appDb.bookChapterDao.getChapter(book.bookUrl, ReadBook.durChapterIndex) + ?: return@execute + val content = BookHelp.getContent(book, chapter) ?: return@execute + val stringBuilder = StringBuilder() + content.toStringArray().forEach { + stringBuilder.insert(0, it) + } + BookHelp.saveText(book, chapter, stringBuilder.toString()) + ReadBook.loadContent(ReadBook.durChapterIndex, resetPageOffset = false) + } + } + /** * 内容搜索跳转 */ diff --git a/app/src/main/res/layout/dialog_change_source.xml b/app/src/main/res/layout/dialog_book_change_source.xml similarity index 100% rename from app/src/main/res/layout/dialog_change_source.xml rename to app/src/main/res/layout/dialog_book_change_source.xml diff --git a/app/src/main/res/layout/dialog_chapter_change_source.xml b/app/src/main/res/layout/dialog_chapter_change_source.xml new file mode 100644 index 000000000..be29362ff --- /dev/null +++ b/app/src/main/res/layout/dialog_chapter_change_source.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file