Files

281 lines
7.2 KiB
Swift

//
// UserSettings.swift
// PrivadoVPN
//
// Created by Juraldinio on 12/14/20.
// Copyright © 2020 Privado LLC. All rights reserved.
//
import Foundation
import CoreData
final class UserSettings {
// MARK: - Properties
static var shared = UserSettings()
private var settings: Settings?
let vpnTypeEmitter = Emitter<VPNType?>()
let vpnConfigurationEmitter = Emitter<Void>()
let settingsEmitter = Emitter<Settings>()
let killSwitchEmitter = Emitter<Bool>()
let isDockedEmitter = Emitter<Bool>()
let isPinnedEmitter = Emitter<Bool>()
var lastUsedServer: String {
get {
self.settings?.lastUsedServer ?? ""
}
set {
guard let settings = self.settings else { return }
settings.lastUsedServer = newValue
self.save(settings: settings)
}
}
var isPinned: Bool {
get {
self.settings?.isPinned ?? false
}
set {
guard newValue != self.isPinned else { return }
guard let settings = self.settings else { return }
settings.isPinned = newValue
self.save(settings: settings)
self.isPinnedEmitter.invoke(newValue)
}
}
var isDocked: Bool {
get {
self.settings?.isDocked ?? true
}
set {
guard newValue != self.isDocked else { return }
guard let settings = self.settings else { return }
settings.isDocked = newValue
self.save(settings: settings)
self.isDockedEmitter.invoke(newValue)
}
}
var autostartEnabled: Bool {
get {
self.settings?.autostartEnabled ?? false
}
set {
guard newValue != self.autostartEnabled else { return }
guard let settings = self.settings else { return }
settings.autostartEnabled = newValue
self.save(settings: settings)
self.settingsEmitter.invoke(settings)
}
}
var preferredServer: PreferredServerType? {
get {
return PreferredServerType(rawValue: self.settings?.preferredServer ?? 0)
}
set {
guard newValue != self.preferredServer else { return }
guard let settings = self.settings else { return }
settings.preferredServer = newValue?.rawValue ?? 0
self.save(settings: settings)
}
}
var killSwitchEnabled: Bool {
get {
self.settings?.killSwitchEnabled ?? false
}
set {
guard let settings = self.settings else { return }
let changed = settings.killSwitchEnabled != newValue
settings.killSwitchEnabled = newValue
self.save(settings: settings)
if changed { self.killSwitchEmitter.invoke(newValue) }
self.settingsEmitter.invoke(settings)
}
}
var vpnType: VPNType? {
get {
guard let value = self.settings?.vpnType
, let type = VPNType(rawValue: value) else {
return nil
}
return type
}
set {
guard newValue != self.vpnType else { return }
guard let settings = self.settings else { return }
if let value = newValue {
settings.vpnType = value.rawValue
} else {
settings.vpnType = nil
}
self.save(settings: settings)
guard let value = newValue else { return }
self.vpnTypeEmitter.invoke(value)
}
}
var scramble: Bool {
get {
self.settings?.scramble == 1
}
set {
guard newValue != self.scramble else { return }
guard let settings = self.settings else { return }
settings.scramble = newValue ? 1 : 0
self.save(settings: settings)
self.vpnConfigurationEmitter.invoke(())
}
}
var proto: String {
get {
self.settings?.proto ?? "TCP"
}
set {
guard newValue != self.proto else { return }
guard let settings = self.settings else { return }
settings.proto = newValue
self.save(settings: settings)
self.vpnConfigurationEmitter.invoke(())
}
}
var port: Int16 {
get {
self.settings?.port ?? 1194
}
set {
guard newValue != self.port else { return }
guard let settings = self.settings else { return }
settings.port = newValue
self.save(settings: settings)
self.vpnConfigurationEmitter.invoke(())
}
}
var backgroundUpdate: Bool {
get {
return false
/*#if DEBUG
false
#else
self.settings?.backgroundUpdate ?? true
#endif*/
}
set {
guard newValue != self.backgroundUpdate else { return }
guard let settings = self.settings else { return }
settings.backgroundUpdate = newValue
self.save(settings: settings)
}
}
var recentlyVerifiedEmail: String? {
get {
UserDefaults.standard.string(forKey: "verifiedEmail")
}
set {
UserDefaults.standard.set(newValue, forKey: "verifiedEmail")
}
}
// MARK: - Initializers
private init() {
self.restore()
}
deinit {
self.settings = nil
}
func clear() {
guard let coordinator = DatabaseAnswer.commonDB else { return }
let request: NSFetchRequest<Settings> = Settings.fetchRequest()
let context = coordinator.createContext()
let settings: [Settings] = context.fetch(request)
settings.forEach {
context.delete($0)
}
context.save()
coordinator.save()
self.settings = nil
self.restore()
}
// MARK: - Private
private func save(settings: Settings) {
guard let coordinator = DatabaseAnswer.commonDB else { return }
coordinator.mainContext.save()
coordinator.save()
}
private func restore() {
guard let coordinator = DatabaseAnswer.commonDB else { return }
if let settings: Settings = coordinator.mainContext.fetch(Settings.fetchRequest()).first {
self.settings = settings
} else {
let settings: Settings = coordinator.mainContext.create()
settings.id = UUID().uuidString
coordinator.mainContext.save()
coordinator.save()
self.settings = settings
}
}
}