mirror of
https://github.com/tutao/tutanota.git
synced 2025-10-19 07:53:47 +00:00
53 lines
1.7 KiB
Swift
53 lines
1.7 KiB
Swift
import Foundation
|
|
|
|
typealias ThemeId = String
|
|
typealias ThemePreference = String
|
|
typealias Theme = [String: String]
|
|
|
|
private let SELECTED_THEME = "theme"
|
|
private let THEMES = "themes"
|
|
private let LIGHT_FALLBACK_THEME = ["themeId": "light-fallback", "surface": "#ffffff"]
|
|
private let DARK_FALLBACK_THEME = ["themeId": "dark-fallback", "surface": "#dddddd"]
|
|
|
|
class ThemeManager: NSObject {
|
|
private let userPreferencesProvider: UserPreferencesProvider
|
|
|
|
init(userProferencesProvider: UserPreferencesProvider) { self.userPreferencesProvider = userProferencesProvider }
|
|
|
|
public var themePreference: ThemePreference? {
|
|
get { userPreferencesProvider.getObject(forKey: SELECTED_THEME) as! ThemePreference? }
|
|
set(newVal) { userPreferencesProvider.setValue(newVal, forKey: SELECTED_THEME) }
|
|
}
|
|
|
|
public var themes: [Theme] {
|
|
get { userPreferencesProvider.getObject(forKey: THEMES) as! [Theme]? ?? [] }
|
|
set(newVal) { return userPreferencesProvider.setValue(newVal, forKey: THEMES) }
|
|
}
|
|
|
|
public var currentTheme: Theme? {
|
|
get {
|
|
let themeId = resolveThemePreference()
|
|
return themes.first { theme in theme["themeId"] == themeId }
|
|
}
|
|
}
|
|
|
|
public var currentThemeWithFallback: Theme {
|
|
get {
|
|
if currentTheme == nil {
|
|
return LIGHT_FALLBACK_THEME
|
|
} else {
|
|
// Use fallback for new color theme migration
|
|
if currentTheme!["content_bg"] != nil {
|
|
return (UITraitCollection.current.userInterfaceStyle == .dark) ? DARK_FALLBACK_THEME : LIGHT_FALLBACK_THEME
|
|
} else {
|
|
return currentTheme!
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private func resolveThemePreference() -> ThemeId? {
|
|
let pref = self.themePreference
|
|
if pref == "auto:light|dark" { return UITraitCollection.current.userInterfaceStyle == .dark ? "dark" : "light" } else { return pref }
|
|
}
|
|
}
|