Loading app/k9mail/src/main/java/com/fsck/k9/App.kt +3 −0 Original line number Diff line number Diff line Loading @@ -4,11 +4,13 @@ import android.app.Application import com.fsck.k9.activity.MessageCompose import com.fsck.k9.controller.MessagingController import com.fsck.k9.external.MessageProvider import com.fsck.k9.ui.ThemeManager import org.koin.android.ext.android.inject class App : Application() { private val messagingController: MessagingController by inject() private val messagingListenerProvider: MessagingListenerProvider by inject() private val themeManager: ThemeManager by inject() override fun onCreate() { Loading @@ -21,6 +23,7 @@ class App : Application() { K9.init(this) Core.init(this) MessageProvider.init() themeManager.init() messagingListenerProvider.listeners.forEach { listener -> messagingController.addListener(listener) Loading app/ui/src/main/java/com/fsck/k9/ui/ThemeManager.kt +23 −21 Original line number Diff line number Diff line package com.fsck.k9.ui import androidx.annotation.StyleRes import androidx.appcompat.app.AppCompatDelegate import com.fsck.k9.K9 import com.fsck.k9.K9.AppTheme import com.fsck.k9.K9.SubTheme Loading @@ -19,36 +20,36 @@ class ThemeManager { get() = resolveTheme(K9.messageComposeTheme) @get:StyleRes val appThemeResourceId: Int get() = getThemeResourceId(appTheme) val appThemeResourceId: Int = R.style.Theme_K9_DayNight @get:StyleRes val appActionBarThemeResourceId: Int get() = when (appTheme) { Theme.LIGHT -> R.style.Theme_K9_Light_ActionBar Theme.DARK -> R.style.Theme_K9_Dark_ActionBar } val appActionBarThemeResourceId: Int = R.style.Theme_K9_DayNight_ActionBar @get:StyleRes val messageViewThemeResourceId: Int get() = getThemeResourceId(messageViewTheme) get() = getSubThemeResourceId(K9.messageViewTheme) @get:StyleRes val messageComposeThemeResourceId: Int get() = getThemeResourceId(messageComposeTheme) get() = getSubThemeResourceId(K9.messageComposeTheme) @get:StyleRes val dialogThemeResourceId: Int get() = when (appTheme) { Theme.LIGHT -> R.style.Theme_K9_Dialog_Light Theme.DARK -> R.style.Theme_K9_Dialog_Dark } val dialogThemeResourceId: Int = R.style.Theme_K9_Dialog_DayNight @get:StyleRes val translucentDialogThemeResourceId: Int get() = when (appTheme) { Theme.LIGHT -> R.style.Theme_K9_Dialog_Translucent_Light Theme.DARK -> R.style.Theme_K9_Dialog_Translucent_Dark val translucentDialogThemeResourceId: Int = R.style.Theme_K9_Dialog_Translucent_DayNight fun init() { updateAppTheme() } fun updateAppTheme() { val defaultNightMode = when (appTheme) { Theme.LIGHT -> AppCompatDelegate.MODE_NIGHT_NO Theme.DARK -> AppCompatDelegate.MODE_NIGHT_YES } AppCompatDelegate.setDefaultNightMode(defaultNightMode) } fun toggleMessageViewTheme() { Loading @@ -61,9 +62,10 @@ class ThemeManager { K9.saveSettingsAsync() } private fun getThemeResourceId(theme: Theme): Int = when (theme) { Theme.LIGHT -> R.style.Theme_K9_Light Theme.DARK -> R.style.Theme_K9_Dark private fun getSubThemeResourceId(subTheme: SubTheme): Int = when (subTheme) { SubTheme.LIGHT -> R.style.Theme_K9_Light SubTheme.DARK -> R.style.Theme_K9_Dark SubTheme.USE_GLOBAL -> R.style.Theme_K9_DayNight } private fun resolveTheme(theme: SubTheme): Theme = when (theme) { Loading app/ui/src/main/java/com/fsck/k9/ui/settings/KoinModule.kt +1 −1 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ val settingsUiModule = applicationContext { bean { AccountsLiveData(get()) } viewModel { SettingsViewModel(get()) } bean { GeneralSettingsDataStore(get(), get(), get("SaveSettingsExecutorService")) } bean { GeneralSettingsDataStore(get(), get(), get("SaveSettingsExecutorService"), get()) } bean("SaveSettingsExecutorService") { Executors.newSingleThreadExecutor(NamedThreadFactory("SaveSettings")) } Loading app/ui/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsDataStore.kt +4 −1 Original line number Diff line number Diff line Loading @@ -7,12 +7,14 @@ import com.fsck.k9.K9.AppTheme import com.fsck.k9.K9.SubTheme import com.fsck.k9.Preferences import com.fsck.k9.job.K9JobManager import com.fsck.k9.ui.ThemeManager import java.util.concurrent.ExecutorService class GeneralSettingsDataStore( private val preferences: Preferences, private val jobManager: K9JobManager, private val executorService: ExecutorService private val executorService: ExecutorService, private val themeManager: ThemeManager ) : PreferenceDataStore() { var activity: FragmentActivity? = null Loading Loading @@ -216,6 +218,7 @@ class GeneralSettingsDataStore( private fun setTheme(value: String?) { K9.appTheme = stringToAppTheme(value) themeManager.updateAppTheme() recreateActivity() } Loading app/ui/src/main/res/values-night/themes.xml 0 → 100644 +9 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <resources> <style name="Theme.K9.DayNight" parent="Theme.K9.Dark" /> <style name="Theme.K9.DayNight.ActionBar" parent="Theme.K9.Dark.ActionBar" /> <style name="Theme.K9.Dialog.DayNight" parent="Theme.K9.Dialog.Dark" /> <style name="Theme.K9.Dialog.Translucent.DayNight" parent="Theme.K9.Dialog.Translucent.Dark" /> </resources> Loading
app/k9mail/src/main/java/com/fsck/k9/App.kt +3 −0 Original line number Diff line number Diff line Loading @@ -4,11 +4,13 @@ import android.app.Application import com.fsck.k9.activity.MessageCompose import com.fsck.k9.controller.MessagingController import com.fsck.k9.external.MessageProvider import com.fsck.k9.ui.ThemeManager import org.koin.android.ext.android.inject class App : Application() { private val messagingController: MessagingController by inject() private val messagingListenerProvider: MessagingListenerProvider by inject() private val themeManager: ThemeManager by inject() override fun onCreate() { Loading @@ -21,6 +23,7 @@ class App : Application() { K9.init(this) Core.init(this) MessageProvider.init() themeManager.init() messagingListenerProvider.listeners.forEach { listener -> messagingController.addListener(listener) Loading
app/ui/src/main/java/com/fsck/k9/ui/ThemeManager.kt +23 −21 Original line number Diff line number Diff line package com.fsck.k9.ui import androidx.annotation.StyleRes import androidx.appcompat.app.AppCompatDelegate import com.fsck.k9.K9 import com.fsck.k9.K9.AppTheme import com.fsck.k9.K9.SubTheme Loading @@ -19,36 +20,36 @@ class ThemeManager { get() = resolveTheme(K9.messageComposeTheme) @get:StyleRes val appThemeResourceId: Int get() = getThemeResourceId(appTheme) val appThemeResourceId: Int = R.style.Theme_K9_DayNight @get:StyleRes val appActionBarThemeResourceId: Int get() = when (appTheme) { Theme.LIGHT -> R.style.Theme_K9_Light_ActionBar Theme.DARK -> R.style.Theme_K9_Dark_ActionBar } val appActionBarThemeResourceId: Int = R.style.Theme_K9_DayNight_ActionBar @get:StyleRes val messageViewThemeResourceId: Int get() = getThemeResourceId(messageViewTheme) get() = getSubThemeResourceId(K9.messageViewTheme) @get:StyleRes val messageComposeThemeResourceId: Int get() = getThemeResourceId(messageComposeTheme) get() = getSubThemeResourceId(K9.messageComposeTheme) @get:StyleRes val dialogThemeResourceId: Int get() = when (appTheme) { Theme.LIGHT -> R.style.Theme_K9_Dialog_Light Theme.DARK -> R.style.Theme_K9_Dialog_Dark } val dialogThemeResourceId: Int = R.style.Theme_K9_Dialog_DayNight @get:StyleRes val translucentDialogThemeResourceId: Int get() = when (appTheme) { Theme.LIGHT -> R.style.Theme_K9_Dialog_Translucent_Light Theme.DARK -> R.style.Theme_K9_Dialog_Translucent_Dark val translucentDialogThemeResourceId: Int = R.style.Theme_K9_Dialog_Translucent_DayNight fun init() { updateAppTheme() } fun updateAppTheme() { val defaultNightMode = when (appTheme) { Theme.LIGHT -> AppCompatDelegate.MODE_NIGHT_NO Theme.DARK -> AppCompatDelegate.MODE_NIGHT_YES } AppCompatDelegate.setDefaultNightMode(defaultNightMode) } fun toggleMessageViewTheme() { Loading @@ -61,9 +62,10 @@ class ThemeManager { K9.saveSettingsAsync() } private fun getThemeResourceId(theme: Theme): Int = when (theme) { Theme.LIGHT -> R.style.Theme_K9_Light Theme.DARK -> R.style.Theme_K9_Dark private fun getSubThemeResourceId(subTheme: SubTheme): Int = when (subTheme) { SubTheme.LIGHT -> R.style.Theme_K9_Light SubTheme.DARK -> R.style.Theme_K9_Dark SubTheme.USE_GLOBAL -> R.style.Theme_K9_DayNight } private fun resolveTheme(theme: SubTheme): Theme = when (theme) { Loading
app/ui/src/main/java/com/fsck/k9/ui/settings/KoinModule.kt +1 −1 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ val settingsUiModule = applicationContext { bean { AccountsLiveData(get()) } viewModel { SettingsViewModel(get()) } bean { GeneralSettingsDataStore(get(), get(), get("SaveSettingsExecutorService")) } bean { GeneralSettingsDataStore(get(), get(), get("SaveSettingsExecutorService"), get()) } bean("SaveSettingsExecutorService") { Executors.newSingleThreadExecutor(NamedThreadFactory("SaveSettings")) } Loading
app/ui/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsDataStore.kt +4 −1 Original line number Diff line number Diff line Loading @@ -7,12 +7,14 @@ import com.fsck.k9.K9.AppTheme import com.fsck.k9.K9.SubTheme import com.fsck.k9.Preferences import com.fsck.k9.job.K9JobManager import com.fsck.k9.ui.ThemeManager import java.util.concurrent.ExecutorService class GeneralSettingsDataStore( private val preferences: Preferences, private val jobManager: K9JobManager, private val executorService: ExecutorService private val executorService: ExecutorService, private val themeManager: ThemeManager ) : PreferenceDataStore() { var activity: FragmentActivity? = null Loading Loading @@ -216,6 +218,7 @@ class GeneralSettingsDataStore( private fun setTheme(value: String?) { K9.appTheme = stringToAppTheme(value) themeManager.updateAppTheme() recreateActivity() } Loading
app/ui/src/main/res/values-night/themes.xml 0 → 100644 +9 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <resources> <style name="Theme.K9.DayNight" parent="Theme.K9.Dark" /> <style name="Theme.K9.DayNight.ActionBar" parent="Theme.K9.Dark.ActionBar" /> <style name="Theme.K9.Dialog.DayNight" parent="Theme.K9.Dialog.Dark" /> <style name="Theme.K9.Dialog.Translucent.DayNight" parent="Theme.K9.Dialog.Translucent.Dark" /> </resources>