Change Updates icon badge to show new updates count (#8659)

* Change Updates icon badge to show new updates count

* Fix reference

* review changes

* Lint
This commit is contained in:
AntsyLich 2022-12-04 01:44:30 +06:00 committed by GitHub
parent 7be9b49143
commit 373463e995
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 20 additions and 29 deletions

View File

@ -130,7 +130,7 @@ class DomainModule : InjektModule {
addFactory { GetExtensionLanguages(get(), get()) } addFactory { GetExtensionLanguages(get(), get()) }
addSingletonFactory<UpdatesRepository> { UpdatesRepositoryImpl(get()) } addSingletonFactory<UpdatesRepository> { UpdatesRepositoryImpl(get()) }
addFactory { GetUpdates(get(), get()) } addFactory { GetUpdates(get()) }
addSingletonFactory<SourceRepository> { SourceRepositoryImpl(get(), get()) } addSingletonFactory<SourceRepository> { SourceRepositoryImpl(get(), get()) }
addSingletonFactory<SourceDataRepository> { SourceDataRepositoryImpl(get()) } addSingletonFactory<SourceDataRepository> { SourceDataRepositoryImpl(get()) }

View File

@ -60,8 +60,7 @@ class LibraryPreferences(
fun languageBadge() = preferenceStore.getBoolean("display_language_badge", false) fun languageBadge() = preferenceStore.getBoolean("display_language_badge", false)
fun showUpdatesNavBadge() = preferenceStore.getBoolean("library_update_show_tab_badge", false) fun newUpdatesCount() = preferenceStore.getInt("library_unseen_updates_count", 0)
fun unreadUpdatesCount() = preferenceStore.getInt("library_unread_updates_count", 0)
// endregion // endregion

View File

@ -1,24 +1,17 @@
package eu.kanade.domain.updates.interactor package eu.kanade.domain.updates.interactor
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.domain.updates.model.UpdatesWithRelations import eu.kanade.domain.updates.model.UpdatesWithRelations
import eu.kanade.domain.updates.repository.UpdatesRepository import eu.kanade.domain.updates.repository.UpdatesRepository
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.onEach
import java.util.Calendar import java.util.Calendar
class GetUpdates( class GetUpdates(
private val repository: UpdatesRepository, private val repository: UpdatesRepository,
private val preferences: LibraryPreferences,
) { ) {
fun subscribe(calendar: Calendar): Flow<List<UpdatesWithRelations>> = subscribe(calendar.time.time) fun subscribe(calendar: Calendar): Flow<List<UpdatesWithRelations>> = subscribe(calendar.time.time)
fun subscribe(after: Long): Flow<List<UpdatesWithRelations>> { fun subscribe(after: Long): Flow<List<UpdatesWithRelations>> {
return repository.subscribeAll(after) return repository.subscribeAll(after)
.onEach { updates ->
// Set unread chapter count for bottom bar badge
preferences.unreadUpdatesCount().set(updates.count { !it.read })
}
} }
} }

View File

@ -37,13 +37,6 @@ object SettingsGeneralScreen : SearchableSettings {
val prefs = remember { Injekt.get<BasePreferences>() } val prefs = remember { Injekt.get<BasePreferences>() }
val libraryPrefs = remember { Injekt.get<LibraryPreferences>() } val libraryPrefs = remember { Injekt.get<LibraryPreferences>() }
return mutableListOf<Preference>().apply { return mutableListOf<Preference>().apply {
add(
Preference.PreferenceItem.SwitchPreference(
pref = libraryPrefs.showUpdatesNavBadge(),
title = stringResource(R.string.pref_library_update_show_tab_badge),
),
)
add( add(
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = prefs.confirmExit(), pref = prefs.confirmExit(),

View File

@ -26,6 +26,7 @@ import eu.kanade.domain.track.interactor.InsertTrack
import eu.kanade.domain.track.model.toDbTrack import eu.kanade.domain.track.model.toDbTrack
import eu.kanade.domain.track.model.toDomainTrack import eu.kanade.domain.track.model.toDomainTrack
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.core.preference.getAndSet
import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.cache.CoverCache
import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.DownloadManager
import eu.kanade.tachiyomi.data.download.DownloadService import eu.kanade.tachiyomi.data.download.DownloadService
@ -312,7 +313,6 @@ class LibraryUpdateService(
val failedUpdates = CopyOnWriteArrayList<Pair<Manga, String?>>() val failedUpdates = CopyOnWriteArrayList<Pair<Manga, String?>>()
val hasDownloads = AtomicBoolean(false) val hasDownloads = AtomicBoolean(false)
val loggedServices by lazy { trackManager.services.filter { it.isLogged } } val loggedServices by lazy { trackManager.services.filter { it.isLogged } }
val currentUnreadUpdatesCount = libraryPreferences.unreadUpdatesCount().get()
val restrictions = libraryPreferences.libraryUpdateMangaRestriction().get() val restrictions = libraryPreferences.libraryUpdateMangaRestriction().get()
withIOContext { withIOContext {
@ -362,6 +362,8 @@ class LibraryUpdateService(
hasDownloads.set(true) hasDownloads.set(true)
} }
libraryPreferences.newUpdatesCount().getAndSet { it + newChapters.size }
// Convert to the manga that contains new chapters // Convert to the manga that contains new chapters
newUpdates.add(manga to newChapters.toTypedArray()) newUpdates.add(manga to newChapters.toTypedArray())
} }
@ -392,8 +394,6 @@ class LibraryUpdateService(
if (newUpdates.isNotEmpty()) { if (newUpdates.isNotEmpty()) {
notifier.showUpdateNotifications(newUpdates) notifier.showUpdateNotifications(newUpdates)
val newChapterCount = newUpdates.sumOf { it.second.size }
libraryPreferences.unreadUpdatesCount().set(currentUnreadUpdatesCount + newChapterCount)
if (hasDownloads.get()) { if (hasDownloads.get()) {
DownloadService.start(this) DownloadService.start(this)
} }

View File

@ -40,7 +40,6 @@ import eu.kanade.domain.source.service.SourcePreferences
import eu.kanade.presentation.components.NavigationBar import eu.kanade.presentation.components.NavigationBar
import eu.kanade.presentation.components.NavigationRail import eu.kanade.presentation.components.NavigationRail
import eu.kanade.presentation.components.Scaffold import eu.kanade.presentation.components.Scaffold
import eu.kanade.presentation.util.Tab
import eu.kanade.presentation.util.Transition import eu.kanade.presentation.util.Transition
import eu.kanade.presentation.util.isTabletUi import eu.kanade.presentation.util.isTabletUi
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
@ -52,7 +51,6 @@ import eu.kanade.tachiyomi.ui.more.MoreTab
import eu.kanade.tachiyomi.ui.updates.UpdatesTab import eu.kanade.tachiyomi.ui.updates.UpdatesTab
import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
@ -219,11 +217,8 @@ object HomeScreen : Screen {
when { when {
tab is UpdatesTab -> { tab is UpdatesTab -> {
val count by produceState(initialValue = 0) { val count by produceState(initialValue = 0) {
val pref = Injekt.get<LibraryPreferences>() Injekt.get<LibraryPreferences>()
combine( .newUpdatesCount().changes()
pref.showUpdatesNavBadge().changes(),
pref.unreadUpdatesCount().changes(),
) { show, count -> if (show) count else 0 }
.collectLatest { value = it } .collectLatest { value = it }
} }
if (count > 0) { if (count > 0) {

View File

@ -60,10 +60,10 @@ class UpdatesScreenModel(
private val getUpdates: GetUpdates = Injekt.get(), private val getUpdates: GetUpdates = Injekt.get(),
private val getManga: GetManga = Injekt.get(), private val getManga: GetManga = Injekt.get(),
private val getChapter: GetChapter = Injekt.get(), private val getChapter: GetChapter = Injekt.get(),
private val libraryPreferences: LibraryPreferences = Injekt.get(),
val snackbarHostState: SnackbarHostState = SnackbarHostState(), val snackbarHostState: SnackbarHostState = SnackbarHostState(),
basePreferences: BasePreferences = Injekt.get(), basePreferences: BasePreferences = Injekt.get(),
uiPreferences: UiPreferences = Injekt.get(), uiPreferences: UiPreferences = Injekt.get(),
libraryPreferences: LibraryPreferences = Injekt.get(),
) : StateScreenModel<UpdatesState>(UpdatesState()) { ) : StateScreenModel<UpdatesState>(UpdatesState()) {
private val _events: Channel<Event> = Channel(Int.MAX_VALUE) private val _events: Channel<Event> = Channel(Int.MAX_VALUE)
@ -371,6 +371,10 @@ class UpdatesScreenModel(
mutableState.update { it.copy(dialog = dialog) } mutableState.update { it.copy(dialog = dialog) }
} }
fun resetNewUpdatesCount() {
libraryPreferences.newUpdatesCount().set(0)
}
sealed class Dialog { sealed class Dialog {
data class DeleteConfirmation(val toDelete: List<UpdatesItem>) : Dialog() data class DeleteConfirmation(val toDelete: List<UpdatesItem>) : Dialog()
} }

View File

@ -4,6 +4,7 @@ import androidx.compose.animation.graphics.res.animatedVectorResource
import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter
import androidx.compose.animation.graphics.vector.AnimatedImageVector import androidx.compose.animation.graphics.vector.AnimatedImageVector
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@ -110,5 +111,12 @@ object UpdatesTab : Tab {
(context as? MainActivity)?.ready = true (context as? MainActivity)?.ready = true
} }
} }
DisposableEffect(Unit) {
screenModel.resetNewUpdatesCount()
onDispose {
screenModel.resetNewUpdatesCount()
}
}
} }
} }

View File

@ -254,7 +254,6 @@
<string name="pref_update_only_completely_read">With unread chapter(s)</string> <string name="pref_update_only_completely_read">With unread chapter(s)</string>
<string name="pref_update_only_non_completed">With \"Completed\" status</string> <string name="pref_update_only_non_completed">With \"Completed\" status</string>
<string name="pref_update_only_started">That haven\'t been started</string> <string name="pref_update_only_started">That haven\'t been started</string>
<string name="pref_library_update_show_tab_badge">Show unread count on Updates icon</string>
<string name="pref_library_update_refresh_metadata">Automatically refresh metadata</string> <string name="pref_library_update_refresh_metadata">Automatically refresh metadata</string>
<string name="pref_library_update_refresh_metadata_summary">Check for new cover and details when updating library</string> <string name="pref_library_update_refresh_metadata_summary">Check for new cover and details when updating library</string>
<string name="pref_library_update_refresh_trackers">Automatically refresh trackers</string> <string name="pref_library_update_refresh_trackers">Automatically refresh trackers</string>