Просмотр исходного кода

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

* 调整页脚章节标题位置

* 修复章节切换问题

* 增加刷新

* 调整屏幕滚动问题

* ...

* 修复图片过长滚动问题

* ...
lhjgege 1 год назад
Родитель
Сommit
3e8438df5f

+ 0 - 1
app/src/main/java/io/legado/app/constant/PreferKey.kt

@@ -98,7 +98,6 @@ object PreferKey {
     const val mangaPreDownloadNum = "mangaPreDownloadNum"
     const val mangaPreDownloadNum = "mangaPreDownloadNum"
     const val mangaAutoPageSpeed = "mangaAutoPageSpeed"
     const val mangaAutoPageSpeed = "mangaAutoPageSpeed"
     const val mangaFooterConfig = "mangaFooterConfig"
     const val mangaFooterConfig = "mangaFooterConfig"
-    const val singlePageScroll = "singlePageScroll"
     const val disableClickScroll = "disableClickScroll"
     const val disableClickScroll = "disableClickScroll"
     const val enableMangaHorizontalScroll = "enableMangaHorizontalScroll"
     const val enableMangaHorizontalScroll = "enableMangaHorizontalScroll"
     const val autoRefresh = "auto_refresh"
     const val autoRefresh = "auto_refresh"

+ 0 - 7
app/src/main/java/io/legado/app/help/config/AppConfig.kt

@@ -623,13 +623,6 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
             appCtx.putPrefInt(PreferKey.mangaPreDownloadNum, value)
             appCtx.putPrefInt(PreferKey.mangaPreDownloadNum, value)
         }
         }
 
 
-    //单页滚动
-    var singlePageScroll
-        get() = appCtx.getPrefBoolean(PreferKey.singlePageScroll, false)
-        set(value) {
-            appCtx.putPrefBoolean(PreferKey.singlePageScroll, value)
-        }
-
     //点击翻页
     //点击翻页
     var disableClickScroll
     var disableClickScroll
         get() = appCtx.getPrefBoolean(PreferKey.disableClickScroll, false)
         get() = appCtx.getPrefBoolean(PreferKey.disableClickScroll, false)

+ 5 - 2
app/src/main/java/io/legado/app/model/ReadManga.kt

