From a31ed9d631292f970b7cd7087458f83ddcd6f7ec Mon Sep 17 00:00:00 2001 From: Horis <821938089@qq.com> Date: Wed, 2 Nov 2022 12:52:51 +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 --- .../java/io/legado/app/help/book/BookHelp.kt | 8 +++---- .../main/java/io/legado/app/model/ReadBook.kt | 2 ++ .../io/legado/app/model/localBook/EpubFile.kt | 2 +- .../app/ui/book/read/BaseReadBookActivity.kt | 22 ++++++++++++------- .../app/ui/book/read/ReadBookActivity.kt | 14 +++++++----- .../app/ui/book/read/ReadBookViewModel.kt | 3 ++- .../app/ui/book/toc/ChapterListAdapter.kt | 13 +++++------ .../io/legado/app/ui/book/toc/TocActivity.kt | 1 + 8 files changed, 37 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/book/BookHelp.kt b/app/src/main/java/io/legado/app/help/book/BookHelp.kt index 00a2a3b25..6681c7d67 100644 --- a/app/src/main/java/io/legado/app/help/book/BookHelp.kt +++ b/app/src/main/java/io/legado/app/help/book/BookHelp.kt @@ -1,6 +1,5 @@ package io.legado.app.help.book -import android.net.Uri import androidx.documentfile.provider.DocumentFile import io.legado.app.constant.AppLog import io.legado.app.constant.AppPattern @@ -17,6 +16,7 @@ import kotlinx.coroutines.Dispatchers.IO import org.apache.commons.text.similarity.JaccardSimilarity import splitties.init.appCtx import java.io.File +import java.io.FileNotFoundException import java.io.FileOutputStream import java.io.IOException import java.util.concurrent.CopyOnWriteArraySet @@ -141,7 +141,7 @@ object BookHelp { val bytes = analyzeUrl.getByteArrayAwait() //某些图片被加密,需要进一步解密 ImageUtils.decode( - src, bytes, isCover = false, bookSource, book + src, bytes, isCover = false, bookSource, book )?.let { FileUtils.createFileIfNotExist( downloadDir, @@ -177,9 +177,9 @@ object BookHelp { return suffix } - @Throws(IOException::class) + @Throws(IOException::class, FileNotFoundException::class) fun getEpubFile(book: Book): ZipFile { - val uri = Uri.parse(book.bookUrl) + val uri = book.getLocalUri() if (uri.isContentScheme()) { FileUtils.createFolderIfNotExist(downloadDir, cacheEpubFolderName) val path = FileUtils.getPath(downloadDir, cacheEpubFolderName, book.originName) diff --git a/app/src/main/java/io/legado/app/model/ReadBook.kt b/app/src/main/java/io/legado/app/model/ReadBook.kt index ed749c688..9f9a8222c 100644 --- a/app/src/main/java/io/legado/app/model/ReadBook.kt +++ b/app/src/main/java/io/legado/app/model/ReadBook.kt @@ -501,6 +501,8 @@ object ReadBook : CoroutineScope by MainScope() { fun upPageAnim() fun exit() + + fun notifyBookChanged() } } diff --git a/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt b/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt index 78a5b0426..b47b6a98d 100644 --- a/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt @@ -112,7 +112,7 @@ class EpubFile(var book: Book) { }.onFailure { AppLog.put("读取Epub文件失败\n${it.localizedMessage}", it) it.printOnDebug() - }.getOrNull() + }.getOrThrow() } private fun getContent(chapter: BookChapter): String? { diff --git a/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt index df6d01744..88ae2f465 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt @@ -46,9 +46,13 @@ abstract class BaseReadBookActivity : override val viewModel by viewModels() var bottomDialog = 0 private val selectBookFolderResult = registerForActivityResult(HandleFileContract()) { - it.uri?.let { + it.uri?.let { uri -> ReadBook.book?.let { book -> - viewModel.loadChapterList(book) + FileDoc.fromUri(uri, true).find(book.originName)?.let { doc -> + book.bookUrl = doc.uri.toString() + book.save() + viewModel.loadChapterList(book) + } ?: ReadBook.upMsg("找不到文件") } } ?: ReadBook.upMsg("没有权限访问") } @@ -123,11 +127,12 @@ abstract class BaseReadBookActivity : if (toolBarHide) { setLightStatusBar(ReadBookConfig.durConfig.curStatusIconDark()) } else { - val statusBarColor = if (AppConfig.readBarStyleFollowPage && ReadBookConfig.durConfig.curBgType() == 0) { - ReadBookConfig.bgMeanColor - } else { - ThemeStore.statusBarColor(this, AppConfig.isTransparentStatusBar) - } + val statusBarColor = + if (AppConfig.readBarStyleFollowPage && ReadBookConfig.durConfig.curBgType() == 0) { + ReadBookConfig.bgMeanColor + } else { + ThemeStore.statusBarColor(this, AppConfig.isTransparentStatusBar) + } setLightStatusBar(ColorUtils.isColorLight(statusBarColor)) } } @@ -202,7 +207,8 @@ abstract class BaseReadBookActivity : * 保持亮屏 */ fun keepScreenOn(on: Boolean) { - val isScreenOn = (window.attributes.flags and WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) != 0 + val isScreenOn = + (window.attributes.flags and WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) != 0 if (on == isScreenOn) return if (on) { window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) 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 056eacc02..66d49f53b 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 @@ -167,7 +167,7 @@ class ReadBookActivity : BaseReadBookActivity(), private val menuLayoutIsVisible get() = bottomDialog > 0 || binding.readMenu.isVisible private val nextPageRunnable by lazy { Runnable { mouseWheelPage(PageDirection.NEXT) } } private val prevPageRunnable by lazy { Runnable { mouseWheelPage(PageDirection.PREV) } } - private var isFirstResume = true + private var bookChanged = false //恢复跳转前进度对话框的交互结果 private var confirmRestoreProcess: Boolean? = null @@ -181,6 +181,7 @@ class ReadBookActivity : BaseReadBookActivity(), binding.cursorRight.setOnTouchListener(this) window.setBackgroundDrawable(null) upScreenTimeOut() + ReadBook.callBack?.notifyBookChanged() ReadBook.callBack = this } @@ -204,8 +205,8 @@ class ReadBookActivity : BaseReadBookActivity(), override fun onResume() { super.onResume() ReadBook.readStartTime = System.currentTimeMillis() - val bookUrl = intent.getStringExtra("bookUrl") - if (!isFirstResume && ReadBook.book?.bookUrl != bookUrl) { + if (bookChanged) { + bookChanged = false ReadBook.callBack = this viewModel.initData(intent) } else { @@ -218,9 +219,6 @@ class ReadBookActivity : BaseReadBookActivity(), upSystemUiVisibility() registerReceiver(timeBatteryReceiver, timeBatteryReceiver.filter) binding.readView.upTime() - if (isFirstResume) { - isFirstResume = false - } } override fun onPause() { @@ -788,6 +786,10 @@ class ReadBookActivity : BaseReadBookActivity(), } ?: super.finish() } + override fun notifyBookChanged() { + bookChanged = true + } + /** * 页面改变 */ 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 04bfa3865..654998725 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 @@ -36,6 +36,7 @@ import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch import java.io.File import java.io.FileInputStream +import java.io.FileNotFoundException import java.io.FileOutputStream /** @@ -144,7 +145,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { } }.onError { when (it) { - is SecurityException -> { + is SecurityException, is FileNotFoundException -> { permissionDenialLiveData.postValue(1) } else -> { diff --git a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListAdapter.kt b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListAdapter.kt index af0877f92..3dee78617 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListAdapter.kt @@ -18,11 +18,8 @@ import io.legado.app.utils.getCompatColor import io.legado.app.utils.gone import io.legado.app.utils.longToastOnUi import io.legado.app.utils.visible -import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.* import kotlinx.coroutines.Dispatchers.Main -import kotlinx.coroutines.async -import kotlinx.coroutines.ensureActive -import kotlinx.coroutines.withContext import java.util.concurrent.ConcurrentHashMap class ChapterListAdapter(context: Context, val callback: Callback) : @@ -75,7 +72,7 @@ class ChapterListAdapter(context: Context, val callback: Callback) : val replaceRules = ContentProcessor.get(book.name, book.origin).getTitleReplaceRules() val useReplace = AppConfig.tocUiUseReplace && book.getUseReplaceRule() val items = getItems() - async { + launch { for (i in startIndex until items.size) { val item = items[i] if (displayTitleMap[item.title] == null) { @@ -88,8 +85,8 @@ class ChapterListAdapter(context: Context, val callback: Callback) : } } } - }.start() - async { + } + launch { for (i in startIndex downTo 0) { val item = items[i] if (displayTitleMap[item.title] == null) { @@ -102,7 +99,7 @@ class ChapterListAdapter(context: Context, val callback: Callback) : } } } - }.start() + } } } diff --git a/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt b/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt index da4ae0f4d..78a99b08d 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt @@ -45,6 +45,7 @@ class TocActivity : VMBaseActivity() { tabLayout.setSelectedTabIndicatorColor(accentColor) binding.viewPager.adapter = TabFragmentPageAdapter() tabLayout.setupWithViewPager(binding.viewPager) + tabLayout.tabGravity = TabLayout.GRAVITY_CENTER viewModel.bookData.observe(this) { menu?.setGroupVisible(R.id.menu_group_text, it.isLocalTxt) }