screenshare: fix inline per-call quality override being discarded

The Share control's inline quality dropdown sets a session-only
`share_quality_selection`, but ToggleScreenShare (which opens the audio
picker on the only real path to a share) unconditionally reset it back to
the saved config default before ConfirmShareScreen read it. The picker has
no quality control of its own, so the user's per-call pick was silently
dropped 100% of the time and every share used the persisted default.

Drop the reset; add a regression test asserting the override survives
picker-open and reaches the confirm.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-06 13:09:22 -04:00
co-authored by Claude Opus 4.8
parent 96e41de1b1
commit e378b2e33b
+41 -1
View File
@@ -1759,7 +1759,11 @@ fn update(state: &mut AppState, message: AppMessage) -> Task<AppMessage> {
// so the picker can't be reopened during the startup window. // so the picker can't be reopened during the startup window.
state.share_picker_open = true; state.share_picker_open = true;
state.share_audio_selection = None; state.share_audio_selection = None;
state.share_quality_selection = state.config.screen_share.quality; // NB: do NOT reset `share_quality_selection` here. It is the
// per-call override set by the inline quality dropdown next to
// the Share button, and the picker has no quality control of its
// own — resetting it would silently discard the user's pick
// before `ConfirmShareScreen` reads it.
state.share_audio_apps.clear(); state.share_audio_apps.clear();
let _ = state.controller.send(CoreCommand::ListAudioApps); let _ = state.controller.send(CoreCommand::ListAudioApps);
} }
@@ -9271,6 +9275,42 @@ mod tests {
assert!(!state.share_picker_open); assert!(!state.share_picker_open);
} }
#[test]
fn inline_quality_override_survives_opening_the_picker() {
// The inline quality dropdown (next to the Share button) sets a
// per-call `share_quality_selection`. Opening the audio picker via
// ToggleScreenShare must NOT reset it back to the saved config default,
// or the override the user just made is silently discarded before
// ConfirmShareScreen reads it into StartScreenShare.
use crate::config::ShareQuality;
let mut state = AppState::default();
// Saved default is Auto; the user picks a different per-call quality.
assert_eq!(state.config.screen_share.quality, ShareQuality::Auto);
let _ = update(
&mut state,
AppMessage::SelectShareQualityOverride(ShareQuality::High),
);
assert_eq!(state.share_quality_selection, ShareQuality::High);
// Clicking Share opens the picker — the override must be preserved.
let _ = update(&mut state, AppMessage::ToggleScreenShare);
assert!(state.share_picker_open);
assert_eq!(
state.share_quality_selection,
ShareQuality::High,
"opening the picker must not clobber the inline per-call override"
);
// Confirming reads that same override into the share start.
let _ = update(&mut state, AppMessage::ConfirmShareScreen);
assert!(state.share_starting);
assert_eq!(
state.share_quality_selection,
ShareQuality::High,
"the override the picker preserved must still be what ConfirmShareScreen sends"
);
}
#[test] #[test]
fn share_start_failure_clears_in_flight_flag() { fn share_start_failure_clears_in_flight_flag() {
// A failed spawn surfaces as UiEvent::Error (not ScreenShareStopped); the // A failed spawn surfaces as UiEvent::Error (not ScreenShareStopped); the