From 4d4d13aab250d18703324a9222d8cc26b2ce2eae Mon Sep 17 00:00:00 2001 From: kunfei Date: Fri, 23 Jun 2023 18:18:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B9=A6=E6=9E=B6=E6=9B=B4=E6=96=B0=E6=97=B6?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=89=A9=E4=BD=99=E6=9B=B4=E6=96=B0=E6=95=B0?= =?UTF-8?q?=E9=87=8F,=E5=9C=A8=E4=B9=A6=E6=9E=B6=E5=B8=83=E5=B1=80?= =?UTF-8?q?=E9=87=8C=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/constant/PreferKey.kt | 1 + .../io/legado/app/help/config/AppConfig.kt | 6 ++++ .../theme/view/ThemeBottomNavigationVIew.kt | 15 ++++++++++ .../io/legado/app/ui/main/MainActivity.kt | 12 ++++++++ .../io/legado/app/ui/main/MainViewModel.kt | 29 +++++++++++++++++-- .../main/bookshelf/BaseBookshelfFragment.kt | 5 ++++ .../res/layout/dialog_bookshelf_config.xml | 13 +++++++-- .../main/res/layout/view_navigation_badge.xml | 16 ++++++++++ app/src/main/res/values-es-rES/strings.xml | 1 + app/src/main/res/values-ja-rJP/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-zh-rHK/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values-zh/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 15 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/layout/view_navigation_badge.xml diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index 931f0191c..a58c23b77 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -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" 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 369a06236..53b832e6d 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 @@ -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) diff --git a/app/src/main/java/io/legado/app/lib/theme/view/ThemeBottomNavigationVIew.kt b/app/src/main/java/io/legado/app/lib/theme/view/ThemeBottomNavigationVIew.kt index 6e5c49c58..1dd6cef48 100644 --- a/app/src/main/java/io/legado/app/lib/theme/view/ThemeBottomNavigationVIew.kt +++ b/app/src/main/java/io/legado/app/lib/theme/view/ThemeBottomNavigationVIew.kt @@ -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 + } + } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index 5f2c672a3..9be55c01b 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -74,6 +74,9 @@ class MainActivity : VMBaseActivity(), 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(), 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(), (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(), } override fun observeLiveBus() { + viewModel.onUpBooksLiveData.observe(this) { + onUpBooksBadgeView.setBadgeCount(it) + } observeEvent(EventBus.RECREATE) { recreate() } @@ -400,9 +410,11 @@ class MainActivity : VMBaseActivity(), } interface Callback { + fun onActive() fun onInactive() + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt b/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt index 4024a62f3..80ad90336 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt @@ -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() private val onUpTocBooks = CopyOnWriteArraySet() + val onUpBooksLiveData = MutableLiveData() 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) } } 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 89eb042c7..647113efe 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 @@ -135,6 +135,7 @@ abstract class BaseBookshelfFragment(layoutId: Int) : VMBaseFragment + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 204a3b8b0..5649d9788 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1115,4 +1115,5 @@ 是否压缩 反序 测试 + 显示等待更新数量 diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index b3637d081..055283f8c 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -1118,4 +1118,5 @@ 是否压缩 反序 测试 + 显示等待更新数量 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 6801cc400..699bb3f9e 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1118,4 +1118,5 @@ 是否压缩 反序 测试 + 显示等待更新数量 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 440615bbc..819a72aec 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -1115,4 +1115,5 @@ 是否压缩 反序 测试 + 显示等待更新数量 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index d5ad893b3..dbab15531 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1117,4 +1117,5 @@ 是否压缩 反序 测试 + 显示等待更新数量 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index a5e34ff38..4117dff95 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1117,4 +1117,5 @@ 是否压缩 反序 测试 + 显示等待更新数量 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3c0a93250..6b25eda1c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1118,4 +1118,5 @@ 是否压缩 反序 测试 + 显示等待更新数量