Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b018b6a92b |
@@ -28,7 +28,6 @@ import de.jeanlucmakiola.agendula.data.di.LaunchHook
|
|||||||
import de.jeanlucmakiola.agendula.domain.SmartList
|
import de.jeanlucmakiola.agendula.domain.SmartList
|
||||||
import de.jeanlucmakiola.agendula.ui.imports.importIntentUri
|
import de.jeanlucmakiola.agendula.ui.imports.importIntentUri
|
||||||
import de.jeanlucmakiola.agendula.ui.navigation.AppShortcuts
|
import de.jeanlucmakiola.agendula.ui.navigation.AppShortcuts
|
||||||
import de.jeanlucmakiola.agendula.data.prefs.ThemeMode
|
|
||||||
import de.jeanlucmakiola.agendula.ui.RootScreen
|
import de.jeanlucmakiola.agendula.ui.RootScreen
|
||||||
import de.jeanlucmakiola.agendula.ui.crash.CrashReportActivity
|
import de.jeanlucmakiola.agendula.ui.crash.CrashReportActivity
|
||||||
import de.jeanlucmakiola.agendula.ui.navigation.NavRequest
|
import de.jeanlucmakiola.agendula.ui.navigation.NavRequest
|
||||||
@@ -88,15 +87,15 @@ class MainActivity : ComponentActivity() {
|
|||||||
setContent {
|
setContent {
|
||||||
val settingsViewModel: SettingsViewModel = hiltViewModel()
|
val settingsViewModel: SettingsViewModel = hiltViewModel()
|
||||||
val ui by settingsViewModel.state.collectAsStateWithLifecycle()
|
val ui by settingsViewModel.state.collectAsStateWithLifecycle()
|
||||||
val darkTheme = when (ui.settings.themeMode) {
|
val darkTheme = ui.settings.themeMode.isDark(isSystemInDarkTheme())
|
||||||
ThemeMode.SYSTEM -> isSystemInDarkTheme()
|
|
||||||
ThemeMode.LIGHT -> false
|
|
||||||
ThemeMode.DARK -> true
|
|
||||||
}
|
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val use24Hour = ui.settings.timeFormat.is24Hour(DateFormat.is24HourFormat(context))
|
val use24Hour = ui.settings.timeFormat.is24Hour(DateFormat.is24HourFormat(context))
|
||||||
val firstDayOfWeek = ui.settings.weekStart ?: localeFirstDayOfWeek()
|
val firstDayOfWeek = ui.settings.weekStart ?: localeFirstDayOfWeek()
|
||||||
AgendulaTheme(darkTheme = darkTheme, dynamicColor = ui.settings.dynamicColor) {
|
AgendulaTheme(
|
||||||
|
darkTheme = darkTheme,
|
||||||
|
dynamicColor = ui.settings.dynamicColor,
|
||||||
|
pureBlack = ui.settings.themeMode.isPureBlack,
|
||||||
|
) {
|
||||||
CompositionLocalProvider(
|
CompositionLocalProvider(
|
||||||
LocalUse24HourFormat provides use24Hour,
|
LocalUse24HourFormat provides use24Hour,
|
||||||
LocalFirstDayOfWeek provides firstDayOfWeek,
|
LocalFirstDayOfWeek provides firstDayOfWeek,
|
||||||
|
|||||||
@@ -31,7 +31,18 @@ import kotlinx.coroutines.flow.map
|
|||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
enum class ThemeMode { SYSTEM, LIGHT, DARK }
|
/** [BLACK] is dark with pure-black surfaces, for AMOLED screens. */
|
||||||
|
enum class ThemeMode {
|
||||||
|
SYSTEM, LIGHT, DARK, BLACK;
|
||||||
|
|
||||||
|
fun isDark(systemDark: Boolean): Boolean = when (this) {
|
||||||
|
SYSTEM -> systemDark
|
||||||
|
LIGHT -> false
|
||||||
|
DARK, BLACK -> true
|
||||||
|
}
|
||||||
|
|
||||||
|
val isPureBlack: Boolean get() = this == BLACK
|
||||||
|
}
|
||||||
|
|
||||||
/** Clock convention: AUTO follows the device's 24-hour switch. */
|
/** Clock convention: AUTO follows the device's 24-hour switch. */
|
||||||
enum class TimeFormatPref { AUTO, TWELVE_HOUR, TWENTY_FOUR_HOUR }
|
enum class TimeFormatPref { AUTO, TWELVE_HOUR, TWENTY_FOUR_HOUR }
|
||||||
|
|||||||
@@ -140,6 +140,7 @@ internal fun AppearanceScreen(
|
|||||||
options = ThemeMode.entries,
|
options = ThemeMode.entries,
|
||||||
selected = state.settings.themeMode,
|
selected = state.settings.themeMode,
|
||||||
label = { stringResource(themeLabel(it)) },
|
label = { stringResource(themeLabel(it)) },
|
||||||
|
summary = { if (it == ThemeMode.BLACK) stringResource(R.string.settings_theme_black_summary) else null },
|
||||||
onSelect = viewModel::setThemeMode,
|
onSelect = viewModel::setThemeMode,
|
||||||
onDismiss = { showTheme = false },
|
onDismiss = { showTheme = false },
|
||||||
)
|
)
|
||||||
@@ -167,4 +168,5 @@ private fun themeLabel(mode: ThemeMode): Int = when (mode) {
|
|||||||
ThemeMode.SYSTEM -> R.string.settings_theme_system
|
ThemeMode.SYSTEM -> R.string.settings_theme_system
|
||||||
ThemeMode.LIGHT -> R.string.settings_theme_light
|
ThemeMode.LIGHT -> R.string.settings_theme_light
|
||||||
ThemeMode.DARK -> R.string.settings_theme_dark
|
ThemeMode.DARK -> R.string.settings_theme_dark
|
||||||
|
ThemeMode.BLACK -> R.string.settings_theme_black
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import de.jeanlucmakiola.floret.identity.FloretExpressiveTheme
|
|||||||
fun AgendulaTheme(
|
fun AgendulaTheme(
|
||||||
darkTheme: Boolean = isSystemInDarkTheme(),
|
darkTheme: Boolean = isSystemInDarkTheme(),
|
||||||
dynamicColor: Boolean = true,
|
dynamicColor: Boolean = true,
|
||||||
|
pureBlack: Boolean = false,
|
||||||
content: @Composable () -> Unit,
|
content: @Composable () -> Unit,
|
||||||
) {
|
) {
|
||||||
FloretExpressiveTheme(
|
FloretExpressiveTheme(
|
||||||
@@ -22,6 +23,7 @@ fun AgendulaTheme(
|
|||||||
darkScheme = AgendulaDarkFallback,
|
darkScheme = AgendulaDarkFallback,
|
||||||
darkTheme = darkTheme,
|
darkTheme = darkTheme,
|
||||||
dynamicColor = dynamicColor,
|
dynamicColor = dynamicColor,
|
||||||
|
pureBlack = pureBlack,
|
||||||
typography = AgendulaTypography,
|
typography = AgendulaTypography,
|
||||||
content = content,
|
content = content,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ import dagger.hilt.android.AndroidEntryPoint
|
|||||||
import de.jeanlucmakiola.agendula.R
|
import de.jeanlucmakiola.agendula.R
|
||||||
import de.jeanlucmakiola.agendula.data.prefs.Settings
|
import de.jeanlucmakiola.agendula.data.prefs.Settings
|
||||||
import de.jeanlucmakiola.agendula.data.prefs.SettingsPrefs
|
import de.jeanlucmakiola.agendula.data.prefs.SettingsPrefs
|
||||||
import de.jeanlucmakiola.agendula.data.prefs.ThemeMode
|
|
||||||
import de.jeanlucmakiola.agendula.data.tasks.TasksRepository
|
import de.jeanlucmakiola.agendula.data.tasks.TasksRepository
|
||||||
import de.jeanlucmakiola.agendula.domain.SavedFilter
|
import de.jeanlucmakiola.agendula.domain.SavedFilter
|
||||||
import de.jeanlucmakiola.agendula.domain.SmartList
|
import de.jeanlucmakiola.agendula.domain.SmartList
|
||||||
@@ -135,12 +134,12 @@ class TaskWidgetConfigActivity : ComponentActivity() {
|
|||||||
rowColor = parseWidgetRowColor(state[WIDGET_ROW_COLOR_KEY])
|
rowColor = parseWidgetRowColor(state[WIDGET_ROW_COLOR_KEY])
|
||||||
selectedListIds = parseWidgetListIds(state[WIDGET_LIST_IDS_KEY])
|
selectedListIds = parseWidgetListIds(state[WIDGET_LIST_IDS_KEY])
|
||||||
}
|
}
|
||||||
val dark = when (settings.themeMode) {
|
val dark = settings.themeMode.isDark(isSystemInDarkTheme())
|
||||||
ThemeMode.SYSTEM -> isSystemInDarkTheme()
|
AgendulaTheme(
|
||||||
ThemeMode.LIGHT -> false
|
darkTheme = dark,
|
||||||
ThemeMode.DARK -> true
|
dynamicColor = settings.dynamicColor,
|
||||||
}
|
pureBlack = settings.themeMode.isPureBlack,
|
||||||
AgendulaTheme(darkTheme = dark, dynamicColor = settings.dynamicColor) {
|
) {
|
||||||
Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.surface) {}
|
Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.surface) {}
|
||||||
WidgetFilterPicker(
|
WidgetFilterPicker(
|
||||||
kind = kind,
|
kind = kind,
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ internal fun effectiveThemeMode(appThemeMode: ThemeMode, override: WidgetThemeMo
|
|||||||
override ?: when (appThemeMode) {
|
override ?: when (appThemeMode) {
|
||||||
ThemeMode.SYSTEM -> WidgetThemeMode.SYSTEM
|
ThemeMode.SYSTEM -> WidgetThemeMode.SYSTEM
|
||||||
ThemeMode.LIGHT -> WidgetThemeMode.LIGHT
|
ThemeMode.LIGHT -> WidgetThemeMode.LIGHT
|
||||||
ThemeMode.DARK -> WidgetThemeMode.DARK
|
ThemeMode.DARK, ThemeMode.BLACK -> WidgetThemeMode.DARK
|
||||||
}
|
}
|
||||||
|
|
||||||
/** The smart lists a widget can show, in picker order. */
|
/** The smart lists a widget can show, in picker order. */
|
||||||
|
|||||||
@@ -448,6 +448,8 @@
|
|||||||
<string name="settings_theme_system">Follow system</string>
|
<string name="settings_theme_system">Follow system</string>
|
||||||
<string name="settings_theme_light">Light</string>
|
<string name="settings_theme_light">Light</string>
|
||||||
<string name="settings_theme_dark">Dark</string>
|
<string name="settings_theme_dark">Dark</string>
|
||||||
|
<string name="settings_theme_black">Black</string>
|
||||||
|
<string name="settings_theme_black_summary">Dark with pure black backgrounds, for AMOLED screens</string>
|
||||||
<string name="settings_dynamic_color">Dynamic colour</string>
|
<string name="settings_dynamic_color">Dynamic colour</string>
|
||||||
<string name="settings_dynamic_color_hint">Use colours from your wallpaper</string>
|
<string name="settings_dynamic_color_hint">Use colours from your wallpaper</string>
|
||||||
<string name="settings_section_reminders">Notifications</string>
|
<string name="settings_section_reminders">Notifications</string>
|
||||||
|
|||||||
@@ -210,6 +210,7 @@ class WidgetDataTest {
|
|||||||
fun `no override resolves to whatever the app's own theme means`() {
|
fun `no override resolves to whatever the app's own theme means`() {
|
||||||
assertThat(readyWithTheme(ThemeMode.DARK).effectiveThemeMode(null)).isEqualTo(WidgetThemeMode.DARK)
|
assertThat(readyWithTheme(ThemeMode.DARK).effectiveThemeMode(null)).isEqualTo(WidgetThemeMode.DARK)
|
||||||
assertThat(readyWithTheme(ThemeMode.SYSTEM).effectiveThemeMode(null)).isEqualTo(WidgetThemeMode.SYSTEM)
|
assertThat(readyWithTheme(ThemeMode.SYSTEM).effectiveThemeMode(null)).isEqualTo(WidgetThemeMode.SYSTEM)
|
||||||
|
assertThat(readyWithTheme(ThemeMode.BLACK).effectiveThemeMode(null)).isEqualTo(WidgetThemeMode.DARK)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user