0

capture_selfie_cam: Add a11y alert on preview visibility changes

Bug: 1302690
Change-Id: I9bdb8565c5adfc542e5cd6735e9911f735ed04eb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3523742
Reviewed-by: Ahmed Fakhry <afakhry@chromium.org>
Commit-Queue: Min Chen <minch@chromium.org>
Cr-Commit-Position: refs/heads/main@{#986247}
This commit is contained in:
minch
2022-03-29 00:39:35 +00:00
committed by Chromium LUCI CQ
parent e5e02a40f6
commit 8717f7bf9a
5 changed files with 48 additions and 2 deletions

@ -4021,6 +4021,12 @@ Here are some things you can try to get started.
<message name="IDS_ASH_SCREEN_CAPTURE_ALERT_RECORD_MICROPHONE_TOGGLE" desc="Alert spoken by screen readers when record microphone setting is toggled.">
Record microphone <ph name="STATE">$1<ex>off</ex></ph>
</message>
<message name="IDS_ASH_SCREEN_CAPTURE_CAMERA_PREVIEW_ON" desc="Alert spoken by screen readers when camera preview is shown.">
Camera preview on
</message>
<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_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>

@ -0,0 +1 @@
9cabcf13e4330de451a4a5735b2af1504698f145

@ -0,0 +1 @@
3e6fbfe2e347b80b74f31c080ebd3096d94a522a

@ -11,9 +11,11 @@
#include "ash/capture_mode/capture_mode_constants.h"
#include "ash/capture_mode/capture_mode_controller.h"
#include "ash/capture_mode/capture_mode_session.h"
#include "ash/capture_mode/capture_mode_util.h"
#include "ash/public/cpp/capture_mode/capture_mode_delegate.h"
#include "ash/public/cpp/shell_window_ids.h"
#include "ash/shell.h"
#include "ash/strings/grit/ash_strings.h"
#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/check.h"
@ -266,8 +268,6 @@ void CaptureModeCameraController::SetSelectedCamera(CameraId camera_id) {
selected_camera_ = std::move(camera_id);
camera_reconnect_timer_.Stop();
camera_preview_widget_.reset();
camera_preview_view_ = nullptr;
for (auto& observer : observers_)
observer.OnSelectedCameraChanged(selected_camera_);
@ -284,6 +284,7 @@ void CaptureModeCameraController::MaybeReparentPreviewWidget() {
if (!camera_preview_widget_)
return;
const bool was_visible_before = camera_preview_widget_->IsVisible();
auto* controller = CaptureModeController::Get();
DCHECK(!controller->is_recording_in_progress());
auto* parent = controller->GetCameraPreviewParentWindow();
@ -294,6 +295,11 @@ void CaptureModeCameraController::MaybeReparentPreviewWidget() {
views::Widget::ReparentNativeView(native_window, parent);
MaybeUpdatePreviewWidgetBounds();
if (was_visible_before != camera_preview_widget_->IsVisible()) {
capture_mode_util::TriggerAccessibilityAlert(
was_visible_before ? IDS_ASH_SCREEN_CAPTURE_CAMERA_PREVIEW_HIDDEN
: IDS_ASH_SCREEN_CAPTURE_CAMERA_PREVIEW_ON);
}
}
void CaptureModeCameraController::SetCameraPreviewSnapPosition(
@ -480,6 +486,12 @@ void CaptureModeCameraController::OnCameraDevicesReceived(
}
void CaptureModeCameraController::RefreshCameraPreview() {
const bool was_visible_before =
camera_preview_widget_ && camera_preview_widget_->IsVisible();
base::ScopedClosureRunner deferred_runner(base::BindOnce(
&CaptureModeCameraController::TriggerA11yAlertAfterCameraRefresh,
weak_ptr_factory_.GetWeakPtr(), was_visible_before));
const CameraInfo* camera_info = nullptr;
if (selected_camera_.is_valid()) {
if (camera_info = GetCameraInfoById(selected_camera_, available_cameras_);
@ -509,6 +521,14 @@ void CaptureModeCameraController::RefreshCameraPreview() {
return;
}
// Destroying the existing camera preview widget before recreating a new one
// when a different camera was selected.
if (camera_preview_view_ &&
camera_preview_view_->camera_id() != selected_camera_) {
camera_preview_widget_.reset();
camera_preview_view_ = nullptr;
}
if (!camera_preview_widget_) {
const auto preview_bounds = GetPreviewWidgetBounds();
camera_preview_widget_ = CreateCameraPreviewWidget(preview_bounds);
@ -617,4 +637,16 @@ gfx::Rect CaptureModeCameraController::
return preview_window->bounds();
}
void CaptureModeCameraController::TriggerA11yAlertAfterCameraRefresh(
bool was_preview_visible_before) {
const bool is_preview_visible_now =
camera_preview_widget_ && camera_preview_widget_->IsVisible();
if (was_preview_visible_before != is_preview_visible_now) {
capture_mode_util::TriggerAccessibilityAlert(
was_preview_visible_before
? IDS_ASH_SCREEN_CAPTURE_CAMERA_PREVIEW_HIDDEN
: IDS_ASH_SCREEN_CAPTURE_CAMERA_PREVIEW_ON);
}
}
} // namespace ash

@ -243,6 +243,12 @@ class ASH_EXPORT CaptureModeCameraController
void SetBoundsOnPreviewWidget(const gfx::Rect& bounds);
// Triggers a11y alert after RefreshCameraPreview() based on
// `was_preview_visible_before` and the current visibility of
// `camera_preview_widget_`. `was_preview_visible_before` is the visibility of
// the camera preview when RefreshCameraPreview() was called.
void TriggerA11yAlertAfterCameraRefresh(bool was_preview_visible_before);
// Owned by CaptureModeController and guaranteed to be not null and to outlive
// `this`.
CaptureModeDelegate* const delegate_;