feat: video capture frontend — consent, notifications, activity stream & settings#292
Conversation
shanselman
left a comment
There was a problem hiding this comment.
Thanks for adding the recording UX surfaces. I think the consent model needs changes before this can merge.
Two blockers stood out:
- Concurrent recording requests can show multiple consent dialogs and race unsynchronized
SettingsManager.Savecalls, so consent state can be lost or applied unpredictably. - The sticky consent flags can be granted from Settings and then future recording requests proceed without a fresh prompt. For camera/screen recording, that needs a clearer privacy model: settings text should make the behavior explicit, future recordings should have reliable user-visible indication, and consent updates should be serialized/atomic.
25d0072 to
40b674a
Compare
|
Thanks for feedback! Pushed changes addressing these blockers--fixed the consent dialog race condition and added a lock on SettingsManager.Save() to serialize concurrent writes. Also updated the Settings text to make the sticky consent behavior more explicit. Also added a 3-2-1 countdown overlay before recording, to give users a clear visual cue that recording is about to start, whether thru camera or on screen. |
|
Thanks so much for the quick follow-up, Christine — this is really close. 🙏 Bot-assisted note from Scott's triage pass: I can see you addressed the big issues we called out around consent dialog coalescing and serializing I think there are just a few small things left before we can comfortably clear the requested-changes review:
Again, thank you — the feature direction is good, and the latest commits show exactly the kind of quick iteration we were hoping for. This feels like a small cleanup pass away rather than a major rework. |
Add IsScreenRecording/IsCameraRecording properties and RecordingStateChanged event to NodeService. Wrap OnScreenRecord and OnCameraClip handlers to set state and raise events before/after async recording calls. This enables downstream UI components (tray icon, toasts, activity log) to react to recording lifecycle changes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Show toasts on recording start, completion, and failure for both screen recording and camera clips. Extract reusable ShowToast helper and add localized strings for all 5 locales (en-us, fr-fr, zh-cn, zh-tw, nl-nl). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add recording start/complete events with emoji indicators (🔴/✅) to the activity stream. Render emoji in a separate TextBlock element to prevent color emoji clipping by the card's CornerRadius clip mask. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Show a standalone WindowEx consent dialog the first time an agent requests screen or camera recording. Consent is tracked separately per recording type (ScreenRecordingConsentGiven, CameraRecordingConsentGiven) so users can allow screen recording without granting camera access. The dialog uses extend-into-titlebar styling, Mica backdrop, and SetForegroundWindow to ensure visibility. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add Privacy section to Settings with screen/camera recording toggles - Settings toggles auto-refresh when consent changes externally - Fix consent dialog z-order with HWND_TOPMOST technique - Fix button width (MinWidth instead of fixed Width) - Add SettingsManager.Saved event for cross-component reactivity - Allow button uses AccentButtonStyle for consistency - Remove misleading 'only asked once' from privacy text Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add SemaphoreSlim guard in EnsureRecordingConsentAsync so concurrent recording requests coalesce onto a single consent dialog per type - Add lock around SettingsManager.Save() to prevent concurrent file writes - Update privacy toggle text in all 5 locales to clarify that enabling skips future consent prompts (e.g. 'Allow screen recording without prompting') Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Show a translucent topmost countdown window (3 → 2 → 1) before screen and camera recordings begin, similar to Windows Snipping Tool. Gives users clear visual indication that recording is about to start. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
40b674a to
3780405
Compare
- Add dirty-state guard to SettingsPage: external consent saves no longer overwrite unsaved user edits on the Settings page - Update consent dialog description in all 5 locales to explicitly state that the choice persists until changed in Settings - Add 4 focused tests for settings save thread safety, Saved event, consent persistence, and consent revocation Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Summary
Adds the complete frontend experience for the video capture capabilities (
screen.recordandcamera.clip). The backend recording commands already existed but had no UI feedback, consent flow, or user-facing controls.Demo
📹 Video walkthrough
What's included
1. Recording state tracking (
NodeService.cs)RecordingTypeenum (Screen, Camera),RecordingStateEventArgsclassRecordingStateChangedevent withIsScreenRecording/IsCameraRecordingpropertiesOnScreenRecordandOnCameraClipthat emit state start/complete/error2. Toast notifications
3. Activity stream integration (
App.xaml.cs,ActivityPage.xaml)Iconproperty toActivityStreamItem4. Recording consent dialog (
RecordingConsentDialog.cs)SetForegroundWindow+HWND_TOPMOSTfor reliable z-order5. Privacy settings UI (
SettingsPage.xaml)SettingsManager.Savedevent when consent changes externally6. Localization
LocalizationValidationTests(all locales have matching keys)Testing