Commit 457e94b
committed
Settings: Make charge recording a one-time opt-in with a Charging history screen
The battery hub's "Record statistics" card was a toggle card that stayed on
screen forever. Since the switch is flipped once and then never again, it
occupied the top of the hub permanently for no further purpose.
It becomes a one-time opt-in card: same title, subtitle and tone, but with a
"Start recording" button and a sentence pointing at the new settings screen for
turning it back off. Once recording is on the card is gone entirely and the
charge section becomes the hub's first content. The durable on/off control now
lives in Settings > Charging history, which also carries a retention slider.
Retention is new behavior, not just a new knob. Previously charge_sessions rows
were kept forever and only raw samples were purged, on a hardcoded 30-day
window. Now whole entries are purged by endedAtWallMillis past a user-set
window (3-14 days, default 14) with their samples cascading, while
deleteSamplesOlderThan is retained: a sample's wall time being <= its session's
end stamp does not put it inside the window, so a long charge that ended
recently would otherwise keep its entire curve.
The purge also had to be made reachable. It previously sat inside
reconcileDanglingSessions() behind a maxOfOrNull{}?.let{}, so with no dangling
open rows - the normal state after a clean disable - it never ran at all. It now
runs in startupRepair() after reconciliation, on session seal, and immediately
on a retention change via an ordered Command.Purge.
The recorder's "might we have data" guard moves from the lastCaptureWallMillis
timestamp to a stats.db file check. The stamp was written after the first row
was committed, so a crash in that gap hid existing data from the guard forever.
That also retires the preference outright, removing a DataStore write every ~20s
while charging.
SettingsSliderItem is new: local drag state committed only on release and only
when the value actually changed, so dragging cannot write the shared DataStore
per frame or enqueue a purge per frame. Its label formats the live dragged value
so the number tracks the thumb.
The retention flow is collected at MainActivity's composition root rather than
at the settings destination. StatsViewModel is a lazy by viewModels() delegate,
so collecting at the destination would start its eager sharing in the very frame
the screen appears and render the placeholder default before the stored value
landed.1 parent eab807f commit 457e94b
21 files changed
Lines changed: 882 additions & 214 deletions
File tree
- app/src
- main
- java/eu/darken/amply
- common/settings
- main/ui
- battery
- settings
- stats
- core
- db
- ui
- res/values
- test/java/eu/darken/amply
- common/settings
- main/ui/dashboard
- stats/core
- db
Lines changed: 89 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| 15 | + | |
15 | 16 | | |
16 | 17 | | |
17 | 18 | | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
18 | 23 | | |
19 | 24 | | |
20 | 25 | | |
| |||
23 | 28 | | |
24 | 29 | | |
25 | 30 | | |
| 31 | + | |
26 | 32 | | |
27 | 33 | | |
28 | 34 | | |
| |||
116 | 122 | | |
117 | 123 | | |
118 | 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 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
119 | 198 | | |
120 | 199 | | |
121 | 200 | | |
| |||
161 | 240 | | |
162 | 241 | | |
163 | 242 | | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
164 | 253 | | |
165 | 254 | | |
Lines changed: 44 additions & 27 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
55 | 55 | | |
56 | 56 | | |
57 | 57 | | |
| 58 | + | |
58 | 59 | | |
59 | 60 | | |
60 | 61 | | |
| |||
96 | 97 | | |
97 | 98 | | |
98 | 99 | | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
99 | 109 | | |
100 | 110 | | |
101 | 111 | | |
| |||
285 | 295 | | |
286 | 296 | | |
287 | 297 | | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
288 | 302 | | |
289 | 303 | | |
290 | 304 | | |
| |||
348 | 362 | | |
349 | 363 | | |
350 | 364 | | |
351 | | - | |
352 | | - | |
353 | | - | |
354 | | - | |
355 | | - | |
356 | | - | |
357 | | - | |
358 | | - | |
359 | | - | |
360 | | - | |
361 | | - | |
362 | | - | |
363 | | - | |
364 | | - | |
365 | | - | |
366 | | - | |
367 | | - | |
368 | | - | |
369 | | - | |
370 | | - | |
371 | | - | |
372 | | - | |
373 | | - | |
374 | | - | |
375 | | - | |
376 | | - | |
377 | | - | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
378 | 395 | | |
379 | 396 | | |
380 | 397 | | |
| |||
Lines changed: 20 additions & 25 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
40 | 40 | | |
41 | 41 | | |
42 | 42 | | |
43 | | - | |
44 | | - | |
45 | | - | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
46 | 47 | | |
47 | 48 | | |
48 | 49 | | |
| |||
53 | 54 | | |
54 | 55 | | |
55 | 56 | | |
56 | | - | |
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
60 | | - | |
| 60 | + | |
61 | 61 | | |
62 | 62 | | |
63 | 63 | | |
| |||
91 | 91 | | |
92 | 92 | | |
93 | 93 | | |
94 | | - | |
95 | | - | |
96 | | - | |
97 | | - | |
98 | | - | |
99 | | - | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
100 | 98 | | |
101 | 99 | | |
102 | | - | |
103 | | - | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
104 | 103 | | |
105 | 104 | | |
106 | 105 | | |
| |||
257 | 256 | | |
258 | 257 | | |
259 | 258 | | |
| 259 | + | |
260 | 260 | | |
261 | 261 | | |
262 | 262 | | |
263 | | - | |
264 | 263 | | |
265 | 264 | | |
266 | 265 | | |
267 | | - | |
| 266 | + | |
268 | 267 | | |
269 | 268 | | |
270 | 269 | | |
| |||
278 | 277 | | |
279 | 278 | | |
280 | 279 | | |
281 | | - | |
282 | 280 | | |
283 | 281 | | |
284 | 282 | | |
285 | | - | |
| 283 | + | |
286 | 284 | | |
287 | 285 | | |
288 | 286 | | |
289 | 287 | | |
290 | 288 | | |
291 | 289 | | |
292 | 290 | | |
293 | | - | |
294 | | - | |
| 291 | + | |
| 292 | + | |
295 | 293 | | |
296 | 294 | | |
297 | 295 | | |
298 | | - | |
299 | 296 | | |
300 | 297 | | |
301 | 298 | | |
302 | | - | |
| 299 | + | |
303 | 300 | | |
304 | 301 | | |
305 | 302 | | |
| |||
319 | 316 | | |
320 | 317 | | |
321 | 318 | | |
322 | | - | |
323 | 319 | | |
324 | 320 | | |
325 | 321 | | |
326 | | - | |
| 322 | + | |
327 | 323 | | |
328 | 324 | | |
329 | 325 | | |
| |||
336 | 332 | | |
337 | 333 | | |
338 | 334 | | |
339 | | - | |
340 | 335 | | |
341 | 336 | | |
342 | 337 | | |
343 | | - | |
| 338 | + | |
344 | 339 | | |
345 | 340 | | |
346 | 341 | | |
0 commit comments