mirror of
https://github.com/yattee/yattee.git
synced 2024-12-24 06:23:42 +00:00
103 lines
3.1 KiB
Swift
103 lines
3.1 KiB
Swift
|
import Defaults
|
||
|
import Foundation
|
||
|
#if os(iOS)
|
||
|
import Reachability
|
||
|
import UIKit
|
||
|
#endif
|
||
|
|
||
|
struct QualityProfilesModel {
|
||
|
static let shared = QualityProfilesModel()
|
||
|
|
||
|
#if os(tvOS)
|
||
|
var tvOSProfile: QualityProfile? {
|
||
|
find(Defaults[.batteryNonCellularProfile])
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
func find(_ id: QualityProfile.ID) -> QualityProfile? {
|
||
|
if id == "default" {
|
||
|
return QualityProfile.defaultProfile
|
||
|
} else if id == "highQuality" {
|
||
|
return QualityProfile.highQualityProfile
|
||
|
}
|
||
|
|
||
|
return Defaults[.qualityProfiles].first { $0.id == id }
|
||
|
}
|
||
|
|
||
|
func add(_ qualityProfile: QualityProfile) {
|
||
|
Defaults[.qualityProfiles].append(qualityProfile)
|
||
|
}
|
||
|
|
||
|
func update(_ from: QualityProfile, _ to: QualityProfile) {
|
||
|
if let index = Defaults[.qualityProfiles].firstIndex(where: { $0.id == from.id }) {
|
||
|
Defaults[.qualityProfiles][index] = to
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func remove(_ qualityProfile: QualityProfile) {
|
||
|
if let index = Defaults[.qualityProfiles].firstIndex(where: { $0.id == qualityProfile.id }) {
|
||
|
Defaults[.qualityProfiles].remove(at: index)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func applyToAll(_ qualityProfile: QualityProfile) {
|
||
|
Defaults[.batteryCellularProfile] = qualityProfile.id
|
||
|
Defaults[.batteryNonCellularProfile] = qualityProfile.id
|
||
|
Defaults[.chargingCellularProfile] = qualityProfile.id
|
||
|
Defaults[.chargingNonCellularProfile] = qualityProfile.id
|
||
|
}
|
||
|
|
||
|
#if os(iOS)
|
||
|
private func findCurrentConnection() -> Reachability.Connection? {
|
||
|
do {
|
||
|
let reachability: Reachability = try Reachability()
|
||
|
return reachability.connection
|
||
|
} catch {
|
||
|
return nil
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
var automaticProfile: QualityProfile? {
|
||
|
var id: QualityProfile.ID?
|
||
|
|
||
|
#if os(iOS)
|
||
|
UIDevice.current.isBatteryMonitoringEnabled = true
|
||
|
let unplugged = UIDevice.current.batteryState == .unplugged
|
||
|
let connection = findCurrentConnection()
|
||
|
|
||
|
if unplugged {
|
||
|
switch connection {
|
||
|
case .wifi:
|
||
|
id = Defaults[.batteryNonCellularProfile]
|
||
|
default:
|
||
|
id = Defaults[.batteryCellularProfile]
|
||
|
}
|
||
|
} else {
|
||
|
switch connection {
|
||
|
case .wifi:
|
||
|
id = Defaults[.chargingNonCellularProfile]
|
||
|
default:
|
||
|
id = Defaults[.chargingCellularProfile]
|
||
|
}
|
||
|
}
|
||
|
#elseif os(macOS)
|
||
|
if Power.hasInternalBattery {
|
||
|
if Power.isConnectedToPower {
|
||
|
id = Defaults[.chargingNonCellularProfile]
|
||
|
} else {
|
||
|
id = Defaults[.batteryNonCellularProfile]
|
||
|
}
|
||
|
} else {
|
||
|
id = Defaults[.chargingNonCellularProfile]
|
||
|
}
|
||
|
#else
|
||
|
id = Defaults[.chargingNonCellularProfile]
|
||
|
#endif
|
||
|
|
||
|
guard let id = id else { return nil }
|
||
|
|
||
|
return find(id)
|
||
|
}
|
||
|
}
|