import UIKit @objc(LKAppModeManager) public final class AppModeManager : NSObject { private let delegate: AppModeManagerDelegate public var currentAppMode: AppMode { return AppModeManager.getAppModeOrSystemDefault() } public static var shared: AppModeManager! @objc(configureWithDelegate:) public static func configure(delegate: AppModeManagerDelegate) { shared = AppModeManager(delegate: delegate) } private init(delegate: AppModeManagerDelegate) { self.delegate = delegate super.init() } private override init() { preconditionFailure("Use init(delegate:) instead.") } public func setCurrentAppMode(to appMode: AppMode) { delegate.setCurrentAppMode(to: appMode) } public func setAppModeToSystemDefault() { delegate.setAppModeToSystemDefault() } @objc public static func getAppModeOrSystemDefault() -> AppMode { let userDefaults = UserDefaults.standard guard userDefaults.dictionaryRepresentation().keys.contains("appMode") else { if #available(iOS 13.0, *) { return UITraitCollection.current.userInterfaceStyle == .dark ? .dark : .light } return .light } let mode = userDefaults.integer(forKey: "appMode") return AppMode(rawValue: mode) ?? .light } } @objc(LKAppModeManagerDelegate) public protocol AppModeManagerDelegate { @objc(setCurrentAppMode:) func setCurrentAppMode(to appMode: AppMode) func setAppModeToSystemDefault() } @objc(LKAppMode) public enum AppMode: Int { case light, dark } public var isSystemDefault: Bool { return !UserDefaults.standard.dictionaryRepresentation().keys.contains("appMode") } public var isLightMode: Bool { return AppModeManager.shared.currentAppMode == .light } public var isDarkMode: Bool { return AppModeManager.shared.currentAppMode == .dark } @objc public final class LKAppModeUtilities : NSObject { @objc public static var isSystemDefault: Bool { return !UserDefaults.standard.dictionaryRepresentation().keys.contains("appMode") } @objc public static var isLightMode: Bool { return AppModeManager.shared.currentAppMode == .light } @objc public static var isDarkMode: Bool { return AppModeManager.shared.currentAppMode == .dark } }