0

capture_selfie_cam: More a11y alerts

- Add a11y alert on selected camera disconnected and reconnected.
- Remove the camera on status alert on entering capture mode session.
  - Trigger the alert when the selected camera changes instead.

Bug: 1302690
Change-Id: I4241412480d28e59d740ad37f34163db93758c92
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3590419
Reviewed-by: Ahmed Fakhry <afakhry@chromium.org>
Commit-Queue: Min Chen <minch@chromium.org>
Cr-Commit-Position: refs/heads/main@{#994254}
This commit is contained in:
minch
2022-04-20 17:53:17 +00:00
committed by Chromium LUCI CQ
parent ee13b2ca3a
commit 1ed6eec3ee
7 changed files with 36 additions and 46 deletions

@ -4016,6 +4016,15 @@ Here are some things you can try to get started.
<message name="IDS_ASH_SCREEN_CAPTURE_CAMERA_PREVIEW_HIDDEN" desc="Alert spoken by screen readers when camera preview is hidden.">
Camera preview hidden
</message>
<message name="IDS_ASH_SCREEN_CAPTURE_CAMERA_DISCONNECTED" desc="Alert spoken by screen readers when the selected camera gets disconnected.">
Camera lost, trying to reconnect.
</message>
<message name="IDS_ASH_SCREEN_CAPTURE_CAMERA_RECONNECTED" desc="Alert spoken by screen readers when the selected camera gets reconnected.">
Camera reconnected.
</message>
<message name="IDS_ASH_SCREEN_CAPTURE_SELECTED_CAMERA_CHANGED" desc="Alert spoken by screen readers when the selected camera gets changed.">
Camera input set to <ph name="CAMERA_NAME">$1</ph>.
</message>
<message name="IDS_ASH_SCREEN_CAPTURE_NAVIGATION_ALERT_RECORD_MICROPHONE" desc="Alert spoken by screen readers when user tabs to record microphone setting.">
Record microphone <ph name="CURRENT_STATE">$1<ex>off</ex></ph>, Press enter to turn microphone recording <ph name="NEW_STATE">$2<ex>on</ex></ph>
</message>
@ -4028,9 +4037,6 @@ Here are some things you can try to get started.
<message name="IDS_ASH_SCREEN_CAPTURE_ALERT_OPEN" desc="Alert spoken by screen readers on entering capture mode.">
Capture Mode, default is <ph name="SOURCE">$1<ex>partial</ex></ph> <ph name="TYPE">$2<ex>screenshot</ex></ph>. Press tab for keyboard navigation.
</message>
<message name="IDS_ASH_SCREEN_CAPTURE_ALERT_OPEN_WITH_CAMERA" desc="Alert spoken by screen readers on entering capture mode with camera preview shown.">
Capture Mode, default is <ph name="SOURCE">$1<ex>partial</ex></ph> <ph name="TYPE">$2<ex>screenshot</ex></ph>. Camera input set to <ph name="CAMERA_NAME">$3</ph>, preview on. Press tab for keyboard navigation.
</message>
<message name="IDS_ASH_SCREEN_CAPTURE_SOURCE_FULLSCREEN" desc="Spoken by screen readers for the open alert with the source as full screen.">
full screen
</message>

@ -1 +0,0 @@
46d451bb6e6042d0074537840127d1e083c8cfcb

@ -0,0 +1 @@
f32b2e963acc9fb25c5fe4e177a3a01a3d360a8a

@ -0,0 +1 @@
a971150e240fa0ac3563cef137775f0bf7cc0adc

@ -0,0 +1 @@
83d5606a481fb448ddf7ac8bfc9a0baafbe67100

@ -36,6 +36,7 @@
#include "base/time/time.h"
#include "media/capture/video/video_capture_device_descriptor.h"
#include "ui/aura/window_targeter.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/compositor/layer.h"
#include "ui/display/screen.h"
#include "ui/gfx/animation/tween.h"
@ -406,8 +407,10 @@ std::string CaptureModeCameraController::GetDisplayNameOfSelectedCamera()
if (selected_camera_.is_valid()) {
const CameraInfo* camera_info =
GetCameraInfoById(selected_camera_, available_cameras_);
DCHECK(camera_info);
return camera_info->display_name;
// `camera_info` might not exist in the test even though the
// `selected_camera_` is valid.
if (camera_info)
return camera_info->display_name;
}
return std::string();
}
@ -429,6 +432,13 @@ void CaptureModeCameraController::SetSelectedCamera(CameraId camera_id) {
for (auto& observer : observers_)
observer.OnSelectedCameraChanged(selected_camera_);
const std::string camera_display_name = GetDisplayNameOfSelectedCamera();
if (!camera_display_name.empty()) {
capture_mode_util::TriggerAccessibilityAlert(l10n_util::GetStringFUTF8(
IDS_ASH_SCREEN_CAPTURE_SELECTED_CAMERA_CHANGED,
base::UTF8ToUTF16(camera_display_name)));
}
RefreshCameraPreview();
}
@ -701,6 +711,8 @@ void CaptureModeCameraController::RefreshCameraPreview() {
(kDisconnectionGracePeriod - remaining_time).InSeconds();
RecordCameraReconnectDuration(reconnect_duration_in_seconds,
kDisconnectionGracePeriod.InSeconds());
capture_mode_util::TriggerAccessibilityAlert(
IDS_ASH_SCREEN_CAPTURE_CAMERA_RECONNECTED);
}
// When a selected camera becomes available, we stop any grace period
// timer (if any), and decide whether to show or hide the preview widget
@ -718,6 +730,9 @@ void CaptureModeCameraController::RefreshCameraPreview() {
if (in_recording_camera_disconnections_)
++(*in_recording_camera_disconnections_);
capture_mode_util::TriggerAccessibilityAlert(
IDS_ASH_SCREEN_CAPTURE_CAMERA_DISCONNECTED);
}
}

