-
Notifications
You must be signed in to change notification settings - Fork 319
/
Copy pathUpdatesPreferencePane.swift
123 lines (107 loc) · 4.34 KB
/
UpdatesPreferencePane.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import AppleAPI
import Sparkle
import SwiftUI
struct UpdatesPreferencePane: View {
@StateObject var updater = ObservableUpdater()
@AppStorage("autoInstallation") var autoInstallationType: AutoInstallationType = .none
var body: some View {
VStack(alignment: .leading, spacing: 20) {
GroupBox(label: Text("Versions")) {
VStack(alignment: .leading) {
Toggle(
"Automatically install new versions of Xcode",
isOn: $autoInstallationType.isAutoInstalling
)
Toggle(
"Include prerelease/beta versions",
isOn: $autoInstallationType.isAutoInstallingBeta
)
}
.fixedSize(horizontal: false, vertical: true)
}
.groupBoxStyle(PreferencesGroupBoxStyle())
Divider()
GroupBox(label: Text("Xcodes.app Updates")) {
VStack(alignment: .leading) {
Toggle(
"Automatically check for app updates",
isOn: $updater.automaticallyChecksForUpdates
)
Toggle(
"Include prerelease app versions",
isOn: $updater.includePrereleaseVersions
)
Button("Check Now") {
SUUpdater.shared()?.checkForUpdates(nil)
}
Text("Last checked: \(lastUpdatedString)")
.font(.footnote)
}
.frame(maxWidth: .infinity, alignment: .leading)
}
.groupBoxStyle(PreferencesGroupBoxStyle())
}
.frame(width: 500)
}
private var lastUpdatedString: String {
if let lastUpdatedDate = updater.lastUpdateCheckDate {
return Self.formatter.string(from: lastUpdatedDate)
} else {
return "Never"
}
}
private static let formatter = configure(DateFormatter()) {
$0.dateStyle = .medium
$0.timeStyle = .medium
}
}
class ObservableUpdater: ObservableObject {
@Published var automaticallyChecksForUpdates = false {
didSet {
SUUpdater.shared()?.automaticallyChecksForUpdates = automaticallyChecksForUpdates
}
}
private var automaticallyChecksForUpdatesObservation: NSKeyValueObservation?
@Published var lastUpdateCheckDate: Date?
private var lastUpdateCheckDateObservation: NSKeyValueObservation?
@Published var includePrereleaseVersions = false {
didSet {
UserDefaults.standard.setValue(includePrereleaseVersions, forKey: "includePrereleaseVersions")
if includePrereleaseVersions {
SUUpdater.shared()?.feedURL = .prereleaseAppcast
} else {
SUUpdater.shared()?.feedURL = .appcast
}
}
}
init() {
automaticallyChecksForUpdatesObservation = SUUpdater.shared()?.observe(
\.automaticallyChecksForUpdates,
options: [.initial, .new, .old],
changeHandler: { [unowned self] updater, change in
guard change.newValue != change.oldValue else { return }
self.automaticallyChecksForUpdates = updater.automaticallyChecksForUpdates
}
)
lastUpdateCheckDateObservation = SUUpdater.shared()?.observe(
\.lastUpdateCheckDate,
options: [.initial, .new, .old],
changeHandler: { [unowned self] updater, change in
self.lastUpdateCheckDate = updater.lastUpdateCheckDate
}
)
includePrereleaseVersions = UserDefaults.standard.bool(forKey: "includePrereleaseVersions")
}
}
extension URL {
static let appcast = URL(string: "https://robotsandpencils.github.io/XcodesApp/appcast.xml")!
static let prereleaseAppcast = URL(string: "https://robotsandpencils.github.io/XcodesApp/appcast_pre.xml")!
}
struct UpdatesPreferencePane_Previews: PreviewProvider {
static var previews: some View {
Group {
UpdatesPreferencePane()
.environmentObject(AppState())
}
}
}