Commit 8720b7e
Phase 2.3: Auto-update banner UI + IUpdateService Check/Download/Apply split
Refactors the Phase 2.1 IUpdateService surface from a single 'check + queue silently' method into three: CheckAsync (returns UpdateCheckResult), DownloadAsync, ApplyOnNextLaunchAsync. The split is what UpdateNotificationViewModel needs to sequence the banner UX (NotifyOnly mode: check at startup; user clicks Install to fire download + apply; Automatic mode: chain all three in the background and show the banner once the apply is queued).
UpdateCheckResult is a small inert DTO that lets the view-model pass detection state across method calls without dragging Velopack types into ViewModels. The OpaqueHandle property carries the Velopack UpdateInfo for the production adapter; NullUpdateService just returns the NoUpdateAvailable singleton from CheckAsync and no-ops the others.
UpdateNotificationViewModel owns the banner state machine. Constructed once per app lifetime (in App.OnStartup) with the IUpdateService chosen via VelopackUpdateService.TryCreateForInstalled(includePreReleases) and a getMode callback that reads AppSettings.AutoUpdate live (so flips in the Settings dialog take effect on the next StartAsync without recreating the VM). Wires through the IncludePreReleases setting that Phase 2.2 added but left inert — VelopackUpdateService now passes the flag to GithubSource's ctor.
MainWindow.xaml gains a single-row Border at the top, above the existing ContentControl, bound via MainWindow.AttachUpdateNotification (called from App.OnStartup before window.Show). Stays Visibility=Collapsed until IsBannerVisible flips. Shows status text + an Install button (NotifyOnly only) + a Dismiss button. The existing loading-overlay Grid gains Grid.RowSpan=2 so it still veils the whole window during context switches.
Behavior matrix after this commit:
- AutoUpdate=Disabled: still short-circuits at the App level (no Check fires, banner stays hidden)
- AutoUpdate=NotifyOnly: check fires; if available, banner shows with Install button; user-initiated download + apply-on-next-launch
- AutoUpdate=Automatic: check + download + queue all fire silently; banner appears post-queue so user knows v X is pending
Three pieces deliberately deferred to a Phase 2.4 follow-up: periodic re-check timer (UpdateCheckCadence is still inert; only startup check fires), persistent 'skip this version' across launches (Dismiss is session-scoped only), and friendlier enum value converters for the Settings ComboBoxes (still show raw enum names like StartupOnly/EverySixHours).
Tests: 1381 passing (+10 new — 8 UpdateNotificationViewModel state-transition tests over a fake IUpdateService, 2 reshuffled NullUpdateService tests covering the new method surface), 1 skipped. 0 warnings, 0 errors in dotnet build -c Release. CHANGELOG [Unreleased] documents the banner and the now-wired IncludePreReleases.
AI-Local-Session: 4519f6b6-393a-4476-8efa-410e5396c3a9
AI-Cloud-Session: 72f9e474-60ab-42c2-b2a0-28fee827cbbb
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>1 parent 9533088 commit 8720b7e
11 files changed
Lines changed: 632 additions & 92 deletions
File tree
- DiffViewer.Tests
- Services
- ViewModels
- DiffViewer
- Models
- Services
- ViewModels
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
17 | 29 | | |
18 | 30 | | |
19 | 31 | | |
20 | 32 | | |
21 | 33 | | |
22 | 34 | | |
23 | 35 | | |
24 | | - | |
25 | | - | |
26 | | - | |
| 36 | + | |
27 | 37 | | |
28 | 38 | | |
29 | | - | |
30 | | - | |
31 | | - | |
32 | | - | |
33 | | - | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
34 | 43 | | |
35 | 44 | | |
36 | 45 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
3 | 4 | | |
4 | 5 | | |
5 | 6 | | |
| |||
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
12 | | - | |
| 13 | + | |
13 | 14 | | |
14 | 15 | | |
15 | 16 | | |
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 | + | |
17 | 43 | | |
18 | 44 | | |
19 | 45 | | |
20 | 46 | | |
21 | 47 | | |
22 | | - | |
| 48 | + | |
23 | 49 | | |
24 | 50 | | |
25 | 51 | | |
26 | | - | |
| 52 | + | |
27 | 53 | | |
28 | 54 | | |
29 | 55 | | |
30 | 56 | | |
31 | 57 | | |
32 | | - | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
33 | 61 | | |
34 | | - | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
35 | 65 | | |
36 | 66 | | |
Lines changed: 174 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 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 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| 11 | + | |
11 | 12 | | |
12 | 13 | | |
13 | 14 | | |
| |||
18 | 19 | | |
19 | 20 | | |
20 | 21 | | |
| 22 | + | |
21 | 23 | | |
22 | 24 | | |
23 | 25 | | |
| |||
155 | 157 | | |
156 | 158 | | |
157 | 159 | | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
158 | 178 | | |
159 | 179 | | |
160 | 180 | | |
| |||
170 | 190 | | |
171 | 191 | | |
172 | 192 | | |
173 | | - | |
174 | | - | |
175 | | - | |
176 | | - | |
177 | | - | |
178 | | - | |
179 | | - | |
180 | | - | |
181 | | - | |
182 | | - | |
183 | | - | |
184 | | - | |
185 | | - | |
186 | | - | |
187 | | - | |
188 | | - | |
189 | | - | |
190 | | - | |
191 | | - | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
192 | 202 | | |
193 | 203 | | |
194 | 204 | | |
| |||
0 commit comments