书架更新时显示剩余更新数量,在书架布局里配置
This commit is contained in:
@@ -127,6 +127,7 @@ object PreferKey {
|
||||
const val audioPlayWakeLock = "audioPlayWakeLock"
|
||||
const val readAloudWakeLock = "readAloudWakeLock"
|
||||
const val showLastUpdateTime = "showLastUpdateTime"
|
||||
const val showWaitUpCount = "showWaitUpCount"
|
||||
const val clearWebViewData = "clearWebViewData"
|
||||
const val onlyLatestBackup = "onlyLatestBackup"
|
||||
const val brightnessVwPos = "brightnessVwPos"
|
||||
|
||||
@@ -88,6 +88,12 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
|
||||
appCtx.putPrefBoolean(PreferKey.showLastUpdateTime, value)
|
||||
}
|
||||
|
||||
var showWaitUpCount: Boolean
|
||||
get() = appCtx.getPrefBoolean(PreferKey.showWaitUpCount, false)
|
||||
set(value) {
|
||||
appCtx.putPrefBoolean(PreferKey.showWaitUpCount, value)
|
||||
}
|
||||
|
||||
var readBrightness: Int
|
||||
get() = if (isNightTheme) {
|
||||
appCtx.getPrefInt(PreferKey.nightBrightness, 100)
|
||||
|
||||
@@ -2,11 +2,16 @@ package io.legado.app.lib.theme.view
|
||||
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
import com.google.android.material.bottomnavigation.BottomNavigationItemView
|
||||
import com.google.android.material.bottomnavigation.BottomNavigationMenuView
|
||||
import com.google.android.material.bottomnavigation.BottomNavigationView
|
||||
import io.legado.app.databinding.ViewNavigationBadgeBinding
|
||||
import io.legado.app.lib.theme.Selector
|
||||
import io.legado.app.lib.theme.ThemeStore
|
||||
import io.legado.app.lib.theme.bottomBackground
|
||||
import io.legado.app.lib.theme.getSecondaryTextColor
|
||||
import io.legado.app.ui.widget.text.BadgeView
|
||||
import io.legado.app.utils.ColorUtils
|
||||
|
||||
class ThemeBottomNavigationVIew(context: Context, attrs: AttributeSet) :
|
||||
@@ -24,4 +29,14 @@ class ThemeBottomNavigationVIew(context: Context, attrs: AttributeSet) :
|
||||
itemTextColor = colorStateList
|
||||
}
|
||||
|
||||
fun addBadgeView(index: Int): BadgeView {
|
||||
//获取底部菜单view
|
||||
val menuView = getChildAt(0) as BottomNavigationMenuView
|
||||
//获取第index个itemView
|
||||
val itemView = menuView.getChildAt(index) as BottomNavigationItemView
|
||||
val badgeBinding = ViewNavigationBadgeBinding.inflate(LayoutInflater.from(context))
|
||||
itemView.addView(badgeBinding.root)
|
||||
return badgeBinding.viewBadge
|
||||
}
|
||||
|
||||
}
|
||||
@@ -74,6 +74,9 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
|
||||
private val adapter by lazy {
|
||||
TabFragmentPageAdapter(supportFragmentManager)
|
||||
}
|
||||
private val onUpBooksBadgeView by lazy {
|
||||
binding.bottomNavigationView.addBadgeView(0)
|
||||
}
|
||||
|
||||
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
||||
upBottomMenu()
|
||||
@@ -128,10 +131,13 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
|
||||
when (item.itemId) {
|
||||
R.id.menu_bookshelf ->
|
||||
viewPagerMain.setCurrentItem(0, false)
|
||||
|
||||
R.id.menu_discovery ->
|
||||
viewPagerMain.setCurrentItem(realPositions.indexOf(idExplore), false)
|
||||
|
||||
R.id.menu_rss ->
|
||||
viewPagerMain.setCurrentItem(realPositions.indexOf(idRss), false)
|
||||
|
||||
R.id.menu_my_config ->
|
||||
viewPagerMain.setCurrentItem(realPositions.indexOf(idMy), false)
|
||||
}
|
||||
@@ -147,6 +153,7 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
|
||||
(fragmentMap[getFragmentId(0)] as? BaseBookshelfFragment)?.gotoTop()
|
||||
}
|
||||
}
|
||||
|
||||
R.id.menu_discovery -> {
|
||||
if (System.currentTimeMillis() - exploreReselected > 300) {
|
||||
exploreReselected = System.currentTimeMillis()
|
||||
@@ -304,6 +311,9 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
|
||||
}
|
||||
|
||||
override fun observeLiveBus() {
|
||||
viewModel.onUpBooksLiveData.observe(this) {
|
||||
onUpBooksBadgeView.setBadgeCount(it)
|
||||
}
|
||||
observeEvent<String>(EventBus.RECREATE) {
|
||||
recreate()
|
||||
}
|
||||
@@ -400,9 +410,11 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
|
||||
}
|
||||
|
||||
interface Callback {
|
||||
|
||||
fun onActive()
|
||||
|
||||
fun onInactive()
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package io.legado.app.ui.main
|
||||
|
||||
import android.app.Application
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import io.legado.app.base.BaseViewModel
|
||||
import io.legado.app.constant.AppConst
|
||||
@@ -12,15 +13,25 @@ import io.legado.app.data.entities.Book
|
||||
import io.legado.app.data.entities.BookSource
|
||||
import io.legado.app.help.AppWebDav
|
||||
import io.legado.app.help.DefaultData
|
||||
import io.legado.app.help.book.*
|
||||
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.isSameNameAuthor
|
||||
import io.legado.app.help.book.isUpError
|
||||
import io.legado.app.help.book.removeType
|
||||
import io.legado.app.help.book.sync
|
||||
import io.legado.app.help.config.AppConfig
|
||||
import io.legado.app.model.CacheBook
|
||||
import io.legado.app.model.ReadBook
|
||||
import io.legado.app.model.webBook.WebBook
|
||||
import io.legado.app.service.CacheBookService
|
||||
import io.legado.app.utils.postEvent
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.Dispatchers.IO
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.asCoroutineDispatcher
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.isActive
|
||||
import kotlinx.coroutines.launch
|
||||
import java.util.concurrent.CopyOnWriteArraySet
|
||||
import java.util.concurrent.Executors
|
||||
import kotlin.math.min
|
||||
@@ -31,6 +42,7 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
|
||||
Executors.newFixedThreadPool(min(threadCount, AppConst.MAX_THREAD)).asCoroutineDispatcher()
|
||||
private val waitUpTocBooks = arrayListOf<String>()
|
||||
private val onUpTocBooks = CopyOnWriteArraySet<String>()
|
||||
val onUpBooksLiveData = MutableLiveData<Int>()
|
||||
private var upTocJob: Job? = null
|
||||
private var cacheBookJob: Job? = null
|
||||
|
||||
@@ -79,6 +91,7 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
|
||||
}
|
||||
|
||||
private fun startUpTocJob() {
|
||||
postUpBooksLiveData()
|
||||
upTocJob = viewModelScope.launch(upTocPool) {
|
||||
while (isActive) {
|
||||
when {
|
||||
@@ -104,11 +117,13 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
|
||||
val bookUrl = waitUpTocBooks.firstOrNull() ?: return
|
||||
if (onUpTocBooks.contains(bookUrl)) {
|
||||
waitUpTocBooks.remove(bookUrl)
|
||||
postUpBooksLiveData()
|
||||
return
|
||||
}
|
||||
val book = appDb.bookDao.getBook(bookUrl)
|
||||
if (book == null) {
|
||||
waitUpTocBooks.remove(bookUrl)
|
||||
postUpBooksLiveData()
|
||||
return
|
||||
}
|
||||
val source = appDb.bookSourceDao.getBookSource(book.origin)
|
||||
@@ -118,6 +133,7 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
|
||||
appDb.bookDao.update(book)
|
||||
}
|
||||
waitUpTocBooks.remove(book.bookUrl)
|
||||
postUpBooksLiveData()
|
||||
return
|
||||
}
|
||||
waitUpTocBooks.remove(bookUrl)
|
||||
@@ -160,6 +176,15 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
|
||||
}.onFinally(upTocPool) {
|
||||
upTocFinally(bookUrl)
|
||||
upTocFinally(book.bookUrl)
|
||||
postUpBooksLiveData()
|
||||
}
|
||||
}
|
||||
|
||||
fun postUpBooksLiveData() {
|
||||
if (AppConfig.showWaitUpCount) {
|
||||
onUpBooksLiveData.postValue(waitUpTocBooks.size + onUpTocBooks.size)
|
||||
} else {
|
||||
onUpBooksLiveData.postValue(0)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -135,6 +135,7 @@ abstract class BaseBookshelfFragment(layoutId: Int) : VMBaseFragment<BookshelfVi
|
||||
spGroupStyle.setSelection(AppConfig.bookGroupStyle)
|
||||
swShowUnread.isChecked = AppConfig.showUnread
|
||||
swShowLastUpdateTime.isChecked = AppConfig.showLastUpdateTime
|
||||
swShowWaitUpBooks.isChecked = AppConfig.showWaitUpCount
|
||||
rgLayout.checkByIndex(bookshelfLayout)
|
||||
rgSort.checkByIndex(bookshelfSort)
|
||||
}
|
||||
@@ -153,6 +154,10 @@ abstract class BaseBookshelfFragment(layoutId: Int) : VMBaseFragment<BookshelfVi
|
||||
AppConfig.showLastUpdateTime = swShowLastUpdateTime.isChecked
|
||||
postEvent(EventBus.BOOKSHELF_REFRESH, "")
|
||||
}
|
||||
if (AppConfig.showWaitUpCount != swShowWaitUpBooks.isChecked) {
|
||||
AppConfig.showWaitUpCount = swShowWaitUpBooks.isChecked
|
||||
activityViewModel.postUpBooksLiveData()
|
||||
}
|
||||
var changed = false
|
||||
if (bookshelfLayout != rgLayout.getCheckedIndex()) {
|
||||
putPrefInt(PreferKey.bookshelfLayout, rgLayout.getCheckedIndex())
|
||||
|
||||
Reference in New Issue
Block a user