diff --git a/app/src/main/java/io/legato/kazusa/ui/book/toc/BookmarkAdapter.kt b/app/src/main/java/io/legato/kazusa/ui/book/toc/BookmarkAdapter.kt index 6f24f7792..d002e56b5 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/toc/BookmarkAdapter.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/toc/BookmarkAdapter.kt @@ -41,11 +41,17 @@ class BookmarkAdapter(context: Context, val callback: Callback) : callback.onClick(bookmark) } } + binding.btnLocate.onClick { + getItem(holder.layoutPosition)?.let { bookmark -> + callback.onLocate(bookmark) + } + } } interface Callback { fun onClick(bookmark: Bookmark) fun onLongClick(bookmark: Bookmark, pos: Int) + fun onLocate(bookmark: Bookmark) } } \ No newline at end of file diff --git a/app/src/main/java/io/legato/kazusa/ui/book/toc/BookmarkFragment.kt b/app/src/main/java/io/legato/kazusa/ui/book/toc/BookmarkFragment.kt index fb52396c0..02292896a 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/toc/BookmarkFragment.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/toc/BookmarkFragment.kt @@ -12,10 +12,8 @@ import io.legato.kazusa.constant.AppLog import io.legato.kazusa.data.appDb import io.legato.kazusa.data.entities.Bookmark import io.legato.kazusa.databinding.FragmentBookmarkBinding -//import io.legado.app.lib.theme.primaryColor import io.legato.kazusa.ui.book.bookmark.BookmarkDialog import io.legato.kazusa.ui.widget.recycler.UpLinearLayoutManager -import io.legato.kazusa.ui.widget.recycler.VerticalDivider import io.legato.kazusa.utils.applyNavigationBarPadding import io.legato.kazusa.utils.showDialogFragment import io.legato.kazusa.utils.viewbindingdelegate.viewBinding @@ -49,10 +47,8 @@ class BookmarkFragment : VMBaseFragment(R.layout.fragment_bookmark private fun initRecyclerView() { //binding.recyclerView.setEdgeEffectColor(primaryColor) binding.recyclerView.layoutManager = mLayoutManager - binding.recyclerView.addItemDecoration(VerticalDivider(requireContext())) binding.recyclerView.adapter = adapter binding.recyclerView.applyNavigationBarPadding() - binding.tvEmptyMsg.visible(false) } @@ -96,4 +92,8 @@ class BookmarkFragment : VMBaseFragment(R.layout.fragment_bookmark showDialogFragment(BookmarkDialog(bookmark, pos)) } + override fun onLocate(bookmark: Bookmark) { + (activity as? TocActivity)?.locateToChapter(bookmark.chapterIndex) + } + } \ No newline at end of file diff --git a/app/src/main/java/io/legato/kazusa/ui/book/toc/ChapterListAdapter.kt b/app/src/main/java/io/legato/kazusa/ui/book/toc/ChapterListAdapter.kt index 0fc7a63c0..fa1c5c003 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/toc/ChapterListAdapter.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/toc/ChapterListAdapter.kt @@ -212,7 +212,7 @@ class ChapterListAdapter( if (selectedIndices.contains(item.index)) { ivVolume.gone() - tvChapterItem.setBackgroundColor(context.themeColor(com.google.android.material.R.attr.colorSurfaceBright)) + tvChapterItem.setBackgroundColor(context.themeColor(com.google.android.material.R.attr.colorSurfaceContainerHighest)) } else { if (item.isVolume) { ivVolume.visible() diff --git a/app/src/main/java/io/legato/kazusa/ui/book/toc/ChapterListFragment.kt b/app/src/main/java/io/legato/kazusa/ui/book/toc/ChapterListFragment.kt index f03d51125..34dc1d763 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/toc/ChapterListFragment.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/toc/ChapterListFragment.kt @@ -1,10 +1,14 @@ package io.legato.kazusa.ui.book.toc +import android.animation.ArgbEvaluator +import android.animation.ValueAnimator import android.annotation.SuppressLint import android.app.Activity.RESULT_OK import android.content.Intent import android.graphics.Canvas +import android.graphics.Color import android.graphics.Rect +import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.transition.TransitionManager import android.view.View @@ -260,6 +264,35 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt } } + fun scrollToChapter(chapterIndex: Int) { + val pos = adapter.getItems().indexOfFirst { it.index == chapterIndex } + if (pos != -1) { + mLayoutManager.scrollToPositionWithOffset(pos, 0) + + binding.recyclerView.post { + val holder = binding.recyclerView.findViewHolderForAdapterPosition(pos) + holder?.itemView?.let { view -> + flashHighlight(view) + } + } + } + } + + private fun flashHighlight(view: View) { + val highlightColor = context?.themeColor(com.google.android.material.R.attr.colorSurfaceContainerHighest) + val originalColor = (view.background as? ColorDrawable)?.color ?: Color.TRANSPARENT + val anim = ValueAnimator.ofObject(ArgbEvaluator(), originalColor, highlightColor, originalColor).apply { + duration = 500 + repeatCount = 1 + repeatMode = ValueAnimator.RESTART + addUpdateListener { animator -> + val color = animator.animatedValue as Int + view.setBackgroundColor(color) + } + } + anim.start() + } + override fun onSelectionModeChanged(enabled: Boolean) { TransitionManager.beginDelayedTransition(binding.coordinatorLayout, MaterialFadeThrough()) diff --git a/app/src/main/java/io/legato/kazusa/ui/book/toc/TocActivity.kt b/app/src/main/java/io/legato/kazusa/ui/book/toc/TocActivity.kt index cf5946854..3acf8ce30 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/toc/TocActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/toc/TocActivity.kt @@ -210,6 +210,15 @@ class TocActivity : VMBaseActivity(), } } + fun locateToChapter(index: Int) { + val tag = "android:switcher:${binding.viewPager.id}:0" + val chapterFragment = supportFragmentManager.findFragmentByTag(tag) as? ChapterListFragment + chapterFragment?.scrollToChapter(index) + + binding.viewPager.currentItem = 0 + } + + @SuppressLint("SetTextI18n") fun showDownloadDialog() { ReadBook.book?.let { book -> diff --git a/app/src/main/res/layout/item_bookmark.xml b/app/src/main/res/layout/item_bookmark.xml index 73324356b..8655d278b 100644 --- a/app/src/main/res/layout/item_bookmark.xml +++ b/app/src/main/res/layout/item_bookmark.xml @@ -1,34 +1,60 @@ - - + - + + - + - \ No newline at end of file + + + + + + \ No newline at end of file