Clean up UpdatesController

- Move loading state into scaffold (closes #7704)
- Move logic into presenter
- Make some composables private
This commit is contained in:
arkon
2022-09-18 22:38:44 -04:00
parent f85cbb1582
commit 0e3176a77c
14 changed files with 159 additions and 155 deletions

View File

@@ -406,7 +406,7 @@ private fun SourceSwitchPreference(
}
@Composable
fun NsfwWarningDialog(
private fun NsfwWarningDialog(
onClickConfirm: () -> Unit,
) {
AlertDialog(

View File

@@ -61,7 +61,7 @@ fun ExtensionFilterScreen(
}
@Composable
fun SourceFilterContent(
private fun SourceFilterContent(
contentPadding: PaddingValues,
state: ExtensionFilterState,
onClickLang: (String) -> Unit,
@@ -83,7 +83,7 @@ fun SourceFilterContent(
}
@Composable
fun ExtensionFilterItem(
private fun ExtensionFilterItem(
modifier: Modifier,
lang: String,
enabled: Boolean,

View File

@@ -91,7 +91,7 @@ fun ExtensionScreen(
}
@Composable
fun ExtensionContent(
private fun ExtensionContent(
state: ExtensionsState,
onLongClickItem: (Extension) -> Unit,
onClickItemCancel: (Extension) -> Unit,
@@ -201,7 +201,7 @@ fun ExtensionContent(
}
@Composable
fun ExtensionItem(
private fun ExtensionItem(
modifier: Modifier = Modifier,
item: ExtensionUiModel.Item,
onClickItem: (Extension) -> Unit,
@@ -238,7 +238,7 @@ fun ExtensionItem(
}
@Composable
fun ExtensionItemContent(
private fun ExtensionItemContent(
extension: Extension,
modifier: Modifier = Modifier,
) {
@@ -294,7 +294,7 @@ fun ExtensionItemContent(
}
@Composable
fun ExtensionItemActions(
private fun ExtensionItemActions(
extension: Extension,
installStep: InstallStep,
modifier: Modifier = Modifier,
@@ -348,7 +348,7 @@ fun ExtensionItemActions(
}
@Composable
fun ExtensionHeader(
private fun ExtensionHeader(
@StringRes textRes: Int,
modifier: Modifier = Modifier,
action: @Composable RowScope.() -> Unit = {},
@@ -361,7 +361,7 @@ fun ExtensionHeader(
}
@Composable
fun ExtensionHeader(
private fun ExtensionHeader(
text: String,
modifier: Modifier = Modifier,
action: @Composable RowScope.() -> Unit = {},
@@ -382,7 +382,7 @@ fun ExtensionHeader(
}
@Composable
fun ExtensionTrustDialog(
private fun ExtensionTrustDialog(
onClickConfirm: () -> Unit,
onClickDismiss: () -> Unit,
onDismissRequest: () -> Unit,

View File

@@ -62,7 +62,7 @@ fun MigrateMangaScreen(
}
@Composable
fun MigrateMangaContent(
private fun MigrateMangaContent(
contentPadding: PaddingValues,
state: MigrateMangaState,
onClickItem: (Manga) -> Unit,
@@ -82,7 +82,7 @@ fun MigrateMangaContent(
}
@Composable
fun MigrateMangaItem(
private fun MigrateMangaItem(
modifier: Modifier = Modifier,
manga: Manga,
onClickItem: (Manga) -> Unit,

View File

@@ -70,7 +70,7 @@ fun MigrateSourceScreen(
}
@Composable
fun MigrateSourceList(
private fun MigrateSourceList(
list: List<Pair<Source, Long>>,
onClickItem: (Source) -> Unit,
onLongClickItem: (Source) -> Unit,
@@ -126,7 +126,7 @@ fun MigrateSourceList(
}
@Composable
fun MigrateSourceItem(
private fun MigrateSourceItem(
modifier: Modifier = Modifier,
source: Source,
count: Long,

View File

@@ -66,7 +66,7 @@ fun SourcesFilterScreen(
}
@Composable
fun SourcesFilterContent(
private fun SourcesFilterContent(
contentPadding: PaddingValues,
state: SourcesFilterState,
onClickLang: (String) -> Unit,
@@ -111,7 +111,7 @@ fun SourcesFilterContent(
}
@Composable
fun SourcesFilterHeader(
private fun SourcesFilterHeader(
modifier: Modifier,
language: String,
enabled: Boolean,
@@ -128,7 +128,7 @@ fun SourcesFilterHeader(
}
@Composable
fun SourcesFilterItem(
private fun SourcesFilterItem(
modifier: Modifier,
source: Source,
enabled: Boolean,

View File

@@ -75,7 +75,7 @@ fun SourcesScreen(
}
@Composable
fun SourceList(
private fun SourceList(
state: SourcesState,
onClickItem: (Source, String) -> Unit,
onClickDisable: (Source) -> Unit,
@@ -135,7 +135,7 @@ fun SourceList(
}
@Composable
fun SourceHeader(
private fun SourceHeader(
modifier: Modifier = Modifier,
language: String,
) {
@@ -149,7 +149,7 @@ fun SourceHeader(
}
@Composable
fun SourceItem(
private fun SourceItem(
modifier: Modifier = Modifier,
source: Source,
onClickItem: (Source, String) -> Unit,
@@ -181,7 +181,7 @@ fun SourceItem(
}
@Composable
fun SourcePinButton(
private fun SourcePinButton(
isPinned: Boolean,
onClick: () -> Unit,
) {
@@ -197,7 +197,7 @@ fun SourcePinButton(
}
@Composable
fun SourceOptionsDialog(
private fun SourceOptionsDialog(
source: Source,
onClickPin: () -> Unit,
onClickDisable: () -> Unit,

View File

@@ -30,6 +30,7 @@ import eu.kanade.presentation.components.AppBar
import eu.kanade.presentation.components.ChapterDownloadAction
import eu.kanade.presentation.components.EmptyScreen
import eu.kanade.presentation.components.LazyColumn
import eu.kanade.presentation.components.LoadingScreen
import eu.kanade.presentation.components.MangaBottomActionMenu
import eu.kanade.presentation.components.Scaffold
import eu.kanade.presentation.components.SwipeRefreshIndicator
@@ -55,10 +56,7 @@ fun UpdateScreen(
presenter: UpdatesPresenter,
onClickCover: (UpdatesItem) -> Unit,
onBackClicked: () -> Unit,
onDownloadChapter: (List<UpdatesItem>, ChapterDownloadAction) -> Unit,
) {
val updatesListState = rememberLazyListState()
val internalOnBackPressed = {
if (presenter.selectionMode) {
presenter.toggleAllSelection(false)
@@ -69,7 +67,6 @@ fun UpdateScreen(
BackHandler(onBack = internalOnBackPressed)
val context = LocalContext.current
val onUpdateLibrary = {
val started = LibraryUpdateService.start(context)
context.toast(if (started) R.string.updating_library else R.string.update_already_running)
@@ -92,7 +89,7 @@ fun UpdateScreen(
bottomBar = {
UpdatesBottomBar(
selected = presenter.selected,
onDownloadChapter = onDownloadChapter,
onDownloadChapter = presenter::downloadChapters,
onMultiBookmarkClicked = presenter::bookmarkUpdates,
onMultiMarkAsReadClicked = presenter::markUpdatesRead,
onMultiDeleteClicked = {
@@ -102,69 +99,93 @@ fun UpdateScreen(
)
},
) { contentPadding ->
// During selection mode bottom nav is not visible
val contentPaddingWithNavBar = contentPadding +
if (presenter.selectionMode) {
PaddingValues()
} else {
bottomNavPaddingValues
}
val scope = rememberCoroutineScope()
var isRefreshing by remember { mutableStateOf(false) }
SwipeRefresh(
state = rememberSwipeRefreshState(isRefreshing = isRefreshing),
onRefresh = {
val started = onUpdateLibrary()
if (!started) return@SwipeRefresh
scope.launch {
// Fake refresh status but hide it after a second as it's a long running task
isRefreshing = true
delay(1000)
isRefreshing = false
}
},
swipeEnabled = presenter.selectionMode.not(),
indicatorPadding = contentPaddingWithNavBar,
indicator = { s, trigger ->
SwipeRefreshIndicator(
state = s,
refreshTriggerDistance = trigger,
when {
presenter.isLoading -> LoadingScreen()
presenter.uiModels.isEmpty() -> EmptyScreen(textResource = R.string.information_no_recent)
else -> {
UpdateScreenContent(
presenter = presenter,
contentPadding = contentPadding,
onUpdateLibrary = onUpdateLibrary,
onClickCover = onClickCover,
)
},
) {
if (presenter.uiModels.isEmpty()) {
EmptyScreen(textResource = R.string.information_no_recent)
} else {
VerticalFastScroller(
listState = updatesListState,
topContentPadding = contentPaddingWithNavBar.calculateTopPadding(),
endContentPadding = contentPaddingWithNavBar.calculateEndPadding(LocalLayoutDirection.current),
) {
LazyColumn(
modifier = Modifier.fillMaxHeight(),
state = updatesListState,
contentPadding = contentPaddingWithNavBar,
) {
if (presenter.lastUpdated > 0L) {
updatesLastUpdatedItem(presenter.lastUpdated)
}
}
}
}
}
updatesUiItems(
uiModels = presenter.uiModels,
selectionMode = presenter.selectionMode,
onUpdateSelected = presenter::toggleSelection,
onClickCover = onClickCover,
onClickUpdate = {
val intent = ReaderActivity.newIntent(context, it.update.mangaId, it.update.chapterId)
context.startActivity(intent)
},
onDownloadChapter = onDownloadChapter,
relativeTime = presenter.relativeTime,
dateFormat = presenter.dateFormat,
)
@Composable
private fun UpdateScreenContent(
presenter: UpdatesPresenter,
contentPadding: PaddingValues,
onUpdateLibrary: () -> Boolean,
onClickCover: (UpdatesItem) -> Unit,
) {
val context = LocalContext.current
val updatesListState = rememberLazyListState()
// During selection mode bottom nav is not visible
val contentPaddingWithNavBar = contentPadding +
if (presenter.selectionMode) {
PaddingValues()
} else {
bottomNavPaddingValues
}
val scope = rememberCoroutineScope()
var isRefreshing by remember { mutableStateOf(false) }
SwipeRefresh(
state = rememberSwipeRefreshState(isRefreshing = isRefreshing),
onRefresh = {
val started = onUpdateLibrary()
if (!started) return@SwipeRefresh
scope.launch {
// Fake refresh status but hide it after a second as it's a long running task
isRefreshing = true
delay(1000)
isRefreshing = false
}
},
swipeEnabled = presenter.selectionMode.not(),
indicatorPadding = contentPaddingWithNavBar,
indicator = { s, trigger ->
SwipeRefreshIndicator(
state = s,
refreshTriggerDistance = trigger,
)
},
) {
if (presenter.uiModels.isEmpty()) {
EmptyScreen(textResource = R.string.information_no_recent)
} else {
VerticalFastScroller(
listState = updatesListState,
topContentPadding = contentPaddingWithNavBar.calculateTopPadding(),
endContentPadding = contentPaddingWithNavBar.calculateEndPadding(LocalLayoutDirection.current),
) {
LazyColumn(
modifier = Modifier.fillMaxHeight(),
state = updatesListState,
contentPadding = contentPaddingWithNavBar,
) {
if (presenter.lastUpdated > 0L) {
updatesLastUpdatedItem(presenter.lastUpdated)
}
updatesUiItems(
uiModels = presenter.uiModels,
selectionMode = presenter.selectionMode,
onUpdateSelected = presenter::toggleSelection,
onClickCover = onClickCover,
onClickUpdate = {
val intent = ReaderActivity.newIntent(context, it.update.mangaId, it.update.chapterId)
context.startActivity(intent)
},
onDownloadChapter = presenter::downloadChapters,
relativeTime = presenter.relativeTime,
dateFormat = presenter.dateFormat,
)
}
}
}
@@ -193,7 +214,7 @@ fun UpdateScreen(
}
@Composable
fun UpdatesAppBar(
private fun UpdatesAppBar(
modifier: Modifier = Modifier,
incognitoMode: Boolean,
downloadedOnlyMode: Boolean,
@@ -239,7 +260,7 @@ fun UpdatesAppBar(
}
@Composable
fun UpdatesBottomBar(
private fun UpdatesBottomBar(
selected: List<UpdatesUiModel.Item>,
onDownloadChapter: (List<UpdatesItem>, ChapterDownloadAction) -> Unit,
onMultiBookmarkClicked: (List<UpdatesItem>, bookmark: Boolean) -> Unit,

View File

@@ -30,7 +30,7 @@ import eu.kanade.tachiyomi.util.system.setDefaultSettings
@Composable
fun WebViewScreen(
onUp: () -> Unit,
onNavigateUp: () -> Unit,
initialTitle: String?,
url: String,
headers: Map<String, String> = emptyMap(),
@@ -47,7 +47,7 @@ fun WebViewScreen(
AppBar(
title = state.pageTitle ?: initialTitle,
subtitle = state.content.getCurrentUrl(),
navigateUp = onUp,
navigateUp = onNavigateUp,
navigationIcon = Icons.Default.Close,
actions = {
AppBarActions(