添加更新失败分组
This commit is contained in:
@@ -43,6 +43,7 @@ object AppConst {
|
|||||||
const val bookGroupAudioId = -3L
|
const val bookGroupAudioId = -3L
|
||||||
const val bookGroupNetNoneId = -4L
|
const val bookGroupNetNoneId = -4L
|
||||||
const val bookGroupLocalNoneId = -5L
|
const val bookGroupLocalNoneId = -5L
|
||||||
|
const val bookGroupErrorId = -11L
|
||||||
|
|
||||||
const val notificationIdRead = -1122391
|
const val notificationIdRead = -1122391
|
||||||
const val notificationIdAudio = -1122392
|
const val notificationIdAudio = -1122392
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
package io.legado.app.constant
|
package io.legado.app.constant
|
||||||
|
|
||||||
import androidx.annotation.IntDef
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 以二进制位来区分,可能一本书籍包含多个类型,每一位代表一个类型,数值为2的n次方
|
* 以二进制位来区分,可能一本书籍包含多个类型,每一位代表一个类型,数值为2的n次方
|
||||||
* 以二进制位来区分,数据库查询更高效, 数值>=8和老版本类型区分开
|
* 以二进制位来区分,数据库查询更高效, 数值>=8和老版本类型区分开
|
||||||
@@ -12,6 +10,11 @@ object BookType {
|
|||||||
*/
|
*/
|
||||||
const val text = 0b1000
|
const val text = 0b1000
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 16 更新失败
|
||||||
|
*/
|
||||||
|
const val updateError = 0b10000
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 32 音频
|
* 32 音频
|
||||||
*/
|
*/
|
||||||
@@ -32,12 +35,6 @@ object BookType {
|
|||||||
*/
|
*/
|
||||||
const val local = 0b100000000
|
const val local = 0b100000000
|
||||||
|
|
||||||
|
|
||||||
@Target(AnnotationTarget.VALUE_PARAMETER)
|
|
||||||
@Retention(AnnotationRetention.SOURCE)
|
|
||||||
@IntDef(text, audio, image, webFile)
|
|
||||||
annotation class Type
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 本地书籍书源标志
|
* 本地书籍书源标志
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -105,9 +105,14 @@ abstract class AppDatabase : RoomDatabase() {
|
|||||||
)
|
)
|
||||||
db.execSQL(
|
db.execSQL(
|
||||||
"""insert into book_groups(groupId, groupName, 'order', show)
|
"""insert into book_groups(groupId, groupName, 'order', show)
|
||||||
select ${AppConst.bookGroupLocalNoneId}, '本地未分组', -8, 0
|
select ${AppConst.bookGroupLocalNoneId}, '本地未分组', -6, 0
|
||||||
where not exists (select * from book_groups where groupId = ${AppConst.bookGroupLocalNoneId})"""
|
where not exists (select * from book_groups where groupId = ${AppConst.bookGroupLocalNoneId})"""
|
||||||
)
|
)
|
||||||
|
db.execSQL(
|
||||||
|
"""insert into book_groups(groupId, groupName, 'order', show)
|
||||||
|
select ${AppConst.bookGroupErrorId}, '更新失败', -1, 1
|
||||||
|
where not exists (select * from book_groups where groupId = ${AppConst.bookGroupErrorId})"""
|
||||||
|
)
|
||||||
db.execSQL("update book_sources set loginUi = null where loginUi = 'null'")
|
db.execSQL("update book_sources set loginUi = null where loginUi = 'null'")
|
||||||
db.execSQL("update rssSources set loginUi = null where loginUi = 'null'")
|
db.execSQL("update rssSources set loginUi = null where loginUi = 'null'")
|
||||||
db.execSQL("update httpTTS set loginUi = null where loginUi = 'null'")
|
db.execSQL("update httpTTS set loginUi = null where loginUi = 'null'")
|
||||||
|
|||||||
@@ -53,6 +53,9 @@ interface BookDao {
|
|||||||
@Query("SELECT * FROM books WHERE name like '%'||:key||'%' or author like '%'||:key||'%'")
|
@Query("SELECT * FROM books WHERE name like '%'||:key||'%' or author like '%'||:key||'%'")
|
||||||
fun flowSearch(key: String): Flow<List<Book>>
|
fun flowSearch(key: String): Flow<List<Book>>
|
||||||
|
|
||||||
|
@Query("SELECT * FROM books where type & ${BookType.updateError} > 0 order by durChapterTime desc")
|
||||||
|
fun flowUpdateError(): Flow<List<Book>>
|
||||||
|
|
||||||
@Query("SELECT * FROM books WHERE (`group` & :group) > 0")
|
@Query("SELECT * FROM books WHERE (`group` & :group) > 0")
|
||||||
fun getBooksByGroup(group: Long): List<Book>
|
fun getBooksByGroup(group: Long): List<Book>
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ interface BookGroupDao {
|
|||||||
or (groupId = -1 and show > 0)
|
or (groupId = -1 and show > 0)
|
||||||
or (groupId = -2 and show > 0 and (select count(*) from books where type & ${BookType.local} > 0) > 0)
|
or (groupId = -2 and show > 0 and (select count(*) from books where type & ${BookType.local} > 0) > 0)
|
||||||
or (groupId = -3 and show > 0 and (select count(*) from books where type & ${BookType.audio} > 0) > 0)
|
or (groupId = -3 and show > 0 and (select count(*) from books where type & ${BookType.audio} > 0) > 0)
|
||||||
|
or (groupId = -11 and show > 0 and (select count(*) from books where type & ${BookType.updateError} > 0) > 0)
|
||||||
or (groupId = -4 and show > 0
|
or (groupId = -4 and show > 0
|
||||||
and (
|
and (
|
||||||
select count(*) from books
|
select count(*) from books
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
@file:Suppress("unused")
|
||||||
|
|
||||||
package io.legado.app.help.book
|
package io.legado.app.help.book
|
||||||
|
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
@@ -6,12 +8,12 @@ import io.legado.app.constant.BookSourceType
|
|||||||
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.BookSource
|
import io.legado.app.data.entities.BookSource
|
||||||
import io.legado.app.help.config.AppConfig.defaultBookTreeUri
|
|
||||||
import io.legado.app.exception.NoStackTraceException
|
import io.legado.app.exception.NoStackTraceException
|
||||||
import io.legado.app.utils.isContentScheme
|
import io.legado.app.help.config.AppConfig.defaultBookTreeUri
|
||||||
import io.legado.app.utils.getFile
|
import io.legado.app.utils.getFile
|
||||||
import java.io.File
|
import io.legado.app.utils.isContentScheme
|
||||||
import splitties.init.appCtx
|
import splitties.init.appCtx
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
|
||||||
val Book.isAudio: Boolean
|
val Book.isAudio: Boolean
|
||||||
@@ -84,6 +86,27 @@ fun Book.getRemoteUrl(): String? {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Book.setType(vararg types: Int) {
|
||||||
|
type = 0
|
||||||
|
addType(*types)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Book.addType(vararg types: Int) {
|
||||||
|
types.forEach {
|
||||||
|
type = type or it
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Book.removeType(vararg types: Int) {
|
||||||
|
types.forEach {
|
||||||
|
type = type and it.inv()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Book.clearType() {
|
||||||
|
type = 0
|
||||||
|
}
|
||||||
|
|
||||||
fun Book.upType() {
|
fun Book.upType() {
|
||||||
if (type < 8) {
|
if (type < 8) {
|
||||||
type = when (type) {
|
type = when (type) {
|
||||||
|
|||||||
@@ -184,6 +184,7 @@ class BookshelfManageActivity :
|
|||||||
AppConst.bookGroupAudioId -> appDb.bookDao.flowAudio()
|
AppConst.bookGroupAudioId -> appDb.bookDao.flowAudio()
|
||||||
AppConst.bookGroupNetNoneId -> appDb.bookDao.flowNetNoGroup()
|
AppConst.bookGroupNetNoneId -> appDb.bookDao.flowNetNoGroup()
|
||||||
AppConst.bookGroupLocalNoneId -> appDb.bookDao.flowLocalNoGroup()
|
AppConst.bookGroupLocalNoneId -> appDb.bookDao.flowLocalNoGroup()
|
||||||
|
AppConst.bookGroupErrorId -> appDb.bookDao.flowUpdateError()
|
||||||
else -> appDb.bookDao.flowByGroup(viewModel.groupId)
|
else -> appDb.bookDao.flowByGroup(viewModel.groupId)
|
||||||
}.conflate().map { list ->
|
}.conflate().map { list ->
|
||||||
val books = if (searchKey.isNullOrBlank()) {
|
val books = if (searchKey.isNullOrBlank()) {
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ class SearchContentActivity :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val isLocalBook: Boolean
|
private val isLocalBook: Boolean
|
||||||
get() = viewModel.book?.isLocal == true
|
get() = viewModel.book?.isLocal == true
|
||||||
|
|
||||||
override fun openSearchResult(searchResult: SearchResult, index: Int) {
|
override fun openSearchResult(searchResult: SearchResult, index: Int) {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import androidx.lifecycle.viewModelScope
|
|||||||
import io.legado.app.base.BaseViewModel
|
import io.legado.app.base.BaseViewModel
|
||||||
import io.legado.app.constant.AppConst
|
import io.legado.app.constant.AppConst
|
||||||
import io.legado.app.constant.AppLog
|
import io.legado.app.constant.AppLog
|
||||||
|
import io.legado.app.constant.BookType
|
||||||
import io.legado.app.constant.EventBus
|
import io.legado.app.constant.EventBus
|
||||||
import io.legado.app.data.appDb
|
import io.legado.app.data.appDb
|
||||||
import io.legado.app.data.entities.Book
|
import io.legado.app.data.entities.Book
|
||||||
@@ -12,7 +13,9 @@ import io.legado.app.data.entities.BookSource
|
|||||||
import io.legado.app.help.AppWebDav
|
import io.legado.app.help.AppWebDav
|
||||||
import io.legado.app.help.DefaultData
|
import io.legado.app.help.DefaultData
|
||||||
import io.legado.app.help.book.BookHelp
|
import io.legado.app.help.book.BookHelp
|
||||||
|
import io.legado.app.help.book.addType
|
||||||
import io.legado.app.help.book.isLocal
|
import io.legado.app.help.book.isLocal
|
||||||
|
import io.legado.app.help.book.removeType
|
||||||
import io.legado.app.help.config.AppConfig
|
import io.legado.app.help.config.AppConfig
|
||||||
import io.legado.app.help.config.LocalConfig
|
import io.legado.app.help.config.LocalConfig
|
||||||
import io.legado.app.model.CacheBook
|
import io.legado.app.model.CacheBook
|
||||||
@@ -126,6 +129,7 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
WebBook.getBookInfoAwait(source, book)
|
WebBook.getBookInfoAwait(source, book)
|
||||||
}
|
}
|
||||||
val toc = WebBook.getChapterListAwait(source, book).getOrThrow()
|
val toc = WebBook.getChapterListAwait(source, book).getOrThrow()
|
||||||
|
book.removeType(BookType.updateError)
|
||||||
if (book.bookUrl == bookUrl) {
|
if (book.bookUrl == bookUrl) {
|
||||||
appDb.bookDao.update(book)
|
appDb.bookDao.update(book)
|
||||||
} else {
|
} else {
|
||||||
@@ -137,6 +141,8 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
appDb.bookChapterDao.insert(*toc.toTypedArray())
|
appDb.bookChapterDao.insert(*toc.toTypedArray())
|
||||||
addDownload(source, book)
|
addDownload(source, book)
|
||||||
}.onError(upTocPool) {
|
}.onError(upTocPool) {
|
||||||
|
book.addType(BookType.updateError)
|
||||||
|
appDb.bookDao.update(book)
|
||||||
AppLog.put("${book.name} 更新目录失败\n${it.localizedMessage}", it)
|
AppLog.put("${book.name} 更新目录失败\n${it.localizedMessage}", it)
|
||||||
}.onCancel(upTocPool) {
|
}.onCancel(upTocPool) {
|
||||||
upTocCancel(bookUrl)
|
upTocCancel(bookUrl)
|
||||||
|
|||||||
@@ -118,6 +118,7 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books),
|
|||||||
AppConst.bookGroupAudioId -> appDb.bookDao.flowAudio()
|
AppConst.bookGroupAudioId -> appDb.bookDao.flowAudio()
|
||||||
AppConst.bookGroupNetNoneId -> appDb.bookDao.flowNetNoGroup()
|
AppConst.bookGroupNetNoneId -> appDb.bookDao.flowNetNoGroup()
|
||||||
AppConst.bookGroupLocalNoneId -> appDb.bookDao.flowLocalNoGroup()
|
AppConst.bookGroupLocalNoneId -> appDb.bookDao.flowLocalNoGroup()
|
||||||
|
AppConst.bookGroupErrorId -> appDb.bookDao.flowUpdateError()
|
||||||
else -> appDb.bookDao.flowByGroup(groupId)
|
else -> appDb.bookDao.flowByGroup(groupId)
|
||||||
}.conflate().map { list ->
|
}.conflate().map { list ->
|
||||||
when (getPrefInt(PreferKey.bookshelfSort)) {
|
when (getPrefInt(PreferKey.bookshelfSort)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user