Control library badge visibility with props instead

Fixes #8174

(cherry picked from commit 6635dd2990851d830e83a628b7e62091bd20cb43)

# Conflicts:
#	app/src/main/java/eu/kanade/presentation/library/components/LibraryComfortableGrid.kt
#	app/src/main/java/eu/kanade/presentation/library/components/LibraryCompactGrid.kt
#	app/src/main/java/eu/kanade/presentation/library/components/LibraryContent.kt
#	app/src/main/java/eu/kanade/presentation/library/components/LibraryCoverOnlyGrid.kt
#	app/src/main/java/eu/kanade/presentation/library/components/LibraryGridCover.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt
This commit is contained in:
arkon 2022-10-16 11:30:54 -04:00 committed by Jobobby04
parent aebfef345b
commit 0b5b9cb5cc
12 changed files with 253 additions and 207 deletions

View File

@ -120,6 +120,13 @@ fun LibraryScreen(
// SY <--
getColumnsForOrientation = { presenter.getColumnsPreferenceForCurrentOrientation(it) },
getLibraryForPage = { presenter.getMangaForCategory(page = it) },
showDownloadBadges = presenter.showDownloadBadges,
showUnreadBadges = presenter.showUnreadBadges,
showLocalBadges = presenter.showLocalBadges,
showLanguageBadges = presenter.showLanguageBadges,
// SY -->
showStartReadingButton = presenter.showStartReadingButton,
// SY <--
isIncognitoMode = presenter.isIncognitoMode,
isDownloadOnly = presenter.isDownloadOnly,
// SY -->

View File

@ -0,0 +1,53 @@
package eu.kanade.presentation.library.components
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import eu.kanade.presentation.components.Badge
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.library.LibraryItem
@Composable
fun DownloadsBadge(
enabled: Boolean,
item: LibraryItem,
) {
if (enabled && item.downloadCount > 0) {
Badge(
text = "${item.downloadCount}",
color = MaterialTheme.colorScheme.tertiary,
textColor = MaterialTheme.colorScheme.onTertiary,
)
}
}
@Composable
fun UnreadBadge(
enabled: Boolean,
item: LibraryItem,
) {
if (enabled && item.unreadCount > 0) {
Badge(text = "${item.unreadCount}")
}
}
@Composable
fun LanguageBadge(
showLanguage: Boolean,
showLocal: Boolean,
item: LibraryItem,
) {
if (showLocal && item.isLocal) {
Badge(
text = stringResource(R.string.local_source_badge),
color = MaterialTheme.colorScheme.tertiary,
textColor = MaterialTheme.colorScheme.onTertiary,
)
} else if (showLanguage && item.sourceLanguage.isNotEmpty()) {
Badge(
text = item.sourceLanguage.uppercase(),
color = MaterialTheme.colorScheme.tertiary,
textColor = MaterialTheme.colorScheme.onTertiary,
)
}
}

View File

@ -20,6 +20,13 @@ import eu.kanade.tachiyomi.ui.library.LibraryItem
@Composable
fun LibraryComfortableGrid(
items: List<LibraryItem>,
showDownloadBadges: Boolean,
showUnreadBadges: Boolean,
showLocalBadges: Boolean,
showLanguageBadges: Boolean,
// SY -->
showStartReadingButton: Boolean,
// SY <--
columns: Int,
contentPadding: PaddingValues,
selection: List<LibraryManga>,
@ -43,12 +50,19 @@ fun LibraryComfortableGrid(
contentType = { "library_comfortable_grid_item" },
) { libraryItem ->
LibraryComfortableGridItem(
libraryItem,
libraryItem.libraryManga in selection,
onClick,
onLongClick,
item = libraryItem,
showDownloadBadge = showDownloadBadges,
showUnreadBadge = showUnreadBadges,
showLocalBadge = showLocalBadges,
showLanguageBadge = showLanguageBadges,
// SY -->
onOpenReader,
showStartReadingButton = showStartReadingButton,
// SY <--
isSelected = libraryItem.libraryManga in selection,
onClick = onClick,
onLongClick = onLongClick,
// SY -->
onOpenReader = onOpenReader,
// SY <--
)
}
@ -58,10 +72,19 @@ fun LibraryComfortableGrid(
@Composable
fun LibraryComfortableGridItem(
item: LibraryItem,
showDownloadBadge: Boolean,
showUnreadBadge: Boolean,
showLocalBadge: Boolean,
showLanguageBadge: Boolean,
// SY -->
showStartReadingButton: Boolean,
// SY <--
isSelected: Boolean,
onClick: (LibraryManga) -> Unit,
onLongClick: (LibraryManga) -> Unit,
// SY -->
onOpenReader: (LibraryManga) -> Unit,
// SY <--
) {
val libraryManga = item.libraryManga
val manga = libraryManga.manga
@ -85,12 +108,13 @@ fun LibraryComfortableGridItem(
manga.thumbnailUrl,
manga.coverLastModified,
),
downloadCount = item.downloadCount,
unreadCount = item.unreadCount,
isLocal = item.isLocal,
language = item.sourceLanguage,
item = item,
showDownloadBadge = showDownloadBadge,
showUnreadBadge = showUnreadBadge,
showLocalBadge = showLocalBadge,
showLanguageBadge = showLanguageBadge,
// SY -->
showPlayButton = item.startReadingButton && item.libraryManga.unreadCount > 0,
showStartReadingButton = showStartReadingButton && item.libraryManga.unreadCount > 0,
onOpenReader = {
onOpenReader(item.libraryManga)
},

View File

@ -29,6 +29,13 @@ import eu.kanade.tachiyomi.ui.library.LibraryItem
@Composable
fun LibraryCompactGrid(
items: List<LibraryItem>,
showDownloadBadges: Boolean,
showUnreadBadges: Boolean,
showLocalBadges: Boolean,
showLanguageBadges: Boolean,
// SY -->
showStartReadingButton: Boolean,
// SY <--
columns: Int,
contentPadding: PaddingValues,
selection: List<LibraryManga>,
@ -53,6 +60,13 @@ fun LibraryCompactGrid(
) { libraryItem ->
LibraryCompactGridItem(
item = libraryItem,
showDownloadBadge = showDownloadBadges,
showUnreadBadge = showUnreadBadges,
showLocalBadge = showLocalBadges,
showLanguageBadge = showLanguageBadges,
// SY -->
showStartReadingButton = showStartReadingButton,
// SY <--
isSelected = libraryItem.libraryManga in selection,
onClick = onClick,
onLongClick = onLongClick,
@ -67,6 +81,13 @@ fun LibraryCompactGrid(
@Composable
fun LibraryCompactGridItem(
item: LibraryItem,
showDownloadBadge: Boolean,
showUnreadBadge: Boolean,
showLocalBadge: Boolean,
showLanguageBadge: Boolean,
// SY -->
showStartReadingButton: Boolean,
// SY <--
isSelected: Boolean,
onClick: (LibraryManga) -> Unit,
onLongClick: (LibraryManga) -> Unit,
@ -94,12 +115,13 @@ fun LibraryCompactGridItem(
manga.thumbnailUrl,
manga.coverLastModified,
),
downloadCount = item.downloadCount,
unreadCount = item.unreadCount,
isLocal = item.isLocal,
language = item.sourceLanguage,
item = item,
showDownloadBadge = showDownloadBadge,
showUnreadBadge = showUnreadBadge,
showLocalBadge = showLocalBadge,
showLanguageBadge = showLanguageBadge,
// SY -->
showPlayButton = item.startReadingButton && item.libraryManga.unreadCount > 0,
showStartReadingButton = showStartReadingButton && item.libraryManga.unreadCount > 0,
playButtonPosition = PlayButtonPosition.Top,
onOpenReader = {
onOpenReader(item.libraryManga)

View File

@ -24,7 +24,6 @@ import eu.kanade.domain.library.model.LibraryDisplayMode
import eu.kanade.domain.library.model.LibraryManga
import eu.kanade.presentation.components.SwipeRefresh
import eu.kanade.presentation.library.LibraryState
import eu.kanade.presentation.util.plus
import eu.kanade.tachiyomi.ui.library.LibraryItem
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@ -35,8 +34,6 @@ fun LibraryContent(
contentPadding: PaddingValues,
currentPage: () -> Int,
isLibraryEmpty: Boolean,
isDownloadOnly: Boolean,
isIncognitoMode: Boolean,
showPageTabs: Boolean,
showMangaCount: Boolean,
onChangeCurrentPage: (Int) -> Unit,
@ -49,6 +46,15 @@ fun LibraryContent(
getDisplayModeForPage: @Composable (Int) -> LibraryDisplayMode,
getColumnsForOrientation: (Boolean) -> PreferenceMutableState<Int>,
getLibraryForPage: @Composable (Int) -> List<LibraryItem>,
showDownloadBadges: Boolean,
showUnreadBadges: Boolean,
showLocalBadges: Boolean,
showLanguageBadges: Boolean,
// SY -->
showStartReadingButton: Boolean,
// SY <--
isDownloadOnly: Boolean,
isIncognitoMode: Boolean,
// SY -->
onOpenReader: (LibraryManga) -> Unit,
getCategoryName: (Context, Category, Int, String) -> String,
@ -120,6 +126,13 @@ fun LibraryContent(
getDisplayModeForPage = getDisplayModeForPage,
getColumnsForOrientation = getColumnsForOrientation,
getLibraryForPage = getLibraryForPage,
showDownloadBadges = showDownloadBadges,
showUnreadBadges = showUnreadBadges,
showLocalBadges = showLocalBadges,
showLanguageBadges = showLanguageBadges,
// SY -->
showStartReadingButton = showStartReadingButton,
// SY <--
onClickManga = onClickManga,
onLongClickManga = onLongClickManga,
onGlobalSearchClicked = onGlobalSearchClicked,

View File

@ -12,6 +12,13 @@ import eu.kanade.tachiyomi.ui.library.LibraryItem
@Composable
fun LibraryCoverOnlyGrid(
items: List<LibraryItem>,
showDownloadBadges: Boolean,
showUnreadBadges: Boolean,
showLocalBadges: Boolean,
showLanguageBadges: Boolean,
// SY -->
showStartReadingButton: Boolean,
// SY <--
columns: Int,
contentPadding: PaddingValues,
selection: List<LibraryManga>,
@ -36,6 +43,13 @@ fun LibraryCoverOnlyGrid(
) { libraryItem ->
LibraryCoverOnlyGridItem(
item = libraryItem,
showDownloadBadge = showDownloadBadges,
showUnreadBadge = showUnreadBadges,
showLocalBadge = showLocalBadges,
showLanguageBadge = showLanguageBadges,
// SY -->
showStartReadingButton = showStartReadingButton,
// SY <--
isSelected = libraryItem.libraryManga in selection,
onClick = onClick,
onLongClick = onLongClick,
@ -50,6 +64,13 @@ fun LibraryCoverOnlyGrid(
@Composable
fun LibraryCoverOnlyGridItem(
item: LibraryItem,
showDownloadBadge: Boolean,
showUnreadBadge: Boolean,
showLocalBadge: Boolean,
showLanguageBadge: Boolean,
// SY -->
showStartReadingButton: Boolean,
// SY <--
isSelected: Boolean,
onClick: (LibraryManga) -> Unit,
onLongClick: (LibraryManga) -> Unit,
@ -77,12 +98,13 @@ fun LibraryCoverOnlyGridItem(
manga.thumbnailUrl,
manga.coverLastModified,
),
downloadCount = item.downloadCount,
unreadCount = item.unreadCount,
isLocal = item.isLocal,
language = item.sourceLanguage,
item = item,
showDownloadBadge = showDownloadBadge,
showUnreadBadge = showUnreadBadge,
showLocalBadge = showLocalBadge,
showLanguageBadge = showLanguageBadge,
// SY -->
showPlayButton = item.startReadingButton && item.libraryManga.unreadCount > 0,
showStartReadingButton = showStartReadingButton && item.libraryManga.unreadCount > 0,
onOpenReader = {
onOpenReader(item.libraryManga)
},

View File

@ -7,16 +7,13 @@ import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import eu.kanade.presentation.components.Badge
import eu.kanade.presentation.components.BadgeGroup
import eu.kanade.presentation.components.MangaCover
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.library.LibraryItem
@Composable
fun MangaGridCover(
@ -25,7 +22,7 @@ fun MangaGridCover(
badgesStart: (@Composable RowScope.() -> Unit)? = null,
badgesEnd: (@Composable RowScope.() -> Unit)? = null,
// SY -->
showPlayButton: Boolean = false,
showStartReadingButton: Boolean = false,
playButtonPosition: PlayButtonPosition = PlayButtonPosition.Bottom,
onOpenReader: () -> Unit = {},
// SY <--
@ -62,11 +59,11 @@ fun MangaGridCover(
)
}
// SY -->
if (showPlayButton && playButtonPosition == PlayButtonPosition.Top) {
if (showStartReadingButton && playButtonPosition == PlayButtonPosition.Top) {
StartReadingButton(onOpenReader = onOpenReader)
}
}
if (showPlayButton && playButtonPosition == PlayButtonPosition.Bottom) {
if (showStartReadingButton && playButtonPosition == PlayButtonPosition.Bottom) {
StartReadingButton(
Modifier.align(playButtonPosition.alignment),
onOpenReader = onOpenReader,
@ -80,12 +77,13 @@ fun MangaGridCover(
fun LibraryGridCover(
modifier: Modifier = Modifier,
mangaCover: eu.kanade.domain.manga.model.MangaCover,
downloadCount: Long,
unreadCount: Long,
isLocal: Boolean,
language: String,
item: LibraryItem,
showDownloadBadge: Boolean,
showUnreadBadge: Boolean,
showLocalBadge: Boolean,
showLanguageBadge: Boolean,
// SY -->
showPlayButton: Boolean,
showStartReadingButton: Boolean,
playButtonPosition: PlayButtonPosition = PlayButtonPosition.Bottom,
onOpenReader: () -> Unit,
// SY <--
@ -100,34 +98,14 @@ fun LibraryGridCover(
)
},
badgesStart = {
if (downloadCount > 0) {
Badge(
text = "$downloadCount",
color = MaterialTheme.colorScheme.tertiary,
textColor = MaterialTheme.colorScheme.onTertiary,
)
}
if (unreadCount > 0) {
Badge(text = "$unreadCount")
}
DownloadsBadge(enabled = showDownloadBadge, item = item)
UnreadBadge(enabled = showUnreadBadge, item = item)
},
badgesEnd = {
if (isLocal) {
Badge(
text = stringResource(R.string.local_source_badge),
color = MaterialTheme.colorScheme.tertiary,
textColor = MaterialTheme.colorScheme.onTertiary,
)
} else if (language.isNotEmpty()) {
Badge(
text = language,
color = MaterialTheme.colorScheme.tertiary,
textColor = MaterialTheme.colorScheme.onTertiary,
)
}
LanguageBadge(showLanguage = showLanguageBadge, showLocal = showLocalBadge, item = item)
},
// SY -->
showPlayButton = showPlayButton,
showStartReadingButton = showStartReadingButton,
playButtonPosition = playButtonPosition,
onOpenReader = onOpenReader,
// SY <--

View File

@ -21,7 +21,6 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex
import eu.kanade.domain.library.model.LibraryManga
import eu.kanade.domain.manga.model.MangaCover
import eu.kanade.presentation.components.Badge
import eu.kanade.presentation.components.BadgeGroup
import eu.kanade.presentation.components.FastScrollLazyColumn
import eu.kanade.presentation.components.MangaCover.Square
@ -35,6 +34,10 @@ import eu.kanade.tachiyomi.ui.library.LibraryItem
@Composable
fun LibraryList(
items: List<LibraryItem>,
showDownloadBadges: Boolean,
showUnreadBadges: Boolean,
showLocalBadges: Boolean,
showLanguageBadges: Boolean,
contentPadding: PaddingValues,
selection: List<LibraryManga>,
onClick: (LibraryManga) -> Unit,
@ -63,6 +66,10 @@ fun LibraryList(
) { libraryItem ->
LibraryListItem(
item = libraryItem,
showDownloadBadge = showDownloadBadges,
showUnreadBadge = showUnreadBadges,
showLocalBadge = showLocalBadges,
showLanguageBadge = showLanguageBadges,
isSelected = libraryItem.libraryManga in selection,
onClick = onClick,
onLongClick = onLongClick,
@ -74,6 +81,10 @@ fun LibraryList(
@Composable
fun LibraryListItem(
item: LibraryItem,
showDownloadBadge: Boolean,
showUnreadBadge: Boolean,
showLocalBadge: Boolean,
showLanguageBadge: Boolean,
isSelected: Boolean,
onClick: (LibraryManga) -> Unit,
onLongClick: (LibraryManga) -> Unit,
@ -93,30 +104,9 @@ fun LibraryListItem(
onClick = { onClick(libraryManga) },
onLongClick = { onLongClick(libraryManga) },
) {
if (item.downloadCount > 0) {
Badge(
text = "${item.downloadCount}",
color = MaterialTheme.colorScheme.tertiary,
textColor = MaterialTheme.colorScheme.onTertiary,
)
}
if (item.unreadCount > 0) {
Badge(text = "${item.unreadCount}")
}
if (item.isLocal) {
Badge(
text = stringResource(R.string.local_source_badge),
color = MaterialTheme.colorScheme.tertiary,
textColor = MaterialTheme.colorScheme.onTertiary,
)
}
if (item.isLocal.not() && item.sourceLanguage.isNotEmpty()) {
Badge(
text = item.sourceLanguage,
color = MaterialTheme.colorScheme.tertiary,
textColor = MaterialTheme.colorScheme.onTertiary,
)
}
DownloadsBadge(enabled = showDownloadBadge, item = item)
UnreadBadge(enabled = showUnreadBadge, item = item)
LanguageBadge(showLanguage = showLanguageBadge, showLocal = showLocalBadge, item = item)
}
}

View File

@ -28,6 +28,13 @@ fun LibraryPager(
getDisplayModeForPage: @Composable (Int) -> LibraryDisplayMode,
getColumnsForOrientation: (Boolean) -> PreferenceMutableState<Int>,
getLibraryForPage: @Composable (Int) -> List<LibraryItem>,
showDownloadBadges: Boolean,
showUnreadBadges: Boolean,
showLocalBadges: Boolean,
showLanguageBadges: Boolean,
// SY -->
showStartReadingButton: Boolean,
// SY <--
onClickManga: (LibraryManga) -> Unit,
onLongClickManga: (LibraryManga) -> Unit,
// SY -->
@ -59,6 +66,10 @@ fun LibraryPager(
LibraryDisplayMode.List -> {
LibraryList(
items = library,
showDownloadBadges = showDownloadBadges,
showUnreadBadges = showUnreadBadges,
showLocalBadges = showLocalBadges,
showLanguageBadges = showLanguageBadges,
contentPadding = contentPadding,
selection = selectedManga,
onClick = onClickManga,
@ -70,6 +81,13 @@ fun LibraryPager(
LibraryDisplayMode.CompactGrid -> {
LibraryCompactGrid(
items = library,
showDownloadBadges = showDownloadBadges,
showUnreadBadges = showUnreadBadges,
showLocalBadges = showLocalBadges,
showLanguageBadges = showLanguageBadges,
// SY -->
showStartReadingButton = showStartReadingButton,
// SY <--
columns = columns,
contentPadding = contentPadding,
selection = selectedManga,
@ -85,6 +103,13 @@ fun LibraryPager(
LibraryDisplayMode.ComfortableGrid -> {
LibraryComfortableGrid(
items = library,
showDownloadBadges = showDownloadBadges,
showUnreadBadges = showUnreadBadges,
showLocalBadges = showLocalBadges,
showLanguageBadges = showLanguageBadges,
// SY -->
showStartReadingButton = showStartReadingButton,
// SY <--
columns = columns,
contentPadding = contentPadding,
selection = selectedManga,
@ -100,6 +125,13 @@ fun LibraryPager(
LibraryDisplayMode.CoverOnlyGrid -> {
LibraryCoverOnlyGrid(
items = library,
showDownloadBadges = showDownloadBadges,
showUnreadBadges = showUnreadBadges,
showLocalBadges = showLocalBadges,
showLanguageBadges = showLanguageBadges,
// SY -->
showStartReadingButton = showStartReadingButton,
// SY <--
columns = columns,
contentPadding = contentPadding,
selection = selectedManga,

View File

@ -210,13 +210,10 @@ class LibraryController(
when (group) {
is LibrarySettingsSheet.Filter.FilterGroup -> onFilterChanged()
is LibrarySettingsSheet.Sort.SortGroup -> onSortChanged()
is LibrarySettingsSheet.Display.DisplayGroup -> {}
is LibrarySettingsSheet.Display.BadgeGroup -> onBadgeSettingChanged()
is LibrarySettingsSheet.Display.TabsGroup -> {} // onTabsSettingsChanged()
// SY -->
is LibrarySettingsSheet.Grouping.InternalGroup -> onGroupSettingChanged()
is LibrarySettingsSheet.Display.ButtonsGroup -> onButtonSettingChanged()
// SY -->
// SY <--
else -> {} // Handled via different mechanisms
}
}
}
@ -245,15 +242,7 @@ class LibraryController(
activity?.invalidateOptionsMenu()
}
private fun onBadgeSettingChanged() {
presenter.requestBadgesUpdate()
}
// SY -->
private fun onButtonSettingChanged() {
presenter.requestButtonsUpdate()
}
private fun onGroupSettingChanged() {
presenter.requestGroupsUpdate()
}

View File

@ -17,10 +17,6 @@ class LibraryItem(
var isLocal = false
var sourceLanguage = ""
// SY -->
var startReadingButton = false
// SY <--
/**
* Filters a manga depending on a query.
*

View File

@ -159,6 +159,15 @@ class LibraryPresenter(
val tabVisibility by libraryPreferences.categoryTabs().asState()
val mangaCountVisibility by libraryPreferences.categoryNumberOfItems().asState()
val showDownloadBadges by libraryPreferences.downloadBadge().asState()
val showUnreadBadges by libraryPreferences.unreadBadge().asState()
val showLocalBadges by libraryPreferences.localBadge().asState()
val showLanguageBadges by libraryPreferences.languageBadge().asState()
// SY -->
val showStartReadingButton by libraryPreferences.startReadingButton().asState()
// SY <--
var activeCategory: Int by libraryPreferences.lastUsedCategory().asState()
val isDownloadOnly: Boolean by preferences.downloadedOnly().asState()
@ -169,11 +178,6 @@ class LibraryPresenter(
*/
private val filterTriggerRelay = BehaviorRelay.create(Unit)
/**
* Relay used to apply the UI update to the last emission of the library.
*/
private val badgeTriggerRelay = BehaviorRelay.create(Unit)
/**
* Relay used to apply the selected sorting method to the last emission of the library.
*/
@ -192,11 +196,6 @@ class LibraryPresenter(
}
}
/**
* Relay used to apply the UI update to the last emission of the library.
*/
private val buttonTriggerRelay = BehaviorRelay.create(Unit)
/**
* Relay used to apply the UI update to the last emission of the library.
*/
@ -227,18 +226,12 @@ class LibraryPresenter(
* TODO: Move this to a coroutine world
* - Move filter and sort to getMangaForCategory and only filter and sort the current display category instead of whole library as some has 5000+ items in the library
* - Create new db view and new query to just fetch the current category save as needed to instance variable
* - Fetch badges to maps and retrive as needed instead of fetching all of them at once
* - Fetch badges to maps and retrieve as needed instead of fetching all of them at once
*/
if (librarySubscription == null || librarySubscription!!.isCancelled) {
librarySubscription = presenterScope.launchIO {
getLibraryFlow().asObservable()
.combineLatest(badgeTriggerRelay.observeOn(Schedulers.io())) { lib, _ ->
lib.apply { setBadges(mangaMap) }
}
// SY -->
.combineLatest(buttonTriggerRelay.observeOn(Schedulers.io())) { lib, _ ->
lib.apply { setButtons(mangaMap) }
}
.combineLatest(groupingTriggerRelay.observeOn(Schedulers.io())) { lib, _ ->
val (map, categories) = applyGrouping(lib.mangaMap, lib.categories)
lib.copy(mangaMap = map, categories = categories)
@ -302,7 +295,7 @@ class LibraryPresenter(
val filterFnUnread: (LibraryItem) -> Boolean = unread@{ item ->
if (filterUnread == State.IGNORE.value) return@unread true
val isUnread = item.libraryManga.unreadCount != 0L
val isUnread = item.libraryManga.unreadCount > 0
return@unread if (filterUnread == State.INCLUDE.value) {
isUnread
@ -400,74 +393,6 @@ class LibraryPresenter(
return map.mapValues { entry -> entry.value.filter(filterFn) }
}
// SY -->
/**
* Sets the button on each manga.
*
* @param map the map of manga.
*/
private fun setButtons(map: LibraryMap) {
val startReadingButton = libraryPreferences.startReadingButton().get()
for ((_, itemList) in map) {
for (item in itemList) {
item.startReadingButton = startReadingButton
}
}
}
// SY <--
/**
* Sets downloaded chapter count to each manga.
*
* @param map the map of manga.
*/
private fun setBadges(map: LibraryMap) {
val showDownloadBadges = libraryPreferences.downloadBadge().get()
val showUnreadBadges = libraryPreferences.unreadBadge().get()
val showLocalBadges = libraryPreferences.localBadge().get()
val showLanguageBadges = libraryPreferences.languageBadge().get()
for ((_, itemList) in map) {
for (item in itemList) {
item.downloadCount = if (showDownloadBadges) {
// SY -->
if (item.libraryManga.manga.source == MERGED_SOURCE_ID) {
runBlocking {
getMergedMangaById.await(item.libraryManga.manga.id)
}.sumOf { downloadManager.getDownloadCount(it) }.toLong()
} else {
/* SY <-- */ downloadManager.getDownloadCount(item.libraryManga.manga).toLong()
}
} else {
// Unset download count if not enabled
-1
}
item.unreadCount = if (showUnreadBadges) {
item.libraryManga.unreadCount
} else {
// Unset unread count if not enabled
-1
}
item.isLocal = if (showLocalBadges) {
item.libraryManga.manga.isLocal()
} else {
// Hide / Unset local badge if not enabled
false
}
item.sourceLanguage = if (showLanguageBadges) {
sourceManager.getOrStub(item.libraryManga.manga.source).lang.uppercase()
} else {
// Unset source language if not enabled
""
}
}
}
}
/**
* Applies library sorting to the given map of manga.
*
@ -614,8 +539,19 @@ class LibraryPresenter(
.map { list ->
list.map { libraryManga ->
// Display mode based on user preference: take it from global library setting or category
LibraryItem(libraryManga)
}.groupBy { it.libraryManga.category.toLong() }
LibraryItem(libraryManga).apply {
downloadCount = /* SY --> */ if (libraryManga.manga.source == MERGED_SOURCE_ID) {
runBlocking {
getMergedMangaById.await(libraryManga.manga.id)
}.sumOf { downloadManager.getDownloadCount(it) }.toLong()
} else {
downloadManager.getDownloadCount(libraryManga.manga).toLong()
} /* SY <-- */
unreadCount = libraryManga.unreadCount
isLocal = libraryManga.manga.isLocal()
sourceLanguage = sourceManager.getOrStub(libraryManga.manga.source).lang
}
}.groupBy { it.libraryManga.category }
}
return combine(categoriesFlow, libraryMangasFlow) { dbCategories, libraryManga ->
val categories = if (libraryManga.isNotEmpty() && libraryManga.containsKey(0).not()) {
@ -664,7 +600,7 @@ class LibraryPresenter(
*/
private fun getFilterObservable(): Observable<Map<Long, Map<Long, Boolean>>> {
return filterTriggerRelay.observeOn(Schedulers.io())
.combineLatest(getTracksObservable()) { _, tracks -> tracks }
.combineLatest(getTracksFlow().asObservable().observeOn(Schedulers.io())) { _, tracks -> tracks }
}
/**
@ -672,7 +608,7 @@ class LibraryPresenter(
*
* @return an observable of tracked manga.
*/
private fun getTracksObservable(): Observable<Map<Long, Map<Long, Boolean>>> {
private fun getTracksFlow(): Flow<Map<Long, Map<Long, Boolean>>> {
// TODO: Move this to domain/data layer
return getTracks.subscribe()
.map { tracks ->
@ -685,8 +621,6 @@ class LibraryPresenter(
}
}
}
.asObservable()
.observeOn(Schedulers.io())
}
/**
@ -696,21 +630,7 @@ class LibraryPresenter(
filterTriggerRelay.call(Unit)
}
/**
* Requests the library to have download badges added.
*/
fun requestBadgesUpdate() {
badgeTriggerRelay.call(Unit)
}
// SY -->
/**
* Requests the library to have buttons toggled.
*/
fun requestButtonsUpdate() {
buttonTriggerRelay.call(Unit)
}
/**
* Requests the library to have groups refreshed.
*/