tachiyomi/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen.kt

161 lines
6.2 KiB
Kotlin
Raw Normal View History

package eu.kanade.presentation.more.settings.screen
import android.app.Activity
2023-12-09 22:50:02 +01:00
import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ReadOnlyComposable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.core.app.ActivityCompat
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow
import eu.kanade.domain.ui.UiPreferences
2022-10-22 16:15:12 +02:00
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.screen.appearance.AppLanguageScreen
2023-12-09 22:50:02 +01:00
import eu.kanade.presentation.more.settings.widget.AppThemeModePreferenceWidget
import eu.kanade.presentation.more.settings.widget.AppThemePreferenceWidget
2022-10-22 16:15:12 +02:00
import eu.kanade.tachiyomi.util.system.toast
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableMap
import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.collectAsState
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
2023-12-09 05:11:53 +01:00
import java.time.Instant
object SettingsAppearanceScreen : SearchableSettings {
@ReadOnlyComposable
@Composable
override fun getTitleRes() = MR.strings.pref_category_appearance
@Composable
override fun getPreferences(): List<Preference> {
val uiPreferences = remember { Injekt.get<UiPreferences>() }
return listOf(
2023-12-09 22:50:02 +01:00
getThemeGroup(uiPreferences = uiPreferences),
getDisplayGroup(uiPreferences = uiPreferences),
)
}
@Composable
private fun getThemeGroup(
uiPreferences: UiPreferences,
): Preference.PreferenceGroup {
2023-12-09 22:50:02 +01:00
val context = LocalContext.current
val themeModePref = uiPreferences.themeMode()
val themeMode by themeModePref.collectAsState()
val appThemePref = uiPreferences.appTheme()
2023-12-09 22:50:02 +01:00
val appTheme by appThemePref.collectAsState()
val amoledPref = uiPreferences.themeDarkAmoled()
val amoled by amoledPref.collectAsState()
return Preference.PreferenceGroup(
title = stringResource(MR.strings.pref_category_theme),
preferenceItems = persistentListOf(
Preference.PreferenceItem.CustomPreference(
title = stringResource(MR.strings.pref_app_theme),
2023-12-09 22:50:02 +01:00
) {
Column {
AppThemeModePreferenceWidget(
value = themeMode,
onItemClick = {
themeModePref.set(it)
setAppCompatDelegateThemeMode(it)
},
)
AppThemePreferenceWidget(
value = appTheme,
amoled = amoled,
onItemClick = { appThemePref.set(it) },
)
}
},
Preference.PreferenceItem.SwitchPreference(
pref = amoledPref,
title = stringResource(MR.strings.pref_dark_theme_pure_black),
enabled = themeMode != ThemeMode.LIGHT,
2023-12-09 22:50:02 +01:00
onValueChanged = {
(context as? Activity)?.let { ActivityCompat.recreate(it) }
true
},
),
),
)
}
@Composable
2022-10-22 16:15:12 +02:00
private fun getDisplayGroup(
uiPreferences: UiPreferences,
): Preference.PreferenceGroup {
2023-12-09 22:50:02 +01:00
val context = LocalContext.current
val navigator = LocalNavigator.currentOrThrow
2023-12-09 22:50:02 +01:00
2023-12-09 05:11:53 +01:00
val now = remember { Instant.now().toEpochMilli() }
2023-06-04 23:07:29 +02:00
val dateFormat by uiPreferences.dateFormat().collectAsState()
val formattedNow = remember(dateFormat) {
UiPreferences.dateFormat(dateFormat).format(now)
}
return Preference.PreferenceGroup(
title = stringResource(MR.strings.pref_category_display),
preferenceItems = persistentListOf(
Preference.PreferenceItem.TextPreference(
title = stringResource(MR.strings.pref_app_language),
onClick = { navigator.push(AppLanguageScreen()) },
2023-06-04 23:07:29 +02:00
),
2022-10-22 16:15:12 +02:00
Preference.PreferenceItem.ListPreference(
pref = uiPreferences.tabletUiMode(),
title = stringResource(MR.strings.pref_tablet_ui_mode),
entries = TabletUiMode.entries
.associateWith { stringResource(it.titleRes) }
.toImmutableMap(),
2022-10-22 16:15:12 +02:00
onValueChanged = {
context.toast(MR.strings.requires_app_restart)
2022-10-22 16:15:12 +02:00
true
},
),
Preference.PreferenceItem.ListPreference(
pref = uiPreferences.dateFormat(),
title = stringResource(MR.strings.pref_date_format),
entries = DateFormats
.associateWith {
val formattedDate = UiPreferences.dateFormat(it).format(now)
"${it.ifEmpty { stringResource(MR.strings.label_default) }} ($formattedDate)"
}
.toImmutableMap(),
),
Preference.PreferenceItem.SwitchPreference(
pref = uiPreferences.relativeTime(),
title = stringResource(MR.strings.pref_relative_format),
subtitle = stringResource(
MR.strings.pref_relative_format_summary,
stringResource(MR.strings.relative_time_today),
formattedNow,
),
),
),
)
}
}
private val DateFormats = listOf(
"", // Default
"MM/dd/yy",
"dd/MM/yy",
"yyyy-MM-dd",
"dd MMM yyyy",
"MMM dd, yyyy",
)