@@ -74,10 +74,10 @@ object ReadManga : CoroutineScope by MainScope() {
             val book = book ?: return@execute
             val book = book ?: return@execute
             book.lastCheckCount = 0
             book.lastCheckCount = 0
             book.durChapterTime = System.currentTimeMillis()
             book.durChapterTime = System.currentTimeMillis()
-            val chapterChanged = book.durChapterIndex != durChapterPagePos
+            val changed = book.durChapterIndex != durChapterPagePos
             book.durChapterIndex = durChapterPagePos
             book.durChapterIndex = durChapterPagePos
             book.durChapterPos = durChapterPos
             book.durChapterPos = durChapterPos
-            if (!pageChanged || chapterChanged) {
+            if (!pageChanged || changed) {
                 appDb.bookChapterDao.getChapter(book.bookUrl, durChapterPagePos)?.let {
                 appDb.bookChapterDao.getChapter(book.bookUrl, durChapterPagePos)?.let {
                     book.durChapterTitle = it.getDisplayTitle(
                     book.durChapterTitle = it.getDisplayTitle(
                         ContentProcessor.get(book.name, book.origin).getTitleReplaceRules(),
                         ContentProcessor.get(book.name, book.origin).getTitleReplaceRules(),
@@ -209,6 +209,9 @@ object ReadManga : CoroutineScope by MainScope() {
     fun loadContent(
     fun loadContent(
         index: Int,
         index: Int,
     ) {
     ) {
+        if (chapterChanged) {
+            removeLoading(index)
+        }
         if (addLoading(index)) {
         if (addLoading(index)) {
             Coroutine.async {
             Coroutine.async {
                 val book = book!!
                 val book = book!!

+ 10 - 0
app/src/main/java/io/legado/app/ui/book/manga/MangaViewModel.kt

@@ -246,4 +246,14 @@ class MangaViewModel(application: Application) : BaseViewModel(application) {
         super.onCleared()
         super.onCleared()
         changeSourceCoroutine?.cancel()
         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)
+                }
+        }
+    }
 }
 }

+ 49 - 59
app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt

@@ -10,14 +10,12 @@ import android.os.Looper
 import android.view.KeyEvent
 import android.view.KeyEvent
 import android.view.Menu
 import android.view.Menu
 import android.view.MenuItem
 import android.view.MenuItem
-import android.view.View
 import android.view.WindowManager
 import android.view.WindowManager
 import androidx.activity.viewModels
 import androidx.activity.viewModels
 import androidx.appcompat.app.AlertDialog
 import androidx.appcompat.app.AlertDialog
 import androidx.core.view.isGone
 import androidx.core.view.isGone
 import androidx.core.view.isVisible
 import androidx.core.view.isVisible
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.LinearSmoothScroller
 import androidx.recyclerview.widget.PagerSnapHelper
 import androidx.recyclerview.widget.PagerSnapHelper
 import androidx.recyclerview.widget.RecyclerView
 import androidx.recyclerview.widget.RecyclerView
 import com.bumptech.glide.Glide
 import com.bumptech.glide.Glide
@@ -82,13 +80,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
     private val mAdapter: MangaAdapter by lazy {
     private val mAdapter: MangaAdapter by lazy {
         MangaAdapter(this@ReadMangaActivity)
         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 {
     private val mSizeProvider by lazy {
         FixedPreloadSizeProvider<Any>(
         FixedPreloadSizeProvider<Any>(
@@ -96,7 +87,9 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
         )
         )
     }
     }
 
 
-    private var mPagerSnapHelper: PagerSnapHelper? = null
+    private val mPagerSnapHelper: PagerSnapHelper by lazy {
+        PagerSnapHelper()
+    }
 
 
     private var mDisableAutoScrollPage = false
     private var mDisableAutoScrollPage = false
     private val mInitMangaAutoPageSpeed by lazy {
     private val mInitMangaAutoPageSpeed by lazy {
@@ -201,7 +194,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
             mLayoutManager.isItemPrefetchEnabled = true
             mLayoutManager.isItemPrefetchEnabled = true
             setItemViewCacheSize(AppConfig.preDownloadNum)
             setItemViewCacheSize(AppConfig.preDownloadNum)
             singlePagerScroller(
             singlePagerScroller(
-                AppConfig.singlePageScroll,
                 AppConfig.enableMangaHorizontalScroll
                 AppConfig.enableMangaHorizontalScroll
             )
             )
             disabledClickScroller(AppConfig.disableClickScroll)
             disabledClickScroller(AppConfig.disableClickScroll)
@@ -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 -> {
             R.id.menu_pre_manga_number -> {
                 showNumberPickerDialog(
                 showNumberPickerDialog(
                     0,
                     0,
@@ -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 -> {
             R.id.menu_disable_manga_scale -> {
                 item.isChecked = !item.isChecked
                 item.isChecked = !item.isChecked
                 AppConfig.disableMangaScale = item.isChecked
                 AppConfig.disableMangaScale = item.isChecked
@@ -535,7 +528,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
                 AppConfig.enableMangaHorizontalScroll = item.isChecked
                 AppConfig.enableMangaHorizontalScroll = item.isChecked
                 mLayoutManager.orientation =
                 mLayoutManager.orientation =
                     if (item.isChecked) LinearLayoutManager.HORIZONTAL else LinearLayoutManager.VERTICAL
                     if (item.isChecked) LinearLayoutManager.HORIZONTAL else LinearLayoutManager.VERTICAL
-                singlePagerScroller(AppConfig.singlePageScroll, item.isChecked)
+                singlePagerScroller(item.isChecked)
                 mAdapter.isHorizontal = item.isChecked
                 mAdapter.isHorizontal = item.isChecked
                 mAdapter.notifyItemRangeChanged(
                 mAdapter.notifyItemRangeChanged(
                     ReadManga.durChapterPos.minus(2),
                     ReadManga.durChapterPos.minus(2),
@@ -587,26 +580,11 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
         binding.mRecyclerMange.addOnScrollListener(mRecyclerViewPreloader!!)
         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 {
         } else {
-            mPagerSnapHelper?.attachToRecyclerView(null)
+            mPagerSnapHelper.attachToRecyclerView(null)
         }
         }
     }
     }
 
 
@@ -615,7 +593,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
         this.mMenu = menu
         this.mMenu = menu
         menu.findItem(R.id.menu_pre_manga_number).title =
         menu.findItem(R.id.menu_pre_manga_number).title =
             getString(R.string.pre_download_m, AppConfig.mangaPreDownloadNum)
             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_manga_scale).isChecked = AppConfig.disableMangaScale
         menu.findItem(R.id.menu_disable_click_scroller).isChecked = AppConfig.disableClickScroll
         menu.findItem(R.id.menu_disable_click_scroller).isChecked = AppConfig.disableClickScroll
         menu.findItem(R.id.menu_manga_auto_page_speed).title =
         menu.findItem(R.id.menu_manga_auto_page_speed).title =
@@ -646,34 +623,35 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
     }
     }
 
 
     private fun scrollToNext() {
     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
             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() {
     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
             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() {
     private fun startAutoPage() {
@@ -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)
+    }
 }
 }

+ 6 - 7
app/src/main/res/menu/book_manga.xml

@@ -11,6 +11,12 @@
             android:title="@string/change_origin"
             android:title="@string/change_origin"
             app:showAsAction="always" />
             app:showAsAction="always" />
 
 
+        <item
+            android:id="@+id/menu_refresh"
+            android:icon="@drawable/ic_refresh_black_24dp"
+            android:title="@string/refresh"
+            app:showAsAction="always" />
+
         <item
         <item
             android:id="@+id/menu_catalog"
             android:id="@+id/menu_catalog"
             android:icon="@drawable/ic_toc"
             android:icon="@drawable/ic_toc"
@@ -24,13 +30,6 @@
         android:title="@string/pre_download"
         android:title="@string/pre_download"
         app:showAsAction="never" />
         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
     <item
         android:id="@+id/menu_disable_manga_scale"
         android:id="@+id/menu_disable_manga_scale"
         android:checkable="true"
         android:checkable="true"

+ 0 - 1
app/src/main/res/values-es-rES/strings.xml

@@ -821,7 +821,6 @@
     <string name="import_bookshelf">Importar lista de libros</string>
     <string name="import_bookshelf">Importar lista de libros</string>
     <string name="pre_download">Descarga anterior</string>
     <string name="pre_download">Descarga anterior</string>
     <string name="pre_download_m">预下载%s页</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="pre_download_s">Descargue %s capítulos antes</string>
     <string name="is_enabled">Está habilitado</string>
     <string name="is_enabled">Está habilitado</string>
     <string name="background_image">Imagen de fondo</string>
     <string name="background_image">Imagen de fondo</string>

+ 0 - 1
app/src/main/res/values-ja-rJP/strings.xml

@@ -824,7 +824,6 @@
     <string name="import_bookshelf">Import the list of books</string>
     <string name="import_bookshelf">Import the list of books</string>
     <string name="pre_download">Download in advance</string>
     <string name="pre_download">Download in advance</string>
     <string name="pre_download_m">预下载%s页</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="pre_download_s">Download %s chapters in advance</string>
     <string name="is_enabled">Is enabled</string>
     <string name="is_enabled">Is enabled</string>
     <string name="background_image">Background image</string>
     <string name="background_image">Background image</string>

+ 0 - 1
app/src/main/res/values-pt-rBR/strings.xml

@@ -822,7 +822,6 @@
     <string name="import_bookshelf">Importar a lista de livros</string>
     <string name="import_bookshelf">Importar a lista de livros</string>
     <string name="pre_download">Baixar antecipadamente</string>
     <string name="pre_download">Baixar antecipadamente</string>
     <string name="pre_download_m">预下载%s页</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="pre_download_s">Baixar %s capítulos antecipadamente</string>
     <string name="is_enabled">Está ativado</string>
     <string name="is_enabled">Está ativado</string>
     <string name="background_image">Imagem de fundo</string>
     <string name="background_image">Imagem de fundo</string>

+ 0 - 1
app/src/main/res/values-vi/strings.xml

@@ -823,7 +823,6 @@ Còn </string>
     <string name="import_bookshelf">Nhập bookshelf</string>
     <string name="import_bookshelf">Nhập bookshelf</string>
     <string name="pre_download">Tải xuống trước</string>
     <string name="pre_download">Tải xuống trước</string>
     <string name="pre_download_m">预下载%s页</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="pre_download_s">Tải xuống trước %s chương</string>
     <string name="is_enabled">Đã bật</string>
     <string name="is_enabled">Đã bật</string>
     <string name="background_image">Ảnh nền</string>
     <string name="background_image">Ảnh nền</string>

+ 0 - 1
app/src/main/res/values-zh-rHK/strings.xml

@@ -822,7 +822,6 @@
     <string name="import_bookshelf">導入書單</string>
     <string name="import_bookshelf">導入書單</string>
     <string name="pre_download">預下載</string>
     <string name="pre_download">預下載</string>
     <string name="pre_download_m">預下載%s页</string>
     <string name="pre_download_m">預下載%s页</string>
-    <string name="single_page_scroller">单页滚动</string>
     <string name="pre_download_s">預先下載%s章正文</string>
     <string name="pre_download_s">預先下載%s章正文</string>
     <string name="is_enabled">係咪啟用</string>
     <string name="is_enabled">係咪啟用</string>
     <string name="background_image">背景圖片</string>
     <string name="background_image">背景圖片</string>

+ 0 - 1
app/src/main/res/values-zh-rTW/strings.xml

@@ -825,7 +825,6 @@
     <string name="import_bookshelf">匯入書單</string>
     <string name="import_bookshelf">匯入書單</string>
     <string name="pre_download">預下載</string>
     <string name="pre_download">預下載</string>
     <string name="pre_download_m">预下载%s页</string>
     <string name="pre_download_m">预下载%s页</string>
-    <string name="single_page_scroller">单页滚动</string>
     <string name="pre_download_s">預先下載%s章正文</string>
     <string name="pre_download_s">預先下載%s章正文</string>
     <string name="is_enabled">是否啟用</string>
     <string name="is_enabled">是否啟用</string>
     <string name="background_image">背景圖片</string>
     <string name="background_image">背景圖片</string>

+ 0 - 1
app/src/main/res/values-zh/strings.xml

@@ -827,7 +827,6 @@
     <string name="export_bookshelf">导出书单</string>
     <string name="export_bookshelf">导出书单</string>
     <string name="import_bookshelf">导入书单</string>
     <string name="import_bookshelf">导入书单</string>
     <string name="pre_download">预下载</string>
     <string name="pre_download">预下载</string>
-    <string name="single_page_scroller">单页滚动</string>
     <string name="pre_download_m">预下载%s页</string>
     <string name="pre_download_m">预下载%s页</string>
     <string name="pre_download_s">预先下载 %s 章正文</string>
     <string name="pre_download_s">预先下载 %s 章正文</string>
     <string name="is_enabled">是否启用</string>
     <string name="is_enabled">是否启用</string>

+ 0 - 1
app/src/main/res/values/strings.xml

@@ -829,7 +829,6 @@
     <string name="import_bookshelf">Import the list of books</string>
     <string name="import_bookshelf">Import the list of books</string>
     <string name="pre_download">Download in advance</string>
     <string name="pre_download">Download in advance</string>
     <string name="pre_download_m">Pre-download %s pages</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="pre_download_s">Download %s chapters in advance</string>
     <string name="is_enabled">Is enabled</string>
     <string name="is_enabled">Is enabled</string>
     <string name="background_image">Background image</string>
     <string name="background_image">Background image</string>