diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6c95c79ce..d33213e6e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -249,7 +249,7 @@ android:screenOrientation="behind" /> diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 1059ac467..1cee633c9 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -11,6 +11,12 @@ * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。 * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! +**2022/04/07** + +* 实现epub的懒加载 by ag2s20150909 +* 解决txt无法导入 +* 优化换源 + **2022/04/05** * 更新cronet: 100.0.4896.79 diff --git a/app/src/main/java/io/legado/app/constant/AppConst.kt b/app/src/main/java/io/legado/app/constant/AppConst.kt index d8c5b2d00..aed422165 100644 --- a/app/src/main/java/io/legado/app/constant/AppConst.kt +++ b/app/src/main/java/io/legado/app/constant/AppConst.kt @@ -39,6 +39,7 @@ object AppConst { SimpleDateFormat("yy-MM-dd-HH-mm-ss") } + const val rootGroupId = -100L const val bookGroupAllId = -1L const val bookGroupLocalId = -2L const val bookGroupAudioId = -3L diff --git a/app/src/main/java/io/legado/app/data/entities/Book.kt b/app/src/main/java/io/legado/app/data/entities/Book.kt index 8a3a632d5..568778d14 100644 --- a/app/src/main/java/io/legado/app/data/entities/Book.kt +++ b/app/src/main/java/io/legado/app/data/entities/Book.kt @@ -287,10 +287,6 @@ data class Book( newBook.customTag = customTag newBook.canUpdate = canUpdate newBook.readConfig = readConfig - if (appDb.bookDao.has(bookUrl) == true) { - delete() - appDb.bookDao.insert(newBook) - } return newBook } diff --git a/app/src/main/java/io/legado/app/help/config/AppConfig.kt b/app/src/main/java/io/legado/app/help/config/AppConfig.kt index a851ce134..d9a045a2a 100644 --- a/app/src/main/java/io/legado/app/help/config/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/config/AppConfig.kt @@ -276,9 +276,17 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { val autoChangeSource: Boolean get() = appCtx.getPrefBoolean(PreferKey.autoChangeSource, true) - val changeSourceLoadInfo get() = appCtx.getPrefBoolean(PreferKey.changeSourceLoadInfo) + var changeSourceLoadInfo: Boolean + get() = appCtx.getPrefBoolean(PreferKey.changeSourceLoadInfo) + set(value) { + appCtx.putPrefBoolean(PreferKey.changeSourceLoadInfo, value) + } - val changeSourceLoadToc get() = appCtx.getPrefBoolean(PreferKey.changeSourceLoadToc) + var changeSourceLoadToc: Boolean + get() = appCtx.getPrefBoolean(PreferKey.changeSourceLoadToc) + set(value) { + appCtx.putPrefBoolean(PreferKey.changeSourceLoadToc, value) + } val importKeepName get() = appCtx.getPrefBoolean(PreferKey.importKeepName) diff --git a/app/src/main/java/io/legado/app/ui/association/FileAssociationViewModel.kt b/app/src/main/java/io/legado/app/ui/association/FileAssociationViewModel.kt index 3726127ff..403412fd9 100644 --- a/app/src/main/java/io/legado/app/ui/association/FileAssociationViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/association/FileAssociationViewModel.kt @@ -24,34 +24,43 @@ class FileAssociationViewModel(application: Application) : BaseAssociationViewMo @Suppress("BlockingMethodInNonBlockingContext") fun dispatchIndent(uri: Uri, finally: (title: String, msg: String) -> Unit) { execute { + lateinit var fileName: String + lateinit var content: String //如果是普通的url,需要根据返回的内容判断是什么 if (uri.scheme == "file" || uri.scheme == "content") { - val content = if (uri.scheme == "file") { - File(uri.path.toString()).readText() + if (uri.scheme == "file") { + val file = File(uri.path.toString()) + content = file.readText() + fileName = file.name } else { - DocumentFile.fromSingleUri(context, uri)?.readText(context) - } ?: throw NoStackTraceException("文件不存在") + val file = DocumentFile.fromSingleUri(context, uri) + content = file?.readText(context) ?: throw NoStackTraceException("文件不存在") + fileName = file.name ?: "" + } when { - content.isJson() -> when { - content.contains("bookSourceUrl") -> - importBookSourceLive.postValue(content) - content.contains("sourceUrl") -> - importRssSourceLive.postValue(content) - content.contains("pattern") -> - importReplaceRuleLive.postValue(content) - content.contains("themeName") -> - importTheme(content, finally) - content.contains("name") && content.contains("rule") -> - importTextTocRule(content, finally) - content.contains("name") && content.contains("url") -> - importHttpTTS(content, finally) - else -> errorLiveData.postValue("格式不对") + content.isJson() -> { + //暂时根据文件内容判断属于什么 + when { + content.contains("bookSourceUrl") -> + importBookSourceLive.postValue(content) + content.contains("sourceUrl") -> + importRssSourceLive.postValue(content) + content.contains("pattern") -> + importReplaceRuleLive.postValue(content) + content.contains("themeName") -> + importTheme(content, finally) + content.contains("name") && content.contains("rule") -> + importTextTocRule(content, finally) + content.contains("name") && content.contains("url") -> + importHttpTTS(content, finally) + else -> errorLiveData.postValue("格式不对") + } } - (uri.path ?: uri.toString()).matches(bookFileRegex) -> { + fileName.matches(bookFileRegex) -> { importBookLiveData.postValue(uri) } else -> { - throw NoStackTraceException("暂未支持的本地书籍格式(TXT/UMD/EPUB)") + throw NoStackTraceException("$fileName 暂未支持的本地书籍格式(TXT/UMD/EPUB)") } } } else { diff --git a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt index 4f9b53240..778aef4d2 100644 --- a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt @@ -16,6 +16,7 @@ import io.legado.app.constant.BookType import io.legado.app.constant.EventBus import io.legado.app.constant.Status import io.legado.app.constant.Theme +import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookSource @@ -212,6 +213,7 @@ class AudioPlayActivity : launch { withContext(IO) { AudioPlay.book?.changeTo(book, toc) + appDb.bookDao.insert(book) } startActivity { putExtra("bookUrl", book.bookUrl) diff --git a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayViewModel.kt b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayViewModel.kt index 4ea1acad5..4938728a8 100644 --- a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayViewModel.kt @@ -78,7 +78,9 @@ class AudioPlayViewModel(application: Application) : BaseViewModel(application) fun changeTo(source: BookSource, book: Book, toc: List) { execute { - AudioPlay.book = AudioPlay.book!!.changeTo(book, toc) + AudioPlay.book?.changeTo(book, toc) + appDb.bookDao.insert(book) + AudioPlay.book = book AudioPlay.bookSource = source appDb.bookChapterDao.insert(*toc.toTypedArray()) AudioPlay.upDurChapter(book) diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceDialog.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceDialog.kt index 1ebcb9e1b..e0b7be1aa 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceDialog.kt @@ -16,7 +16,6 @@ import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.constant.AppPattern import io.legado.app.constant.EventBus -import io.legado.app.constant.PreferKey import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter @@ -207,12 +206,12 @@ class ChangeBookSourceDialog() : BaseDialogFragment(R.layout.dialog_book_change_ item.isChecked = !item.isChecked viewModel.refresh() } - R.id.menu_load_toc -> { - putPrefBoolean(PreferKey.changeSourceLoadToc, !item.isChecked) + R.id.menu_load_info -> { + AppConfig.changeSourceLoadInfo = !item.isChecked item.isChecked = !item.isChecked } - R.id.menu_load_info -> { - putPrefBoolean(PreferKey.changeSourceLoadInfo, !item.isChecked) + R.id.menu_load_toc -> { + AppConfig.changeSourceLoadToc = !item.isChecked item.isChecked = !item.isChecked } R.id.menu_start_stop -> viewModel.startOrStopSearch() diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt index f3f1985a7..337d6fae9 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt @@ -184,12 +184,11 @@ open class ChangeBookSourceViewModel(application: Application) : BaseViewModel(a } private suspend fun loadBookInfo(scope: CoroutineScope, source: BookSource, book: Book) { - val mBook = WebBook.getBookInfoAwait(scope, source, book) + WebBook.getBookInfoAwait(scope, source, book) if (context.getPrefBoolean(PreferKey.changeSourceLoadToc)) { - loadBookToc(scope, source, mBook) + loadBookToc(scope, source, book) } else { //从详情页里获取最新章节 - book.latestChapterTitle = mBook.latestChapterTitle val searchBook = book.toSearchBook() searchCallback?.searchSuccess(searchBook) } diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceDialog.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceDialog.kt index 21b61822e..fef913c26 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceDialog.kt @@ -16,7 +16,6 @@ import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.constant.AppPattern import io.legado.app.constant.EventBus -import io.legado.app.constant.PreferKey import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter @@ -231,12 +230,12 @@ class ChangeChapterSourceDialog() : BaseDialogFragment(R.layout.dialog_chapter_c item.isChecked = !item.isChecked viewModel.refresh() } - R.id.menu_load_toc -> { - putPrefBoolean(PreferKey.changeSourceLoadToc, !item.isChecked) + R.id.menu_load_info -> { + AppConfig.changeSourceLoadInfo = !item.isChecked item.isChecked = !item.isChecked } - R.id.menu_load_info -> { - putPrefBoolean(PreferKey.changeSourceLoadInfo, !item.isChecked) + R.id.menu_load_toc -> { + AppConfig.changeSourceLoadToc = !item.isChecked item.isChecked = !item.isChecked } R.id.menu_start_stop -> viewModel.startOrStopSearch() diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index 9cf8fa8f5..0efdf63d5 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -270,7 +270,7 @@ class BookInfoActivity : showDialogFragment( ChangeCoverDialog(it.name, it.author) ) - } + } ?: toastOnUi("Book is null") } ivCover.setOnLongClickListener { viewModel.bookData.value?.getDisplayCover()?.let { path -> @@ -281,7 +281,7 @@ class BookInfoActivity : tvRead.setOnClickListener { viewModel.bookData.value?.let { readBook(it) - } + } ?: toastOnUi("Book is null") } tvShelf.setOnClickListener { if (viewModel.inBookshelf) { @@ -297,12 +297,12 @@ class BookInfoActivity : startActivity { putExtra("sourceUrl", it.origin) } - } + } ?: toastOnUi("Book is null") } tvChangeSource.setOnClickListener { - viewModel.bookData.value?.let { - showDialogFragment(ChangeBookSourceDialog(it.name, it.author)) - } + viewModel.bookData.value?.let { book -> + showDialogFragment(ChangeBookSourceDialog(book.name, book.author)) + } ?: toastOnUi("Book is null") } tvTocView.setOnClickListener { if (!viewModel.inBookshelf) { @@ -320,7 +320,7 @@ class BookInfoActivity : showDialogFragment( GroupSelectDialog(it.group) ) - } + } ?: toastOnUi("Book is null") } tvAuthor.setOnClickListener { startActivity { diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt index 2aa8b9277..9eeda4018 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt @@ -39,17 +39,17 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { val bookUrl = intent.getStringExtra("bookUrl") ?: "" appDb.bookDao.getBook(name, author)?.let { inBookshelf = true - setBook(it) + upBook(it) return@execute } if (bookUrl.isNotBlank()) { appDb.searchBookDao.getSearchBook(bookUrl)?.toBook()?.let { - setBook(it) + upBook(it) return@execute } } appDb.searchBookDao.getFirstByNameAuthor(name, author)?.toBook()?.let { - setBook(it) + upBook(it) return@execute } throw NoStackTraceException("未找到书籍") @@ -63,12 +63,12 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { val name = intent.getStringExtra("name") ?: "" val author = intent.getStringExtra("author") ?: "" appDb.bookDao.getBook(name, author)?.let { book -> - setBook(book) + upBook(book) } } } - private fun setBook(book: Book) { + private fun upBook(book: Book) { execute { durChapterIndex = book.durChapterIndex bookData.postValue(book) @@ -176,15 +176,19 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { } } - fun changeTo(source: BookSource, newBook: Book, toc: List) { + fun changeTo(source: BookSource, book: Book, toc: List) { changeSourceCoroutine?.cancel() changeSourceCoroutine = execute { bookSource = source - bookData.value!!.changeTo(newBook, toc) - bookData.postValue(newBook) + bookData.value?.changeTo(book, toc) + if (inBookshelf) { + appDb.bookDao.insert(book) + appDb.bookChapterDao.insert(*toc.toTypedArray()) + } + bookData.postValue(book) chapterListData.postValue(toc) }.onFinally { - postEvent(EventBus.SOURCE_CHANGED, newBook.bookUrl) + postEvent(EventBus.SOURCE_CHANGED, book.bookUrl) } } diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt b/app/src/main/java/io/legado/app/ui/book/manage/BookAdapter.kt similarity index 98% rename from app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt rename to app/src/main/java/io/legado/app/ui/book/manage/BookAdapter.kt index d55938e5c..a7564cf5b 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/manage/BookAdapter.kt @@ -1,4 +1,4 @@ -package io.legado.app.ui.book.arrange +package io.legado.app.ui.book.manage import android.annotation.SuppressLint import android.content.Context @@ -15,7 +15,7 @@ import io.legado.app.lib.theme.backgroundColor import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.ItemTouchCallback -class ArrangeBookAdapter(context: Context, val callBack: CallBack) : +class BookAdapter(context: Context, val callBack: CallBack) : RecyclerAdapter(context), ItemTouchCallback.Callback { diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageActivity.kt similarity index 91% rename from app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt rename to app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageActivity.kt index 85c67d54c..f2dfd4a4f 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageActivity.kt @@ -1,4 +1,4 @@ -package io.legado.app.ui.book.arrange +package io.legado.app.ui.book.manage import android.annotation.SuppressLint import android.os.Bundle @@ -39,19 +39,20 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class ArrangeBookActivity : VMBaseActivity(), +class BookshelfManageActivity : + VMBaseActivity(), PopupMenu.OnMenuItemClickListener, SelectActionBar.CallBack, - ArrangeBookAdapter.CallBack, + BookAdapter.CallBack, SourcePickerDialog.Callback, GroupSelectDialog.CallBack { override val binding by viewBinding(ActivityArrangeBookBinding::inflate) - override val viewModel by viewModels() + override val viewModel by viewModels() override val groupList: ArrayList = arrayListOf() private val groupRequestCode = 22 private val addToGroupRequestCode = 34 - private val adapter by lazy { ArrangeBookAdapter(this, this) } + private val adapter by lazy { BookAdapter(this, this) } private var booksFlowJob: Job? = null private var menu: Menu? = null private var groupId: Long = -1 @@ -70,7 +71,7 @@ class ArrangeBookActivity : VMBaseActivity appDb.bookDao.flowNoGroup() AppConst.bookGroupAllId -> appDb.bookDao.flowAll() AppConst.bookGroupLocalId -> appDb.bookDao.flowLocal() AppConst.bookGroupAudioId -> appDb.bookDao.flowAudio() @@ -146,12 +148,18 @@ class ArrangeBookActivity : VMBaseActivity appDb.bookDao.flowByGroup(groupId) }.conflate().map { books -> when (getPrefInt(PreferKey.bookshelfSort)) { - 1 -> books.sortedByDescending { it.latestChapterTime } + 1 -> books.sortedByDescending { + it.latestChapterTime + } 2 -> books.sortedWith { o1, o2 -> o1.name.cnCompare(o2.name) } - 3 -> books.sortedBy { it.order } - else -> books.sortedByDescending { it.durChapterTime } + 3 -> books.sortedBy { + it.order + } + else -> books.sortedByDescending { + it.durChapterTime + } } }.conflate().collect { books -> adapter.setItems(books) diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageViewModel.kt similarity index 91% rename from app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt rename to app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageViewModel.kt index da6ef4862..340363742 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageViewModel.kt @@ -1,4 +1,4 @@ -package io.legado.app.ui.book.arrange +package io.legado.app.ui.book.manage import android.app.Application import androidx.compose.runtime.mutableStateOf @@ -10,7 +10,7 @@ import io.legado.app.help.coroutine.Coroutine import io.legado.app.model.webBook.WebBook -class ArrangeBookViewModel(application: Application) : BaseViewModel(application) { +class BookshelfManageViewModel(application: Application) : BaseViewModel(application) { val batchChangeSourceState = mutableStateOf(false) val batchChangeSourceSize = mutableStateOf(0) @@ -50,6 +50,7 @@ class ArrangeBookViewModel(application: Application) : BaseViewModel(application .getOrNull()?.let { newBook -> val toc = WebBook.getChapterListAwait(this, source, newBook) book.changeTo(newBook, toc) + appDb.bookDao.insert(newBook) appDb.bookChapterDao.insert(*toc.toTypedArray()) } } diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ComposeView.kt b/app/src/main/java/io/legado/app/ui/book/manage/ComposeView.kt similarity index 97% rename from app/src/main/java/io/legado/app/ui/book/arrange/ComposeView.kt rename to app/src/main/java/io/legado/app/ui/book/manage/ComposeView.kt index bfb86ed15..ffa57baa2 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ComposeView.kt +++ b/app/src/main/java/io/legado/app/ui/book/manage/ComposeView.kt @@ -1,4 +1,4 @@ -package io.legado.app.ui.book.arrange +package io.legado.app.ui.book.manage import androidx.compose.foundation.layout.Column import androidx.compose.material.AlertDialog diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/SourcePickerDialog.kt b/app/src/main/java/io/legado/app/ui/book/manage/SourcePickerDialog.kt similarity index 99% rename from app/src/main/java/io/legado/app/ui/book/arrange/SourcePickerDialog.kt rename to app/src/main/java/io/legado/app/ui/book/manage/SourcePickerDialog.kt index 50101e9a6..1be0837dc 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/SourcePickerDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/manage/SourcePickerDialog.kt @@ -1,4 +1,4 @@ -package io.legado.app.ui.book.arrange +package io.legado.app.ui.book.manage import android.content.Context import android.os.Bundle 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 431b73029..b19e7325b 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 @@ -724,6 +724,7 @@ class ReadBookActivity : BaseReadBookActivity(), ReadAloud.stop(this) launch { ReadBook.book?.changeTo(book, toc) + appDb.bookDao.insert(book) } startActivity { putExtra("bookUrl", book.bookUrl) 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 3293dba25..2f98e9704 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 @@ -195,7 +195,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { changeSourceCoroutine?.cancel() changeSourceCoroutine = execute { ReadBook.upMsg(context.getString(R.string.loading)) - ReadBook.book!!.changeTo(book, toc) + ReadBook.book?.changeTo(book, toc) val nextChapter = toc.getOrElse(book.durChapterIndex) { toc.first() } @@ -206,17 +206,17 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { bookChapter = toc[book.durChapterIndex], nextChapterUrl = nextChapter.url ) + appDb.bookDao.insert(book) appDb.bookChapterDao.insert(*toc.toTypedArray()) ReadBook.resetData(book) ReadBook.upMsg(null) ReadBook.loadContent(resetPageOffset = true) - }.timeout(60000) - .onError { - context.toastOnUi("换源失败\n${it.localizedMessage}") - ReadBook.upMsg(null) - }.onFinally { - postEvent(EventBus.SOURCE_CHANGED, book.bookUrl) - } + }.onError { + context.toastOnUi("换源失败\n${it.localizedMessage}") + ReadBook.upMsg(null) + }.onFinally { + postEvent(EventBus.SOURCE_CHANGED, book.bookUrl) + } } /** diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BaseBookshelfFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BaseBookshelfFragment.kt index e4f0847f0..78d16eb92 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BaseBookshelfFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BaseBookshelfFragment.kt @@ -19,10 +19,10 @@ import io.legado.app.help.DirectLinkUpload import io.legado.app.help.config.AppConfig import io.legado.app.lib.dialogs.alert import io.legado.app.ui.about.AppLogDialog -import io.legado.app.ui.book.arrange.ArrangeBookActivity import io.legado.app.ui.book.cache.CacheActivity import io.legado.app.ui.book.group.GroupManageDialog import io.legado.app.ui.book.local.ImportBookActivity +import io.legado.app.ui.book.manage.BookshelfManageActivity import io.legado.app.ui.book.search.SearchActivity import io.legado.app.ui.document.HandleFileContract import io.legado.app.ui.main.MainViewModel @@ -80,7 +80,7 @@ abstract class BaseBookshelfFragment(layoutId: Int) : VMBaseFragment showDialogFragment() R.id.menu_add_local -> startActivity() R.id.menu_add_url -> addBookByUrl() - R.id.menu_arrange_bookshelf -> startActivity { + R.id.menu_bookshelf_manage -> startActivity { putExtra("groupId", groupId) } R.id.menu_download -> startActivity { diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/style2/BookshelfFragment2.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/style2/BookshelfFragment2.kt index 6cd545f29..cfa2c4304 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/style2/BookshelfFragment2.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/style2/BookshelfFragment2.kt @@ -43,7 +43,6 @@ class BookshelfFragment2 : BaseBookshelfFragment(R.layout.fragment_bookshelf1), BaseBooksAdapter.CallBack { private val binding by viewBinding(FragmentBookshelf1Binding::bind) - private val rootGroupId = -100L private val bookshelfLayout by lazy { getPrefInt(PreferKey.bookshelfLayout) } @@ -56,7 +55,7 @@ class BookshelfFragment2 : BaseBookshelfFragment(R.layout.fragment_bookshelf1), } private var bookGroups: List = emptyList() private var booksFlowJob: Job? = null - override var groupId = rootGroupId + override var groupId = AppConst.rootGroupId override var books: List = emptyList() override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { @@ -121,7 +120,7 @@ class BookshelfFragment2 : BaseBookshelfFragment(R.layout.fragment_bookshelf1), booksFlowJob?.cancel() booksFlowJob = launch { when (groupId) { - rootGroupId -> appDb.bookDao.flowRoot() + AppConst.rootGroupId -> appDb.bookDao.flowRoot() AppConst.bookGroupAllId -> appDb.bookDao.flowAll() AppConst.bookGroupLocalId -> appDb.bookDao.flowLocal() AppConst.bookGroupAudioId -> appDb.bookDao.flowAudio() @@ -212,7 +211,7 @@ class BookshelfFragment2 : BaseBookshelfFragment(R.layout.fragment_bookshelf1), } override fun getItemCount(): Int { - return if (groupId == rootGroupId) { + return if (groupId == AppConst.rootGroupId) { bookGroups.size + books.size } else { books.size @@ -220,7 +219,7 @@ class BookshelfFragment2 : BaseBookshelfFragment(R.layout.fragment_bookshelf1), } override fun getItemType(position: Int): Int { - if (groupId != rootGroupId) { + if (groupId != AppConst.rootGroupId) { return 0 } if (position < bookGroups.size) { @@ -230,7 +229,7 @@ class BookshelfFragment2 : BaseBookshelfFragment(R.layout.fragment_bookshelf1), } override fun getItem(position: Int): Any? { - if (groupId != rootGroupId) { + if (groupId != AppConst.rootGroupId) { return books.getOrNull(position) } if (position < bookGroups.size) { diff --git a/app/src/main/res/layout/activity_arrange_book.xml b/app/src/main/res/layout/activity_arrange_book.xml index e85718977..b9875f283 100644 --- a/app/src/main/res/layout/activity_arrange_book.xml +++ b/app/src/main/res/layout/activity_arrange_book.xml @@ -9,7 +9,7 @@ android:id="@+id/title_bar" android:layout_width="match_parent" android:layout_height="wrap_content" - app:title="@string/arrange_bookshelf" + app:title="@string/bookshelf_management" app:layout_constraintTop_toTopOf="parent" /> + + - - Tiempo límite de carga Siga:%s Copiado con éxito - Organización de estantería + Organización de estantería Esto borrará a todos los libros. Por favor, tenga cuidado. Buscar fuentes de libros Buscar fuentes de suscripción diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index dfb209873..3385b091b 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -271,7 +271,7 @@ Loading timeout Follow:%s Copied successfully - Bookshelf arrangement + Bookshelf management It will delete all books. Be careful,please. Search book sources Search subscription sources diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index ac7d406b6..863b931ad 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -271,7 +271,7 @@ Tempo limite de carregamento Siga:%s Copiado com sucesso - A organização da estante + A organização da estante Isto excluirá todos os livros. Por favor, tenha cuidado. Pesquisar fontes de livros Buscar fontes de assinatura diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 56dab2441..416e92a93 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -268,7 +268,7 @@ 加載超時 關注: %s 拷貝咗 - 整理書架 + 書架管理 這將會刪除所有書籍,請謹慎操作。 搜索書源 搜索訂閲源 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 69805157e..874d66764 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -270,7 +270,7 @@ 載入超時 關注:%s 已複製 - 整理書架 + 書架管理 這將會刪除所有書籍,請謹慎操作。 搜尋書源 搜尋訂閱源 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 8f9c01346..6b9b415d0 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -270,7 +270,7 @@ 加载超时 关注:%s 已拷贝 - 整理书架 + 书架管理 这将会删除所有书籍,请谨慎操作。 搜索书源 搜索订阅源 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9423a4cf5..bc5f63327 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -271,7 +271,7 @@ Loading timeout Follow:%s Copied successfully - Bookshelf arrangement + Bookshelf management It will delete all books. Be careful,please. Search book sources Search subscription sources