Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

增加刷新,修复切换章节 #4784

Merged
merged 8 commits into from
Mar 4, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion app/src/main/java/io/legado/app/constant/PreferKey.kt
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,6 @@ object PreferKey {
const val mangaPreDownloadNum = "mangaPreDownloadNum"
const val mangaAutoPageSpeed = "mangaAutoPageSpeed"
const val mangaFooterConfig = "mangaFooterConfig"
const val singlePageScroll = "singlePageScroll"
const val disableClickScroll = "disableClickScroll"
const val enableMangaHorizontalScroll = "enableMangaHorizontalScroll"
const val autoRefresh = "auto_refresh"
Expand Down
7 changes: 0 additions & 7 deletions app/src/main/java/io/legado/app/help/config/AppConfig.kt
Original file line number Diff line number Diff line change
Expand Up @@ -623,13 +623,6 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
appCtx.putPrefInt(PreferKey.mangaPreDownloadNum, value)
}

//单页滚动
var singlePageScroll
get() = appCtx.getPrefBoolean(PreferKey.singlePageScroll, false)
set(value) {
appCtx.putPrefBoolean(PreferKey.singlePageScroll, value)
}

//点击翻页
var disableClickScroll
get() = appCtx.getPrefBoolean(PreferKey.disableClickScroll, false)
Expand Down
7 changes: 5 additions & 2 deletions app/src/main/java/io/legado/app/model/ReadManga.kt
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,10 @@ object ReadManga : CoroutineScope by MainScope() {
val book = book ?: return@execute
book.lastCheckCount = 0
book.durChapterTime = System.currentTimeMillis()
val chapterChanged = book.durChapterIndex != durChapterPagePos
val changed = book.durChapterIndex != durChapterPagePos
book.durChapterIndex = durChapterPagePos
book.durChapterPos = durChapterPos
if (!pageChanged || chapterChanged) {
if (!pageChanged || changed) {
appDb.bookChapterDao.getChapter(book.bookUrl, durChapterPagePos)?.let {
book.durChapterTitle = it.getDisplayTitle(
ContentProcessor.get(book.name, book.origin).getTitleReplaceRules(),
Expand Down Expand Up @@ -209,6 +209,9 @@ object ReadManga : CoroutineScope by MainScope() {
fun loadContent(
index: Int,
) {
if (chapterChanged) {
removeLoading(index)
}
if (addLoading(index)) {
Coroutine.async {
val book = book!!
Expand Down
10 changes: 10 additions & 0 deletions app/src/main/java/io/legado/app/ui/book/manga/MangaViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -246,4 +246,14 @@ class MangaViewModel(application: Application) : BaseViewModel(application) {
super.onCleared()
changeSourceCoroutine?.cancel()
}

fun refreshContentDur(book: Book) {
execute {
appDb.bookChapterDao.getChapter(book.bookUrl, ReadManga.durChapterPagePos)
?.let { chapter ->
BookHelp.delContent(book, chapter)
openChapter(ReadManga.durChapterPagePos, ReadManga.durChapterPos)
}
}
}
}
108 changes: 49 additions & 59 deletions app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,12 @@ import android.os.Looper
import android.view.KeyEvent
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.view.WindowManager
import androidx.activity.viewModels
import androidx.appcompat.app.AlertDialog
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.LinearSmoothScroller
import androidx.recyclerview.widget.PagerSnapHelper
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
Expand Down Expand Up @@ -82,21 +80,16 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
private val mAdapter: MangaAdapter by lazy {
MangaAdapter(this@ReadMangaActivity)
}
private val mSmoothScroller by lazy {
object : LinearSmoothScroller(this@ReadMangaActivity) {
override fun getVerticalSnapPreference(): Int {
return SNAP_TO_START
}
}
}

private val mSizeProvider by lazy {
FixedPreloadSizeProvider<Any>(
this@ReadMangaActivity.resources.displayMetrics.widthPixels, SIZE_ORIGINAL
)
}

private var mPagerSnapHelper: PagerSnapHelper? = null
private val mPagerSnapHelper: PagerSnapHelper by lazy {
PagerSnapHelper()
}

private var mDisableAutoScrollPage = false
private val mInitMangaAutoPageSpeed by lazy {
Expand Down Expand Up @@ -201,7 +194,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
mLayoutManager.isItemPrefetchEnabled = true
setItemViewCacheSize(AppConfig.preDownloadNum)
singlePagerScroller(
AppConfig.singlePageScroll,
AppConfig.enableMangaHorizontalScroll
)
disabledClickScroller(AppConfig.disableClickScroll)
Expand Down Expand Up @@ -473,6 +465,13 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
}
}

R.id.menu_refresh -> {
binding.flLoading.isVisible = true
ReadManga.book?.let {
viewModel.refreshContentDur(it)
}
}

R.id.menu_pre_manga_number -> {
showNumberPickerDialog(
0,
Expand All @@ -485,12 +484,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
}
}

R.id.menu_scroller_page -> {
item.isChecked = !item.isChecked
AppConfig.singlePageScroll = item.isChecked
singlePagerScroller(item.isChecked, AppConfig.enableMangaHorizontalScroll)
}

R.id.menu_disable_manga_scale -> {
item.isChecked = !item.isChecked
AppConfig.disableMangaScale = item.isChecked
Expand Down Expand Up @@ -535,7 +528,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
AppConfig.enableMangaHorizontalScroll = item.isChecked
mLayoutManager.orientation =
if (item.isChecked) LinearLayoutManager.HORIZONTAL else LinearLayoutManager.VERTICAL
singlePagerScroller(AppConfig.singlePageScroll, item.isChecked)
singlePagerScroller(item.isChecked)
mAdapter.isHorizontal = item.isChecked
mAdapter.notifyItemRangeChanged(
ReadManga.durChapterPos.minus(2),
Expand Down Expand Up @@ -587,26 +580,11 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
binding.mRecyclerMange.addOnScrollListener(mRecyclerViewPreloader!!)
}

private fun singlePagerScroller(enableSingleScroll: Boolean, enableHorizontalScroll: Boolean) {
if (enableSingleScroll) {
mPagerSnapHelper?.attachToRecyclerView(null)
mPagerSnapHelper = if (enableHorizontalScroll) {
PagerSnapHelper()
} else {
object : PagerSnapHelper() {
override fun calculateDistanceToFinalSnap(
layoutManager: RecyclerView.LayoutManager,
targetView: View,
): IntArray {
val out = IntArray(2)
out[1] = targetView.top - binding.mRecyclerMange.paddingTop
return out
}
}
}
mPagerSnapHelper?.attachToRecyclerView(binding.mRecyclerMange)
private fun singlePagerScroller(enableHorizontalScroll: Boolean) {
if (enableHorizontalScroll) {
mPagerSnapHelper.attachToRecyclerView(binding.mRecyclerMange)
} else {
mPagerSnapHelper?.attachToRecyclerView(null)
mPagerSnapHelper.attachToRecyclerView(null)
}
}

Expand All @@ -615,7 +593,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
this.mMenu = menu
menu.findItem(R.id.menu_pre_manga_number).title =
getString(R.string.pre_download_m, AppConfig.mangaPreDownloadNum)
menu.findItem(R.id.menu_scroller_page).isChecked = AppConfig.singlePageScroll
menu.findItem(R.id.menu_disable_manga_scale).isChecked = AppConfig.disableMangaScale
menu.findItem(R.id.menu_disable_click_scroller).isChecked = AppConfig.disableClickScroll
menu.findItem(R.id.menu_manga_auto_page_speed).title =
Expand Down Expand Up @@ -646,34 +623,35 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
}

private fun scrollToNext() {
val lastCompletelyVisiblePosition = mLayoutManager.findLastCompletelyVisibleItemPosition()
val nextPosition = if (lastCompletelyVisiblePosition != RecyclerView.NO_POSITION) {
lastCompletelyVisiblePosition + 1
} else {
mLayoutManager.findFirstVisibleItemPosition() + 1
}
if (nextPosition > mAdapter.getCurrentList().lastIndex) {
if (binding.mRecyclerMange.isAtBottom()) {
return
}
smoothScrollToPosition(nextPosition)
val (dx, dy) = if (AppConfig.enableMangaHorizontalScroll) {
val width =
binding.mRecyclerMange.width - binding.mRecyclerMange.paddingStart - binding.mRecyclerMange.paddingEnd
Pair(width, 0)
} else {
val height =
binding.mRecyclerMange.height - binding.mRecyclerMange.paddingTop - binding.mRecyclerMange.paddingBottom
Pair(0, height)
}
binding.mRecyclerMange.smoothScrollBy(dx, dy, null)
}

private fun scrollToPrev() {
val firstCompletelyVisiblePosition = mLayoutManager.findFirstCompletelyVisibleItemPosition()
val prevPosition = if (firstCompletelyVisiblePosition != RecyclerView.NO_POSITION) {
firstCompletelyVisiblePosition - 1
} else {
mLayoutManager.findFirstVisibleItemPosition() - 1
}
if (prevPosition < 0) {
if (binding.mRecyclerMange.isAtTop()) {
return
}
smoothScrollToPosition(prevPosition)
}

private fun smoothScrollToPosition(position: Int) {
mSmoothScroller.targetPosition = position
mLayoutManager.startSmoothScroll(mSmoothScroller)
val (dx, dy) = if (AppConfig.enableMangaHorizontalScroll) {
val width =
binding.mRecyclerMange.width - binding.mRecyclerMange.paddingStart - binding.mRecyclerMange.paddingEnd
Pair(width, 0)
} else {
val height =
binding.mRecyclerMange.height - binding.mRecyclerMange.paddingTop - binding.mRecyclerMange.paddingBottom
Pair(0, height)
}
binding.mRecyclerMange.smoothScrollBy(-dx, -dy, null)
}

private fun startAutoPage() {
Expand Down Expand Up @@ -724,4 +702,16 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
}
}
}

private fun RecyclerView.isAtTop(): Boolean {
return (mLayoutManager.findFirstCompletelyVisibleItemPosition() == 0) && !canScrollVertically(
-1
)
}

private fun RecyclerView.isAtBottom(): Boolean {
val adapter = adapter ?: return false
return (mLayoutManager.findLastCompletelyVisibleItemPosition() == adapter.itemCount - 1) &&
!canScrollVertically(1)
}
}
13 changes: 6 additions & 7 deletions app/src/main/res/menu/book_manga.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@
android:title="@string/change_origin"
app:showAsAction="always" />

<item
android:id="@+id/menu_refresh"
android:icon="@drawable/ic_refresh_black_24dp"
android:title="@string/refresh"
app:showAsAction="always" />

<item
android:id="@+id/menu_catalog"
android:icon="@drawable/ic_toc"
Expand All @@ -24,13 +30,6 @@
android:title="@string/pre_download"
app:showAsAction="never" />

<item
android:id="@+id/menu_scroller_page"
android:checkable="true"
android:checked="false"
android:title="@string/single_page_scroller"
app:showAsAction="never" />

<item
android:id="@+id/menu_disable_manga_scale"
android:checkable="true"
Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/values-es-rES/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -821,7 +821,6 @@
<string name="import_bookshelf">Importar lista de libros</string>
<string name="pre_download">Descarga anterior</string>
<string name="pre_download_m">预下载%s页</string>
<string name="single_page_scroller">单页滚动</string>
<string name="pre_download_s">Descargue %s capítulos antes</string>
<string name="is_enabled">Está habilitado</string>
<string name="background_image">Imagen de fondo</string>
Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/values-ja-rJP/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -824,7 +824,6 @@
<string name="import_bookshelf">Import the list of books</string>
<string name="pre_download">Download in advance</string>
<string name="pre_download_m">预下载%s页</string>
<string name="single_page_scroller">单页滚动</string>
<string name="pre_download_s">Download %s chapters in advance</string>
<string name="is_enabled">Is enabled</string>
<string name="background_image">Background image</string>
Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/values-pt-rBR/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -822,7 +822,6 @@
<string name="import_bookshelf">Importar a lista de livros</string>
<string name="pre_download">Baixar antecipadamente</string>
<string name="pre_download_m">预下载%s页</string>
<string name="single_page_scroller">单页滚动</string>
<string name="pre_download_s">Baixar %s capítulos antecipadamente</string>
<string name="is_enabled">Está ativado</string>
<string name="background_image">Imagem de fundo</string>
Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/values-vi/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -823,7 +823,6 @@ Còn </string>
<string name="import_bookshelf">Nhập bookshelf</string>
<string name="pre_download">Tải xuống trước</string>
<string name="pre_download_m">预下载%s页</string>
<string name="single_page_scroller">单页滚动</string>
<string name="pre_download_s">Tải xuống trước %s chương</string>
<string name="is_enabled">Đã bật</string>
<string name="background_image">Ảnh nền</string>
Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/values-zh-rHK/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -822,7 +822,6 @@
<string name="import_bookshelf">導入書單</string>
<string name="pre_download">預下載</string>
<string name="pre_download_m">預下載%s页</string>
<string name="single_page_scroller">单页滚动</string>
<string name="pre_download_s">預先下載%s章正文</string>
<string name="is_enabled">係咪啟用</string>
<string name="background_image">背景圖片</string>
Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/values-zh-rTW/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -825,7 +825,6 @@
<string name="import_bookshelf">匯入書單</string>
<string name="pre_download">預下載</string>
<string name="pre_download_m">预下载%s页</string>
<string name="single_page_scroller">单页滚动</string>
<string name="pre_download_s">預先下載%s章正文</string>
<string name="is_enabled">是否啟用</string>
<string name="background_image">背景圖片</string>
Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/values-zh/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -827,7 +827,6 @@
<string name="export_bookshelf">导出书单</string>
<string name="import_bookshelf">导入书单</string>
<string name="pre_download">预下载</string>
<string name="single_page_scroller">单页滚动</string>
<string name="pre_download_m">预下载%s页</string>
<string name="pre_download_s">预先下载 %s 章正文</string>
<string name="is_enabled">是否启用</string>
Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -829,7 +829,6 @@
<string name="import_bookshelf">Import the list of books</string>
<string name="pre_download">Download in advance</string>
<string name="pre_download_m">Pre-download %s pages</string>
<string name="single_page_scroller">Single Page Scroller</string>
<string name="pre_download_s">Download %s chapters in advance</string>
<string name="is_enabled">Is enabled</string>
<string name="background_image">Background image</string>
Expand Down