@ -4,7 +4,6 @@
#include "ash/capture_mode/capture_mode_session.h"
#include <string>
#include <tuple>
#include "ash/accessibility/accessibility_controller_impl.h"
@ -350,28 +349,6 @@ void UpdateFloatingPanelBoundsIfNeeded() {
Shell::Get()->accessibility_controller()->UpdateFloatingPanelBoundsIfNeeded();
}
// Returns true if the camera preview will be shown on entering capture mode.
bool CameraPreviewWillBeShown(CaptureModeController* controller) {
auto* camera_controller = controller->camera_controller();
if (!camera_controller || controller->type() != CaptureModeType::kVideo ||
!camera_controller->selected_camera().is_valid()) {
return false;
}
switch (controller->source()) {
// The camera preview will always be shown in `kFullscreen` source with
// `kVideo` capture type and valid selected camera.
case CaptureModeSource::kFullscreen:
return true;
case CaptureModeSource::kRegion:
return !controller->user_capture_region().IsEmpty();
// The camera preview will not be shown for `kWindow` while entering the
// capture mode. As the selected window has not been set yet at this point.
case CaptureModeSource::kWindow:
return false;
}
}
views::Widget* GetCameraPreviewWidget() {
auto* camera_controller = CaptureModeController::Get()->camera_controller();
return camera_controller ? camera_controller->camera_preview_widget()
@ -640,24 +617,14 @@ void CaptureModeSession::Initialize() {
// Trigger this before creating `capture_mode_bar_widget_` as we want to read
// out this message before reading out the first view of
// `capture_mode_bar_widget_`.
const std::u16string capture_source =
capture_mode_util::TriggerAccessibilityAlert(l10n_util::GetStringFUTF8(
IDS_ASH_SCREEN_CAPTURE_ALERT_OPEN,
l10n_util::GetStringUTF16(GetMessageIdForCaptureSource(
controller_->source(), /*for_toggle_alert=*/false));
const std::u16string capture_type = l10n_util::GetStringUTF16(
controller_->type() == CaptureModeType::kImage
? IDS_ASH_SCREEN_CAPTURE_TYPE_SCREENSHOT
: IDS_ASH_SCREEN_CAPTURE_TYPE_SCREEN_RECORDING);
if (CameraPreviewWillBeShown(controller_)) {
const std::string camera_display_name =
controller_->camera_controller()->GetDisplayNameOfSelectedCamera();
DCHECK(!camera_display_name.empty());
capture_mode_util::TriggerAccessibilityAlert(l10n_util::GetStringFUTF8(
IDS_ASH_SCREEN_CAPTURE_ALERT_OPEN_WITH_CAMERA, capture_source,
capture_type, base::UTF8ToUTF16(camera_display_name)));
} else {
capture_mode_util::TriggerAccessibilityAlert(l10n_util::GetStringFUTF8(
IDS_ASH_SCREEN_CAPTURE_ALERT_OPEN, capture_source, capture_type));
}
controller_->source(), /*for_toggle_alert=*/false)),
l10n_util::GetStringUTF16(
controller_->type() == CaptureModeType::kImage
? IDS_ASH_SCREEN_CAPTURE_TYPE_SCREENSHOT
: IDS_ASH_SCREEN_CAPTURE_TYPE_SCREEN_RECORDING)));
// A context menu may have input capture when entering a session. Remove
// capture from it, otherwise subsequent mouse events will cause it to close,