优化
This commit is contained in:
@@ -1,6 +1,11 @@
|
|||||||
package io.legado.app.data.dao
|
package io.legado.app.data.dao
|
||||||
|
|
||||||
import androidx.room.*
|
import androidx.room.Dao
|
||||||
|
import androidx.room.Delete
|
||||||
|
import androidx.room.Insert
|
||||||
|
import androidx.room.OnConflictStrategy
|
||||||
|
import androidx.room.Query
|
||||||
|
import androidx.room.Update
|
||||||
import io.legado.app.constant.BookType
|
import io.legado.app.constant.BookType
|
||||||
import io.legado.app.data.entities.Book
|
import io.legado.app.data.entities.Book
|
||||||
import io.legado.app.data.entities.BookGroup
|
import io.legado.app.data.entities.BookGroup
|
||||||
@@ -79,6 +84,9 @@ interface BookDao {
|
|||||||
@Query("SELECT * FROM books WHERE bookUrl = :bookUrl")
|
@Query("SELECT * FROM books WHERE bookUrl = :bookUrl")
|
||||||
fun getBook(bookUrl: String): Book?
|
fun getBook(bookUrl: String): Book?
|
||||||
|
|
||||||
|
@Query("SELECT * FROM books WHERE bookUrl = :bookUrl")
|
||||||
|
fun getBookFlow(bookUrl: String): Flow<Book?>
|
||||||
|
|
||||||
@Query("SELECT * FROM books WHERE name = :name and author = :author")
|
@Query("SELECT * FROM books WHERE name = :name and author = :author")
|
||||||
fun getBook(name: String, author: String): Book?
|
fun getBook(name: String, author: String): Book?
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import io.legado.app.model.webBook.WebBook
|
|||||||
import io.legado.app.service.BaseReadAloudService
|
import io.legado.app.service.BaseReadAloudService
|
||||||
import io.legado.app.ui.book.read.page.entities.TextChapter
|
import io.legado.app.ui.book.read.page.entities.TextChapter
|
||||||
import io.legado.app.ui.book.read.page.provider.ChapterProvider
|
import io.legado.app.ui.book.read.page.provider.ChapterProvider
|
||||||
|
import io.legado.app.utils.LogUtils
|
||||||
import io.legado.app.utils.stackTraceStr
|
import io.legado.app.utils.stackTraceStr
|
||||||
import io.legado.app.utils.toastOnUi
|
import io.legado.app.utils.toastOnUi
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
@@ -208,6 +209,7 @@ object ReadBook : CoroutineScope by MainScope() {
|
|||||||
prevTextChapter = curTextChapter
|
prevTextChapter = curTextChapter
|
||||||
curTextChapter = nextTextChapter
|
curTextChapter = nextTextChapter
|
||||||
nextTextChapter = null
|
nextTextChapter = null
|
||||||
|
LogUtils.d("moveToNextChapter", "title ${curTextChapter?.chapter?.title}")
|
||||||
if (curTextChapter == null) {
|
if (curTextChapter == null) {
|
||||||
AppLog.putDebug("moveToNextChapter-章节未加载,开始加载")
|
AppLog.putDebug("moveToNextChapter-章节未加载,开始加载")
|
||||||
callBack?.upContent()
|
callBack?.upContent()
|
||||||
@@ -238,6 +240,7 @@ object ReadBook : CoroutineScope by MainScope() {
|
|||||||
nextTextChapter = curTextChapter
|
nextTextChapter = curTextChapter
|
||||||
curTextChapter = prevTextChapter
|
curTextChapter = prevTextChapter
|
||||||
prevTextChapter = null
|
prevTextChapter = null
|
||||||
|
LogUtils.d("moveToPrevChapter", "title ${curTextChapter?.chapter?.title}")
|
||||||
if (curTextChapter == null) {
|
if (curTextChapter == null) {
|
||||||
callBack?.upContent()
|
callBack?.upContent()
|
||||||
loadContent(durChapterIndex, upContent, resetPageOffset = false)
|
loadContent(durChapterIndex, upContent, resetPageOffset = false)
|
||||||
@@ -535,7 +538,10 @@ object ReadBook : CoroutineScope by MainScope() {
|
|||||||
book.getUseReplaceRule()
|
book.getUseReplaceRule()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
LogUtils.d("saveRead", "dur ${book.durChapterTitle}")
|
||||||
}
|
}
|
||||||
|
LogUtils.d("bookDao", "saveRead update latest ${book.latestChapterTitle}")
|
||||||
|
LogUtils.d("bookDao", "saveRead update dur ${book.durChapterTitle}")
|
||||||
appDb.bookDao.update(book)
|
appDb.bookDao.update(book)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,11 +10,27 @@ import androidx.preference.Preference
|
|||||||
import androidx.preference.PreferenceFragmentCompat
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
import io.legado.app.R
|
import io.legado.app.R
|
||||||
import io.legado.app.constant.AppConst.appInfo
|
import io.legado.app.constant.AppConst.appInfo
|
||||||
|
import io.legado.app.constant.AppLog
|
||||||
import io.legado.app.help.AppUpdate
|
import io.legado.app.help.AppUpdate
|
||||||
|
import io.legado.app.help.config.AppConfig
|
||||||
|
import io.legado.app.help.coroutine.Coroutine
|
||||||
import io.legado.app.ui.widget.dialog.TextDialog
|
import io.legado.app.ui.widget.dialog.TextDialog
|
||||||
import io.legado.app.ui.widget.dialog.WaitDialog
|
import io.legado.app.ui.widget.dialog.WaitDialog
|
||||||
import io.legado.app.utils.*
|
import io.legado.app.utils.FileDoc
|
||||||
|
import io.legado.app.utils.createFileIfNotExist
|
||||||
|
import io.legado.app.utils.createFolderIfNotExist
|
||||||
|
import io.legado.app.utils.delete
|
||||||
|
import io.legado.app.utils.find
|
||||||
|
import io.legado.app.utils.list
|
||||||
|
import io.legado.app.utils.openInputStream
|
||||||
|
import io.legado.app.utils.openOutputStream
|
||||||
|
import io.legado.app.utils.openUrl
|
||||||
|
import io.legado.app.utils.sendMail
|
||||||
|
import io.legado.app.utils.sendToClip
|
||||||
|
import io.legado.app.utils.showDialogFragment
|
||||||
|
import io.legado.app.utils.toastOnUi
|
||||||
import splitties.init.appCtx
|
import splitties.init.appCtx
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
class AboutFragment : PreferenceFragmentCompat() {
|
class AboutFragment : PreferenceFragmentCompat() {
|
||||||
|
|
||||||
@@ -44,6 +60,7 @@ class AboutFragment : PreferenceFragmentCompat() {
|
|||||||
"privacyPolicy" -> showMdFile(getString(R.string.privacy_policy), "privacyPolicy.md")
|
"privacyPolicy" -> showMdFile(getString(R.string.privacy_policy), "privacyPolicy.md")
|
||||||
"gzGzh" -> requireContext().sendToClip(getString(R.string.legado_gzh))
|
"gzGzh" -> requireContext().sendToClip(getString(R.string.legado_gzh))
|
||||||
"crashLog" -> showDialogFragment<CrashLogsDialog>()
|
"crashLog" -> showDialogFragment<CrashLogsDialog>()
|
||||||
|
"saveLog" -> saveLog()
|
||||||
}
|
}
|
||||||
return super.onPreferenceTreeClick(preference)
|
return super.onPreferenceTreeClick(preference)
|
||||||
}
|
}
|
||||||
@@ -99,4 +116,31 @@ class AboutFragment : PreferenceFragmentCompat() {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun saveLog() {
|
||||||
|
Coroutine.async {
|
||||||
|
val backupPath = AppConfig.backupPath ?: let {
|
||||||
|
toastOnUi("未设置备份目录")
|
||||||
|
return@async
|
||||||
|
}
|
||||||
|
val files = FileDoc.fromFile(File(appCtx.externalCacheDir, "logs")).list()
|
||||||
|
if (files.isNullOrEmpty()) {
|
||||||
|
toastOnUi("没有日志")
|
||||||
|
return@async
|
||||||
|
}
|
||||||
|
val doc = FileDoc.fromUri(Uri.parse(backupPath), true)
|
||||||
|
doc.find("logs")?.delete()
|
||||||
|
val logsDoc = doc.createFolderIfNotExist("logs")
|
||||||
|
files.forEach { file ->
|
||||||
|
file.openInputStream().getOrNull()?.use { input ->
|
||||||
|
logsDoc.createFileIfNotExist(file.name).openOutputStream().getOrNull()?.use {
|
||||||
|
input.copyTo(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
toastOnUi("已保存至备份目录")
|
||||||
|
}.onError {
|
||||||
|
AppLog.put("保存日志出错\n${it.localizedMessage}", it, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -53,6 +53,7 @@ import io.legado.app.ui.widget.dialog.VariableDialog
|
|||||||
import io.legado.app.ui.widget.dialog.WaitDialog
|
import io.legado.app.ui.widget.dialog.WaitDialog
|
||||||
import io.legado.app.utils.ColorUtils
|
import io.legado.app.utils.ColorUtils
|
||||||
import io.legado.app.utils.GSON
|
import io.legado.app.utils.GSON
|
||||||
|
import io.legado.app.utils.LogUtils
|
||||||
import io.legado.app.utils.StartActivityContract
|
import io.legado.app.utils.StartActivityContract
|
||||||
import io.legado.app.utils.dpToPx
|
import io.legado.app.utils.dpToPx
|
||||||
import io.legado.app.utils.gone
|
import io.legado.app.utils.gone
|
||||||
@@ -300,6 +301,7 @@ class BookInfoActivity :
|
|||||||
|
|
||||||
private fun showBook(book: Book) = binding.run {
|
private fun showBook(book: Book) = binding.run {
|
||||||
showCover(book)
|
showCover(book)
|
||||||
|
LogUtils.d("showBook", "latest ${book.latestChapterTitle}")
|
||||||
tvName.text = book.name
|
tvName.text = book.name
|
||||||
tvAuthor.text = getString(R.string.author_show, book.getRealAuthor())
|
tvAuthor.text = getString(R.string.author_show, book.getRealAuthor())
|
||||||
tvOrigin.text = getString(R.string.origin_show, book.originName)
|
tvOrigin.text = getString(R.string.origin_show, book.originName)
|
||||||
@@ -340,6 +342,8 @@ class BookInfoActivity :
|
|||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
book?.let {
|
book?.let {
|
||||||
|
LogUtils.d("upLoading", "latest ${it.latestChapterTitle}")
|
||||||
|
LogUtils.d("upLoading", "dur ${it.durChapterTitle}")
|
||||||
binding.tvToc.text = getString(R.string.toc_s, it.durChapterTitle)
|
binding.tvToc.text = getString(R.string.toc_s, it.durChapterTitle)
|
||||||
binding.tvLasted.text = getString(R.string.lasted_show, it.latestChapterTitle)
|
binding.tvLasted.text = getString(R.string.lasted_show, it.latestChapterTitle)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,12 +33,14 @@ import io.legado.app.model.analyzeRule.AnalyzeUrl
|
|||||||
import io.legado.app.model.localBook.LocalBook
|
import io.legado.app.model.localBook.LocalBook
|
||||||
import io.legado.app.model.webBook.WebBook
|
import io.legado.app.model.webBook.WebBook
|
||||||
import io.legado.app.utils.ArchiveUtils
|
import io.legado.app.utils.ArchiveUtils
|
||||||
|
import io.legado.app.utils.LogUtils
|
||||||
import io.legado.app.utils.UrlUtil
|
import io.legado.app.utils.UrlUtil
|
||||||
import io.legado.app.utils.isContentScheme
|
import io.legado.app.utils.isContentScheme
|
||||||
import io.legado.app.utils.postEvent
|
import io.legado.app.utils.postEvent
|
||||||
import io.legado.app.utils.toastOnUi
|
import io.legado.app.utils.toastOnUi
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers.IO
|
import kotlinx.coroutines.Dispatchers.IO
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
class BookInfoViewModel(application: Application) : BaseViewModel(application) {
|
class BookInfoViewModel(application: Application) : BaseViewModel(application) {
|
||||||
val bookData = MutableLiveData<Book>()
|
val bookData = MutableLiveData<Book>()
|
||||||
@@ -57,6 +59,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
val bookUrl = intent.getStringExtra("bookUrl") ?: ""
|
val bookUrl = intent.getStringExtra("bookUrl") ?: ""
|
||||||
appDb.bookDao.getBook(name, author)?.let {
|
appDb.bookDao.getBook(name, author)?.let {
|
||||||
inBookshelf = true
|
inBookshelf = true
|
||||||
|
LogUtils.d("BookInfoViewModel initData", "book ${it.name}")
|
||||||
upBook(it)
|
upBook(it)
|
||||||
return@execute
|
return@execute
|
||||||
}
|
}
|
||||||
@@ -89,6 +92,16 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
|
|
||||||
private fun upBook(book: Book) {
|
private fun upBook(book: Book) {
|
||||||
execute {
|
execute {
|
||||||
|
launch {
|
||||||
|
appDb.bookDao.getBookFlow(book.bookUrl).collect { book ->
|
||||||
|
book?.let {
|
||||||
|
LogUtils.d("getBookFlow", "name ${it.name}")
|
||||||
|
LogUtils.d("getBookFlow", "use replace ${it.getUseReplaceRule()}")
|
||||||
|
LogUtils.d("getBookFlow", "latest ${it.latestChapterTitle}")
|
||||||
|
LogUtils.d("getBookFlow", "dur ${it.durChapterTitle}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
bookData.postValue(book)
|
bookData.postValue(book)
|
||||||
upCoverByRule(book)
|
upCoverByRule(book)
|
||||||
bookSource = if (book.isLocal) null else
|
bookSource = if (book.isLocal) null else
|
||||||
@@ -109,12 +122,14 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
private fun upCoverByRule(book: Book) {
|
private fun upCoverByRule(book: Book) {
|
||||||
execute {
|
execute {
|
||||||
if (book.coverUrl.isNullOrBlank() && book.customCoverUrl.isNullOrBlank()) {
|
if (book.coverUrl.isNullOrBlank() && book.customCoverUrl.isNullOrBlank()) {
|
||||||
BookCover.searchCover(book)?.let { coverUrl ->
|
val coverUrl = BookCover.searchCover(book)
|
||||||
book.customCoverUrl = coverUrl
|
if (coverUrl.isNullOrBlank()) {
|
||||||
bookData.postValue(book)
|
return@execute
|
||||||
if (inBookshelf) {
|
}
|
||||||
saveBook(book)
|
book.customCoverUrl = coverUrl
|
||||||
}
|
bookData.postValue(book)
|
||||||
|
if (inBookshelf) {
|
||||||
|
saveBook(book)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1140,4 +1140,5 @@
|
|||||||
<string name="adjust_chapter_index">调整章节位置</string>
|
<string name="adjust_chapter_index">调整章节位置</string>
|
||||||
<string name="clear_webview_data_success">清除成功,3秒后自动重启应用</string>
|
<string name="clear_webview_data_success">清除成功,3秒后自动重启应用</string>
|
||||||
<string name="key_page_on_long_press">按键长按翻页</string>
|
<string name="key_page_on_long_press">按键长按翻页</string>
|
||||||
|
<string name="save_log">保存日志</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1143,4 +1143,5 @@
|
|||||||
<string name="adjust_chapter_index">调整章节位置</string>
|
<string name="adjust_chapter_index">调整章节位置</string>
|
||||||
<string name="clear_webview_data_success">清除成功,3秒后自动重启应用</string>
|
<string name="clear_webview_data_success">清除成功,3秒后自动重启应用</string>
|
||||||
<string name="key_page_on_long_press">按键长按翻页</string>
|
<string name="key_page_on_long_press">按键长按翻页</string>
|
||||||
|
<string name="save_log">保存日志</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1143,4 +1143,5 @@
|
|||||||
<string name="adjust_chapter_index">调整章节位置</string>
|
<string name="adjust_chapter_index">调整章节位置</string>
|
||||||
<string name="clear_webview_data_success">清除成功,3秒后自动重启应用</string>
|
<string name="clear_webview_data_success">清除成功,3秒后自动重启应用</string>
|
||||||
<string name="key_page_on_long_press">按键长按翻页</string>
|
<string name="key_page_on_long_press">按键长按翻页</string>
|
||||||
|
<string name="save_log">保存日志</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1139,4 +1139,5 @@ Còn </string>
|
|||||||
<string name="adjust_chapter_index">调整章节位置</string>
|
<string name="adjust_chapter_index">调整章节位置</string>
|
||||||
<string name="clear_webview_data_success">清除成功,3秒后自动重启应用</string>
|
<string name="clear_webview_data_success">清除成功,3秒后自动重启应用</string>
|
||||||
<string name="key_page_on_long_press">按键长按翻页</string>
|
<string name="key_page_on_long_press">按键长按翻页</string>
|
||||||
|
<string name="save_log">保存日志</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1140,4 +1140,5 @@
|
|||||||
<string name="adjust_chapter_index">调整章节位置</string>
|
<string name="adjust_chapter_index">调整章节位置</string>
|
||||||
<string name="clear_webview_data_success">清除成功,3秒后自动重启应用</string>
|
<string name="clear_webview_data_success">清除成功,3秒后自动重启应用</string>
|
||||||
<string name="key_page_on_long_press">按键长按翻页</string>
|
<string name="key_page_on_long_press">按键长按翻页</string>
|
||||||
|
<string name="save_log">保存日志</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1142,4 +1142,5 @@
|
|||||||
<string name="adjust_chapter_index">调整章节位置</string>
|
<string name="adjust_chapter_index">调整章节位置</string>
|
||||||
<string name="clear_webview_data_success">清除成功,3秒后自动重启应用</string>
|
<string name="clear_webview_data_success">清除成功,3秒后自动重启应用</string>
|
||||||
<string name="key_page_on_long_press">按键长按翻页</string>
|
<string name="key_page_on_long_press">按键长按翻页</string>
|
||||||
|
<string name="save_log">保存日志</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1142,4 +1142,5 @@
|
|||||||
<string name="adjust_chapter_index">调整章节位置</string>
|
<string name="adjust_chapter_index">调整章节位置</string>
|
||||||
<string name="clear_webview_data_success">清除成功,3秒后自动重启应用</string>
|
<string name="clear_webview_data_success">清除成功,3秒后自动重启应用</string>
|
||||||
<string name="key_page_on_long_press">按键长按翻页</string>
|
<string name="key_page_on_long_press">按键长按翻页</string>
|
||||||
|
<string name="save_log">保存日志</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1143,4 +1143,5 @@
|
|||||||
<string name="adjust_chapter_index">Adjust of chapter index</string>
|
<string name="adjust_chapter_index">Adjust of chapter index</string>
|
||||||
<string name="clear_webview_data_success">Cleared successfully, automatically restarts the application after 3 seconds</string>
|
<string name="clear_webview_data_success">Cleared successfully, automatically restarts the application after 3 seconds</string>
|
||||||
<string name="key_page_on_long_press">Press and hold the key to turn the page</string>
|
<string name="key_page_on_long_press">Press and hold the key to turn the page</string>
|
||||||
|
<string name="save_log">保存日志</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -34,6 +34,11 @@
|
|||||||
android:title="@string/crash_log"
|
android:title="@string/crash_log"
|
||||||
app:iconSpaceReserved="false" />
|
app:iconSpaceReserved="false" />
|
||||||
|
|
||||||
|
<io.legado.app.lib.prefs.Preference
|
||||||
|
android:key="saveLog"
|
||||||
|
android:title="@string/save_log"
|
||||||
|
app:iconSpaceReserved="false" />
|
||||||
|
|
||||||
<io.legado.app.lib.prefs.Preference
|
<io.legado.app.lib.prefs.Preference
|
||||||
android:key="privacyPolicy"
|
android:key="privacyPolicy"
|
||||||
android:title="@string/privacy_policy"
|
android:title="@string/privacy_policy"
|
||||||
|
|||||||
Reference in New Issue
Block a user