From 12b2d368ab01fd88a4f139b8ec8a8f3724c0cf2b Mon Sep 17 00:00:00 2001 From: arkon Date: Wed, 26 Jul 2023 22:57:15 -0400 Subject: [PATCH] Allow more flexible custom preference composables (cherry picked from commit 8ff0c9d61a1d5b1cc08a3615ef4bfa3d1f04a5d2) # Conflicts: # app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt # app/src/main/java/eu/kanade/presentation/more/settings/PreferenceModel.kt --- .../more/settings/PreferenceItem.kt | 49 +------------------ .../more/settings/PreferenceModel.kt | 26 +--------- .../screen/SettingsAppearanceScreen.kt | 17 +++++-- .../settings/screen/SettingsMangadexScreen.kt | 49 +++++++++++++++---- .../settings/screen/about/WhatsNewDialog.kt | 4 +- .../java/exh/debug/SettingsDebugScreen.kt | 4 +- 6 files changed, 61 insertions(+), 88 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt b/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt index 485529055..33a277c94 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt @@ -5,28 +5,18 @@ import androidx.compose.animation.expandVertically import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.shrinkVertically -import androidx.compose.foundation.layout.padding -import androidx.compose.material.Icon -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.PeopleAlt -import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.compositionLocalOf import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.structuralEqualityPolicy -import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import eu.kanade.domain.track.service.TrackPreferences -import eu.kanade.domain.ui.UiPreferences -import eu.kanade.presentation.more.settings.widget.AppThemePreferenceWidget -import eu.kanade.presentation.more.settings.widget.BasePreferenceWidget import eu.kanade.presentation.more.settings.widget.EditTextPreferenceWidget import eu.kanade.presentation.more.settings.widget.InfoWidget import eu.kanade.presentation.more.settings.widget.ListPreferenceWidget import eu.kanade.presentation.more.settings.widget.MultiSelectListPreferenceWidget -import eu.kanade.presentation.more.settings.widget.PrefsHorizontalPadding import eu.kanade.presentation.more.settings.widget.SwitchPreferenceWidget import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget import eu.kanade.presentation.more.settings.widget.TrackingPreferenceWidget @@ -34,7 +24,6 @@ import kotlinx.coroutines.launch import tachiyomi.core.preference.PreferenceStore import tachiyomi.presentation.core.components.SliderItem import tachiyomi.presentation.core.util.collectAsState -import tachiyomi.presentation.core.util.secondaryItemAlpha import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -167,16 +156,6 @@ internal fun PreferenceItem( }, ) } - is Preference.PreferenceItem.AppThemePreference -> { - val value by item.pref.collectAsState() - val amoled by Injekt.get().themeDarkAmoled().collectAsState() - AppThemePreferenceWidget( - title = item.title, - value = value, - amoled = amoled, - onItemClick = { scope.launch { item.pref.set(it) } }, - ) - } is Preference.PreferenceItem.TrackingPreference -> { val uName by Injekt.get() .getString(TrackPreferences.trackUsername(item.service.id)) @@ -192,33 +171,9 @@ internal fun PreferenceItem( is Preference.PreferenceItem.InfoPreference -> { InfoWidget(text = item.title) } - // SY --> - is Preference.PreferenceItem.MangaDexPreference -> { - BasePreferenceWidget( - title = item.title, - widget = { - Icon( - imageVector = Icons.Outlined.PeopleAlt, - contentDescription = null, - modifier = Modifier - .padding(start = 12.dp, end = PrefsHorizontalPadding) - .secondaryItemAlpha(), - tint = if (item.loggedIn) { - MaterialTheme.colorScheme.primary - } else { - MaterialTheme.colorScheme.onSurface - }, - ) - }, - subcomponent = null, - onClick = if (item.loggedIn) { - item.logout - } else { - item.login - }, - ) + is Preference.PreferenceItem.CustomPreference -> { + item.content(item) } - // SY <-- } } } diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceModel.kt b/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceModel.kt index 752b0c4ef..1ceb73c44 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceModel.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceModel.kt @@ -4,8 +4,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource -import eu.kanade.domain.ui.model.AppTheme -import eu.kanade.presentation.more.settings.Preference.PreferenceItem import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.track.TrackService import tachiyomi.core.preference.Preference as PreferenceData @@ -136,19 +134,6 @@ sealed class Preference { override val onValueChanged: suspend (newValue: String) -> Boolean = { true }, ) : PreferenceItem() - /** - * A [PreferenceItem] that shows previews of [AppTheme] selection. - */ - data class AppThemePreference( - val pref: PreferenceData, - override val title: String, - ) : PreferenceItem() { - override val enabled: Boolean = true - override val subtitle: String? = null - override val icon: ImageVector? = null - override val onValueChanged: suspend (newValue: AppTheme) -> Boolean = { true } - } - /** * A [PreferenceItem] for individual tracking service. */ @@ -173,22 +158,15 @@ sealed class Preference { override val onValueChanged: suspend (newValue: String) -> Boolean = { true } } - // SY --> - /** - * A [PreferenceItem] for mangadex login. - */ - data class MangaDexPreference( + data class CustomPreference( override val title: String, - val loggedIn: Boolean, - val login: () -> Unit, - val logout: () -> Unit, + val content: @Composable (PreferenceItem) -> Unit, ) : PreferenceItem() { override val enabled: Boolean = true override val subtitle: String? = null override val icon: ImageVector? = null override val onValueChanged: suspend (newValue: String) -> Boolean = { true } } - // SY <-- } data class PreferenceGroup( diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen.kt index fe95f0e8c..1a2d8649f 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen.kt @@ -21,6 +21,7 @@ import eu.kanade.domain.ui.model.TabletUiMode import eu.kanade.domain.ui.model.ThemeMode import eu.kanade.domain.ui.model.setAppCompatDelegateThemeMode import eu.kanade.presentation.more.settings.Preference +import eu.kanade.presentation.more.settings.widget.AppThemePreferenceWidget import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.util.system.LocaleHelper import eu.kanade.tachiyomi.util.system.toast @@ -63,8 +64,11 @@ object SettingsAppearanceScreen : SearchableSettings { ): Preference.PreferenceGroup { val themeModePref = uiPreferences.themeMode() val themeMode by themeModePref.collectAsState() + val appThemePref = uiPreferences.appTheme() + val amoledPref = uiPreferences.themeDarkAmoled() + val amoled by amoledPref.collectAsState() LaunchedEffect(themeMode) { setAppCompatDelegateThemeMode(themeMode) @@ -95,10 +99,17 @@ object SettingsAppearanceScreen : SearchableSettings { ) }, ), - Preference.PreferenceItem.AppThemePreference( + Preference.PreferenceItem.CustomPreference( title = stringResource(R.string.pref_app_theme), - pref = appThemePref, - ), + ) { item -> + val value by appThemePref.collectAsState() + AppThemePreferenceWidget( + title = item.title, + value = value, + amoled = amoled, + onItemClick = { appThemePref.set(it) }, + ) + }, Preference.PreferenceItem.SwitchPreference( pref = amoledPref, title = stringResource(R.string.pref_dark_theme_pure_black), diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMangadexScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMangadexScreen.kt index 77a633313..1a75e1e05 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMangadexScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMangadexScreen.kt @@ -8,8 +8,11 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.PeopleAlt import androidx.compose.material3.AlertDialog import androidx.compose.material3.Checkbox +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton @@ -25,9 +28,12 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.track.service.TrackPreferences import eu.kanade.presentation.more.settings.Preference +import eu.kanade.presentation.more.settings.widget.BasePreferenceWidget +import eu.kanade.presentation.more.settings.widget.PrefsHorizontalPadding import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.library.LibraryUpdateJob import eu.kanade.tachiyomi.source.online.all.MangaDex @@ -42,6 +48,7 @@ import tachiyomi.core.util.system.logcat import tachiyomi.domain.UnsortedPreferences import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.util.collectAsState +import tachiyomi.presentation.core.util.secondaryItemAlpha import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -93,7 +100,7 @@ object SettingsMangadexScreen : SearchableSettings { } @Composable - fun loginPreference(mdex: MangaDex, trackPreferences: TrackPreferences): Preference.PreferenceItem.MangaDexPreference { + fun loginPreference(mdex: MangaDex, trackPreferences: TrackPreferences): Preference.PreferenceItem.CustomPreference { val context = LocalContext.current val scope = rememberCoroutineScope() val loggedIn by remember { trackPreferences.trackToken(mdex.mdList) }.collectAsState() @@ -124,18 +131,40 @@ object SettingsMangadexScreen : SearchableSettings { }, ) } - return Preference.PreferenceItem.MangaDexPreference( + return Preference.PreferenceItem.CustomPreference( title = mdex.name + " Login", - loggedIn = loggedIn.isNotEmpty(), - login = { - context.openInBrowser( - MdConstants.Login.authUrl(MdUtil.getPkceChallengeCode()), - forceDefaultBrowser = true, + content = { + BasePreferenceWidget( + title = it.title, + widget = { + Icon( + imageVector = Icons.Outlined.PeopleAlt, + contentDescription = null, + modifier = Modifier + .padding(start = 12.dp, end = PrefsHorizontalPadding) + .secondaryItemAlpha(), + tint = if (loggedIn.isNotEmpty()) { + MaterialTheme.colorScheme.primary + } else { + MaterialTheme.colorScheme.onSurface + }, + ) + }, + subcomponent = null, + onClick = if (loggedIn.isNotEmpty()) { + { + logoutDialogOpen = true + } + } else { + { + context.openInBrowser( + MdConstants.Login.authUrl(MdUtil.getPkceChallengeCode()), + forceDefaultBrowser = true, + ) + } + }, ) }, - logout = { - logoutDialogOpen = true - }, ) } diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/WhatsNewDialog.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/WhatsNewDialog.kt index 6b7d5705c..ec1fbca67 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/WhatsNewDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/WhatsNewDialog.kt @@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material3.AlertDialog +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton @@ -30,7 +31,6 @@ import nl.adaptivity.xmlutil.serialization.XML import nl.adaptivity.xmlutil.serialization.XmlSerialName import nl.adaptivity.xmlutil.serialization.XmlValue import tachiyomi.core.util.lang.withIOContext -import tachiyomi.presentation.core.components.material.Divider import tachiyomi.presentation.core.components.material.padding @Composable @@ -72,7 +72,7 @@ fun WhatsNewDialog(onDismissRequest: () -> Unit) { fontWeight = FontWeight.Bold, style = MaterialTheme.typography.titleSmall, ) - Divider(Modifier.padding(vertical = 8.dp)) + HorizontalDivider(Modifier.padding(vertical = 8.dp)) Column( verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { diff --git a/app/src/main/java/exh/debug/SettingsDebugScreen.kt b/app/src/main/java/exh/debug/SettingsDebugScreen.kt index 52974a37f..f537b177d 100644 --- a/app/src/main/java/exh/debug/SettingsDebugScreen.kt +++ b/app/src/main/java/exh/debug/SettingsDebugScreen.kt @@ -25,6 +25,7 @@ import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.foundation.verticalScroll import androidx.compose.material3.AlertDialog import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Switch import androidx.compose.material3.Text @@ -56,7 +57,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import tachiyomi.presentation.core.components.ScrollbarLazyColumn -import tachiyomi.presentation.core.components.material.Divider import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.topSmallPaddingValues import tachiyomi.presentation.core.screens.LoadingScreen @@ -153,7 +153,7 @@ class SettingsDebugScreen : Screen() { ) } item { - Divider() + HorizontalDivider() } item { Text(