Horis 3 лет назад
Родитель
Сommit
767e57423d

+ 3 - 0
app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt

@@ -1014,6 +1014,9 @@ class ReadBookActivity : BaseReadBookActivity(),
             binding.searchMenu.invalidate()
             binding.searchMenu.invisible()
             binding.readView.isTextSelected = false
+            ReadBook.curTextChapter?.clearSearchResult()
+            ReadBook.prevTextChapter?.clearSearchResult()
+            ReadBook.nextTextChapter?.clearSearchResult()
             binding.readView.curPage.cancelSelect(true)
         }
     }

+ 12 - 4
app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt

@@ -530,7 +530,8 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
         val textPos = TextPos(0, 0, 0)
         for (relativePos in 0..last) {
             textPos.relativePagePos = relativePos
-            for ((lineIndex, textLine) in relativePage(relativePos).lines.withIndex()) {
+            val textPage = relativePage(relativePos)
+            for ((lineIndex, textLine) in textPage.lines.withIndex()) {
                 textPos.lineIndex = lineIndex
                 for ((charIndex, column) in textLine.columns.withIndex()) {
                     textPos.columnIndex = charIndex
@@ -539,6 +540,9 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
                             textPos.compare(selectStart) >= 0 && textPos.compare(selectEnd) <= 0
                         column.isSearchResult =
                             column.selected && callBack.isSelectingSearchResult
+                        if (column.isSearchResult) {
+                            textPage.searchResult.add(column)
+                        }
                     }
                 }
             }
@@ -558,14 +562,18 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
         }
     }
 
-    fun cancelSelect(fromSearchExit: Boolean = false) {
+    fun cancelSelect(clearSearchResult: Boolean = false) {
         val last = if (callBack.isScroll) 2 else 0
         for (relativePos in 0..last) {
-            relativePage(relativePos).lines.forEach { textLine ->
+            val textPage = relativePage(relativePos)
+            textPage.lines.forEach { textLine ->
                 textLine.columns.forEach {
                     if (it is TextColumn) {
                         it.selected = false
-                        if (fromSearchExit) it.isSearchResult = false
+                        if (clearSearchResult) {
+                            it.isSearchResult = false
+                            textPage.searchResult.remove(it)
+                        }
                     }
                 }
             }

+ 2 - 2
app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt

@@ -372,8 +372,8 @@ class PageView(context: Context) : FrameLayout(context) {
         binding.contentTextView.selectEndMoveIndex(relativePagePos, lineIndex, charIndex)
     }
 
-    fun cancelSelect(fromSearchExit: Boolean = false) {
-        binding.contentTextView.cancelSelect(fromSearchExit)
+    fun cancelSelect(clearSearchResult: Boolean = false) {
+        binding.contentTextView.cancelSelect(clearSearchResult)
     }
 
     fun createBookmark(): Bookmark? {

+ 12 - 1
app/src/main/java/io/legado/app/ui/book/read/page/entities/TextChapter.kt

@@ -126,4 +126,15 @@ data class TextChapter(
         }
         return pages.lastIndex
     }
-}
+
+    fun clearSearchResult() {
+        pages.forEach { page ->
+            page.searchResult.forEach {
+                it.selected = false
+                it.isSearchResult = false
+            }
+            page.searchResult.clear()
+        }
+    }
+
+}

+ 1 - 0
app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt

@@ -33,6 +33,7 @@ data class TextPage(
     val lines: List<TextLine> get() = textLines
     val lineSize: Int get() = textLines.size
     val charSize: Int get() = text.length
+    val searchResult = hashSetOf<TextColumn>()
     var isMsgPage: Boolean = false
 
     fun addLine(line: TextLine) {

+ 7 - 5
app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentActivity.kt

@@ -52,11 +52,11 @@ class SearchContentActivity :
         binding.tvCurrentSearchInfo.setTextColor(btc)
         binding.ivSearchContentTop.setColorFilter(btc)
         binding.ivSearchContentBottom.setColorFilter(btc)
-        initSearchView()
+        val searchResultList = IntentData.get<List<SearchResult>>("searchResultList")
+        val noSearchResult = searchResultList == null
+        initSearchView(!noSearchResult)
         initRecyclerView()
         initView()
-        val searchResultList = IntentData.get<List<SearchResult>>("searchResultList")
-        val submit = searchResultList == null
         intent.getStringExtra("bookUrl")?.let { bookUrl ->
             viewModel.initBook(bookUrl) {
                 searchResultList?.let {
@@ -66,16 +66,17 @@ class SearchContentActivity :
                     val position = intent.getIntExtra("searchResultIndex", 0)
                     binding.recyclerView.scrollToPosition(position)
                 }
-                initBook(submit)
+                initBook(noSearchResult)
             }
         }
     }
 
-    private fun initSearchView() {
+    private fun initSearchView(clearFocus: Boolean) {
         searchView.applyTint(primaryTextColor)
         searchView.onActionViewExpanded()
         searchView.isSubmitButtonEnabled = true
         searchView.queryHint = getString(R.string.search)
+        if (clearFocus) searchView.clearFocus()
         searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
             override fun onQueryTextSubmit(query: String): Boolean {
                 startContentSearch(query.trim())
@@ -197,6 +198,7 @@ class SearchContentActivity :
         get() = viewModel.book?.isLocal == true
 
     override fun openSearchResult(searchResult: SearchResult, index: Int) {
+        searchJob?.cancel()
         postEvent(EventBus.SEARCH_RESULT, viewModel.searchResultList as List<SearchResult>)
         val searchData = Intent()
         val key = System.currentTimeMillis()