Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9bfc8102 authored by cketti's avatar cketti
Browse files

Use AppCompat's DayNight theme for dark mode support

parent f08bd42c
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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() {
@@ -21,6 +23,7 @@ class App : Application() {
        K9.init(this)
        Core.init(this)
        MessageProvider.init()
        themeManager.init()

        messagingListenerProvider.listeners.forEach { listener ->
            messagingController.addListener(listener)
+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
@@ -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() {
@@ -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) {
+1 −1
Original line number Diff line number Diff line
@@ -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"))
    }
+4 −1
Original line number Diff line number Diff line
@@ -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

@@ -216,6 +218,7 @@ class GeneralSettingsDataStore(

    private fun setTheme(value: String?) {
        K9.appTheme = stringToAppTheme(value)
        themeManager.updateAppTheme()
        recreateActivity()
    }

+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