From 2f3c62035ddff21f5e85ed708ae7123985594924 Mon Sep 17 00:00:00 2001 From: Pi-Hsun Shih Date: Sat, 13 Aug 2022 01:08:22 +0000 Subject: [PATCH] camera: check if autozoom is supported by camera HAL Check if autozoom is supported by camera HAL, and only shows the feature pod button, toast and educational nudge if it's supported. This needs platform side support (CL:3817780) to works. Bug: b:221980963 Test: manually Test: ash_unittests --gtest_filter="AutozoomToastControllerTest*" Test: capture_unittests --gtest_filter="CameraHalDispatcherImplTest.*" Change-Id: I6ae8b1142616b7c55fc8e06c7b312f50985114da Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3812481 Auto-Submit: Pi-Hsun Shih Reviewed-by: Shik Chen Reviewed-by: Daniel Cheng Commit-Queue: Daniel Cheng Cr-Commit-Position: refs/heads/main@{#1034766} --- ash/system/camera/autozoom_controller_impl.cc | 50 ++++++++++++++++++- ash/system/camera/autozoom_controller_impl.h | 24 ++++++++- .../camera/autozoom_feature_pod_controller.cc | 31 +++--------- .../camera/autozoom_feature_pod_controller.h | 9 +--- .../camera/autozoom_nudge_controller.cc | 14 +----- ash/system/camera/autozoom_nudge_controller.h | 14 ++---- ash/system/camera/autozoom_observer.h | 3 ++ .../camera/autozoom_toast_controller.cc | 35 ++++--------- ash/system/camera/autozoom_toast_controller.h | 20 ++------ .../autozoom_toast_controller_unittest.cc | 32 +++++------- .../chromeos/camera_hal_dispatcher_impl.cc | 37 ++++++++++++++ .../chromeos/camera_hal_dispatcher_impl.h | 7 +++ .../camera_hal_dispatcher_impl_unittest.cc | 2 + .../chromeos/mojom/cros_camera_service.mojom | 6 ++- 14 files changed, 166 insertions(+), 118 deletions(-) diff --git a/ash/system/camera/autozoom_controller_impl.cc b/ash/system/camera/autozoom_controller_impl.cc index 8020b05e2a12f..9c2f18465f27a 100644 --- a/ash/system/camera/autozoom_controller_impl.cc +++ b/ash/system/camera/autozoom_controller_impl.cc @@ -7,18 +7,34 @@ #include "ash/constants/ash_pref_names.h" #include "ash/session/session_controller_impl.h" #include "ash/shell.h" -#include "base/logging.h" #include "media/capture/video/chromeos/camera_hal_dispatcher_impl.h" namespace ash { AutozoomControllerImpl::AutozoomControllerImpl() : nudge_controller_(std::make_unique(this)) { + auto* camera_hal_dispatcher = media::CameraHalDispatcherImpl::GetInstance(); + if (camera_hal_dispatcher) { + camera_hal_dispatcher->GetAutoFramingSupported( + base::BindOnce(&AutozoomControllerImpl::SetAutozoomSupported, + weak_ptr_factory_.GetWeakPtr())); + camera_hal_dispatcher->AddActiveClientObserver(this); + } + Shell::Get()->session_controller()->AddObserver(this); } AutozoomControllerImpl::~AutozoomControllerImpl() { Shell::Get()->session_controller()->RemoveObserver(this); + + auto* camera_hal_dispatcher = media::CameraHalDispatcherImpl::GetInstance(); + if (camera_hal_dispatcher) { + camera_hal_dispatcher->RemoveActiveClientObserver(this); + } +} + +bool AutozoomControllerImpl::IsAutozoomControlEnabled() { + return autozoom_supported_ && active_camera_client_count_ > 0; } cros::mojom::CameraAutoFramingState AutozoomControllerImpl::GetState() { @@ -33,6 +49,19 @@ void AutozoomControllerImpl::SetState( } } +void AutozoomControllerImpl::SetAutozoomSupported(bool autozoom_supported) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + bool orig_control_enabled = IsAutozoomControlEnabled(); + autozoom_supported_ = autozoom_supported; + + bool control_enabled = IsAutozoomControlEnabled(); + if (control_enabled != orig_control_enabled) { + for (auto& observer : observers_) + observer.OnAutozoomControlEnabledChanged(control_enabled); + } +} + void AutozoomControllerImpl::Toggle() { SetState(state_ == cros::mojom::CameraAutoFramingState::OFF ? cros::mojom::CameraAutoFramingState::ON_SINGLE @@ -62,6 +91,7 @@ void AutozoomControllerImpl::OnStatePrefChanged() { } void AutozoomControllerImpl::Refresh() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (active_user_pref_service_) { state_ = static_cast( active_user_pref_service_->GetInteger(prefs::kAutozoomState)); @@ -94,6 +124,24 @@ void AutozoomControllerImpl::InitFromUserPrefs() { Refresh(); } +void AutozoomControllerImpl::OnActiveClientChange( + cros::mojom::CameraClientType type, + bool is_active) { + bool orig_control_enabled = IsAutozoomControlEnabled(); + if (is_active) { + active_camera_client_count_++; + } else { + DCHECK(active_camera_client_count_ > 0); + active_camera_client_count_--; + } + + bool control_enabled = IsAutozoomControlEnabled(); + if (control_enabled != orig_control_enabled) { + for (auto& observer : observers_) + observer.OnAutozoomControlEnabledChanged(control_enabled); + } +} + // static void AutozoomControllerImpl::RegisterProfilePrefs( PrefRegistrySimple* registry) { diff --git a/ash/system/camera/autozoom_controller_impl.h b/ash/system/camera/autozoom_controller_impl.h index 16bf9870374fa..1f49d10bf05a3 100644 --- a/ash/system/camera/autozoom_controller_impl.h +++ b/ash/system/camera/autozoom_controller_impl.h @@ -14,6 +14,7 @@ #include "components/prefs/pref_change_registrar.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" +#include "media/capture/video/chromeos/camera_hal_dispatcher_impl.h" #include "media/capture/video/chromeos/mojom/cros_camera_service.mojom.h" namespace ash { @@ -21,7 +22,9 @@ namespace ash { // Controls the Autozoom feature that, when enabled, intelligently // pans/tilts/zooms the camera to frame a set of regions of interest captured // by the camera. -class ASH_EXPORT AutozoomControllerImpl : public SessionObserver { +class ASH_EXPORT AutozoomControllerImpl + : public SessionObserver, + public media::CameraActiveClientObserver { public: AutozoomControllerImpl(); @@ -41,6 +44,8 @@ class ASH_EXPORT AutozoomControllerImpl : public SessionObserver { void AddObserver(AutozoomObserver* observer); void RemoveObserver(AutozoomObserver* observer); + bool IsAutozoomControlEnabled(); + // SessionObserver: void OnActiveUserPrefServiceChanged(PrefService* pref_service) override; @@ -54,6 +59,12 @@ class ASH_EXPORT AutozoomControllerImpl : public SessionObserver { // Called when the user pref for the enabled status of Autozoom is changed. void OnStatePrefChanged(); + void SetAutozoomSupported(bool autozoom_supported); + + // CameraActiveClientObserver + void OnActiveClientChange(cros::mojom::CameraClientType type, + bool is_active) override; + // The pref service of the currently active user. Can be null in // ash_unittests. PrefService* active_user_pref_service_ = nullptr; @@ -69,6 +80,17 @@ class ASH_EXPORT AutozoomControllerImpl : public SessionObserver { base::ObserverList observers_; std::unique_ptr nudge_controller_; + + bool autozoom_supported_ = false; + + // The number of current active camera clients. Autozoom control should only + // be shown when there's at least one active camera client. + int active_camera_client_count_ = 0; + + // All methods of this class should be run on the same sequence. + SEQUENCE_CHECKER(sequence_checker_); + + base::WeakPtrFactory weak_ptr_factory_{this}; }; } // namespace ash diff --git a/ash/system/camera/autozoom_feature_pod_controller.cc b/ash/system/camera/autozoom_feature_pod_controller.cc index d913d1b19ca32..d32ad091dda89 100644 --- a/ash/system/camera/autozoom_feature_pod_controller.cc +++ b/ash/system/camera/autozoom_feature_pod_controller.cc @@ -16,21 +16,11 @@ namespace ash { AutozoomFeaturePodController::AutozoomFeaturePodController() { - auto* camera_hal_dispatcher = media::CameraHalDispatcherImpl::GetInstance(); - if (camera_hal_dispatcher) { - camera_hal_dispatcher->AddActiveClientObserver(this); - } - Shell::Get()->autozoom_controller()->AddObserver(this); } AutozoomFeaturePodController::~AutozoomFeaturePodController() { Shell::Get()->autozoom_controller()->RemoveObserver(this); - - auto* camera_hal_dispatcher = media::CameraHalDispatcherImpl::GetInstance(); - if (camera_hal_dispatcher) { - camera_hal_dispatcher->RemoveActiveClientObserver(this); - } } FeaturePodButton* AutozoomFeaturePodController::CreateButton() { @@ -67,8 +57,8 @@ void AutozoomFeaturePodController::UpdateButtonVisibility() { return; button_->SetVisible( - Shell::Get()->session_controller()->ShouldEnableSettings() && - active_camera_client_count_ > 0); + Shell::Get()->autozoom_controller()->IsAutozoomControlEnabled() && + Shell::Get()->session_controller()->ShouldEnableSettings()); } void AutozoomFeaturePodController::OnAutozoomStateChanged( @@ -76,6 +66,11 @@ void AutozoomFeaturePodController::OnAutozoomStateChanged( UpdateButton(state); } +void AutozoomFeaturePodController::OnAutozoomControlEnabledChanged( + bool enabled) { + UpdateButtonVisibility(); +} + void AutozoomFeaturePodController::UpdateButton( cros::mojom::CameraAutoFramingState state) { if (!button_) @@ -108,16 +103,4 @@ void AutozoomFeaturePodController::UpdateButton( IDS_ASH_STATUS_TRAY_AUTOZOOM_TOGGLE_TOOLTIP, tooltip_state)); } -void AutozoomFeaturePodController::OnActiveClientChange( - cros::mojom::CameraClientType type, - bool is_active) { - if (is_active) { - active_camera_client_count_++; - } else { - active_camera_client_count_--; - } - - UpdateButtonVisibility(); -} - } // namespace ash diff --git a/ash/system/camera/autozoom_feature_pod_controller.h b/ash/system/camera/autozoom_feature_pod_controller.h index ebe78407820fa..f1fdbb41bd3d3 100644 --- a/ash/system/camera/autozoom_feature_pod_controller.h +++ b/ash/system/camera/autozoom_feature_pod_controller.h @@ -7,13 +7,11 @@ #include "ash/system/camera/autozoom_observer.h" #include "ash/system/unified/feature_pod_controller_base.h" -#include "media/capture/video/chromeos/camera_hal_dispatcher_impl.h" namespace ash { // Controller of a feature pod button that toggles autozoom. class AutozoomFeaturePodController : public FeaturePodControllerBase, - public media::CameraActiveClientObserver, public AutozoomObserver { public: AutozoomFeaturePodController(); @@ -33,19 +31,14 @@ class AutozoomFeaturePodController : public FeaturePodControllerBase, // AutozoomObserver: void OnAutozoomStateChanged( cros::mojom::CameraAutoFramingState state) override; + void OnAutozoomControlEnabledChanged(bool enabled) override; private: void UpdateButton(cros::mojom::CameraAutoFramingState state); void UpdateButtonVisibility(); - // CameraActiveClientObserver - void OnActiveClientChange(cros::mojom::CameraClientType type, - bool is_active) override; - FeaturePodButton* button_ = nullptr; - - int active_camera_client_count_ = 0; }; } // namespace ash diff --git a/ash/system/camera/autozoom_nudge_controller.cc b/ash/system/camera/autozoom_nudge_controller.cc index 6391d432321d2..5ec2c364137f7 100644 --- a/ash/system/camera/autozoom_nudge_controller.cc +++ b/ash/system/camera/autozoom_nudge_controller.cc @@ -30,10 +30,6 @@ AutozoomNudgeController::AutozoomNudgeController( : autozoom_controller_(autozoom_controller) { autozoom_controller_->AddObserver(this); - auto* camera_hal_dispatcher = media::CameraHalDispatcherImpl::GetInstance(); - if (camera_hal_dispatcher) - camera_hal_dispatcher->AddActiveClientObserver(this); - if (base::FeatureList::IsEnabled(features::kAutozoomNudgeSessionReset)) Shell::Get()->session_controller()->AddObserver(this); } @@ -41,10 +37,6 @@ AutozoomNudgeController::AutozoomNudgeController( AutozoomNudgeController::~AutozoomNudgeController() { autozoom_controller_->RemoveObserver(this); - auto* camera_hal_dispatcher = media::CameraHalDispatcherImpl::GetInstance(); - if (camera_hal_dispatcher) - camera_hal_dispatcher->RemoveActiveClientObserver(this); - if (base::FeatureList::IsEnabled(features::kAutozoomNudgeSessionReset)) Shell::Get()->session_controller()->RemoveObserver(this); } @@ -128,10 +120,8 @@ bool AutozoomNudgeController::ShouldShowNudge(PrefService* prefs) { return (base::Time::Now() - last_shown_time) > kMinInterval; } -void AutozoomNudgeController::OnActiveClientChange( - cros::mojom::CameraClientType type, - bool is_active) { - if (!is_active) +void AutozoomNudgeController::OnAutozoomControlEnabledChanged(bool enabled) { + if (!enabled) return; PrefService* prefs = diff --git a/ash/system/camera/autozoom_nudge_controller.h b/ash/system/camera/autozoom_nudge_controller.h index 10d78a5642b3c..523e961dcba38 100644 --- a/ash/system/camera/autozoom_nudge_controller.h +++ b/ash/system/camera/autozoom_nudge_controller.h @@ -10,7 +10,6 @@ #include "ash/system/camera/autozoom_observer.h" #include "ash/system/tray/system_nudge_controller.h" #include "base/time/time.h" -#include "media/capture/video/chromeos/camera_hal_dispatcher_impl.h" class PrefService; class PrefRegistrySimple; @@ -19,11 +18,9 @@ namespace ash { class AutozoomControllerImpl; -class ASH_EXPORT AutozoomNudgeController - : public SystemNudgeController, - public AutozoomObserver, - public SessionObserver, - public media::CameraActiveClientObserver { +class ASH_EXPORT AutozoomNudgeController : public SystemNudgeController, + public AutozoomObserver, + public SessionObserver { public: explicit AutozoomNudgeController(AutozoomControllerImpl* controller); AutozoomNudgeController(const AutozoomNudgeController&) = delete; @@ -57,10 +54,7 @@ class ASH_EXPORT AutozoomNudgeController // AutozoomObserver: void OnAutozoomStateChanged( cros::mojom::CameraAutoFramingState state) override; - - // CameraActiveClientObserver: - void OnActiveClientChange(cros::mojom::CameraClientType type, - bool is_active) override; + void OnAutozoomControlEnabledChanged(bool enabled) override; // Owned by ash/Shell. AutozoomControllerImpl* const autozoom_controller_; diff --git a/ash/system/camera/autozoom_observer.h b/ash/system/camera/autozoom_observer.h index 6dd5430fd9531..ab18b60e63291 100644 --- a/ash/system/camera/autozoom_observer.h +++ b/ash/system/camera/autozoom_observer.h @@ -15,6 +15,9 @@ class AutozoomObserver : public base::CheckedObserver { // Called when the autozoom state has changed. virtual void OnAutozoomStateChanged( cros::mojom::CameraAutoFramingState state) {} + + // Called when the autozoom control enabled state has changed. + virtual void OnAutozoomControlEnabledChanged(bool enabled) {} }; } // namespace ash diff --git a/ash/system/camera/autozoom_toast_controller.cc b/ash/system/camera/autozoom_toast_controller.cc index e79ff77715fa5..fa7b3e8388ee8 100644 --- a/ash/system/camera/autozoom_toast_controller.cc +++ b/ash/system/camera/autozoom_toast_controller.cc @@ -27,39 +27,25 @@ void AutozoomToastController::Delegate::RemoveAutozoomObserver( Shell::Get()->autozoom_controller()->RemoveObserver(observer); } -void AutozoomToastController::Delegate::AddCameraActiveClientObserver( - media::CameraActiveClientObserver* observer) { - auto* camera_hal_dispatcher = media::CameraHalDispatcherImpl::GetInstance(); - if (camera_hal_dispatcher) { - camera_hal_dispatcher->AddActiveClientObserver(observer); - } -} - -void AutozoomToastController::Delegate::RemoveCameraActiveClientObserver( - media::CameraActiveClientObserver* observer) { - auto* camera_hal_dispatcher = media::CameraHalDispatcherImpl::GetInstance(); - if (camera_hal_dispatcher) { - camera_hal_dispatcher->RemoveActiveClientObserver(observer); - } -} - -bool AutozoomToastController::Delegate::AutozoomEnabled() { +bool AutozoomToastController::Delegate::IsAutozoomEnabled() { return Shell::Get()->autozoom_controller()->GetState() != cros::mojom::CameraAutoFramingState::OFF; } +bool AutozoomToastController::Delegate::IsAutozoomControlEnabled() { + return Shell::Get()->autozoom_controller()->IsAutozoomControlEnabled(); +} + AutozoomToastController::AutozoomToastController( UnifiedSystemTray* tray, std::unique_ptr delegate) : tray_(tray), delegate_(std::move(delegate)) { delegate_->AddAutozoomObserver(this); - delegate_->AddCameraActiveClientObserver(this); } AutozoomToastController::~AutozoomToastController() { if (bubble_widget_ && !bubble_widget_->IsClosed()) bubble_widget_->CloseNow(); - delegate_->RemoveCameraActiveClientObserver(this); delegate_->RemoveAutozoomObserver(this); } @@ -164,7 +150,7 @@ void AutozoomToastController::OnAutozoomStateChanged( void AutozoomToastController::UpdateToastView() { if (toast_view_) { - toast_view_->SetAutozoomEnabled(/*enabled=*/delegate_->AutozoomEnabled()); + toast_view_->SetAutozoomEnabled(/*enabled=*/delegate_->IsAutozoomEnabled()); int width = base::clamp(toast_view_->GetPreferredSize().width(), kAutozoomToastMinWidth, kAutozoomToastMaxWidth); bubble_view_->SetPreferredWidth(width); @@ -175,12 +161,9 @@ void AutozoomToastController::StopAutocloseTimer() { close_timer_.Stop(); } -void AutozoomToastController::OnActiveClientChange( - cros::mojom::CameraClientType type, - bool is_active) { - // TODO(pihsun): Should this only be shown for some client type? - if (is_active) { - if (delegate_->AutozoomEnabled()) { +void AutozoomToastController::OnAutozoomControlEnabledChanged(bool enabled) { + if (enabled) { + if (delegate_->IsAutozoomEnabled()) { ShowToast(); } else { HideToast(); diff --git a/ash/system/camera/autozoom_toast_controller.h b/ash/system/camera/autozoom_toast_controller.h index 6048fe9d670ee..ee2319681e289 100644 --- a/ash/system/camera/autozoom_toast_controller.h +++ b/ash/system/camera/autozoom_toast_controller.h @@ -10,7 +10,6 @@ #include "ash/system/camera/autozoom_toast_view.h" #include "ash/system/tray/tray_bubble_view.h" #include "base/timer/timer.h" -#include "media/capture/video/chromeos/camera_hal_dispatcher_impl.h" namespace ash { @@ -18,10 +17,8 @@ class UnifiedSystemTray; // Controller class for the autozoom toast, which is shown when the autozoom is // on and camera is opened. -class ASH_EXPORT AutozoomToastController - : public TrayBubbleView::Delegate, - public AutozoomObserver, - public media::CameraActiveClientObserver { +class ASH_EXPORT AutozoomToastController : public TrayBubbleView::Delegate, + public AutozoomObserver { public: // The Delegate interface handles adding and removing observers on behalf of // AutozoomToastController. This is used for unit tests. @@ -38,13 +35,9 @@ class ASH_EXPORT AutozoomToastController virtual void RemoveAutozoomObserver(AutozoomObserver* observer); - virtual void AddCameraActiveClientObserver( - media::CameraActiveClientObserver* observer); + virtual bool IsAutozoomEnabled(); - virtual void RemoveCameraActiveClientObserver( - media::CameraActiveClientObserver* observer); - - virtual bool AutozoomEnabled(); + virtual bool IsAutozoomControlEnabled(); }; AutozoomToastController(UnifiedSystemTray* tray, @@ -76,10 +69,7 @@ class ASH_EXPORT AutozoomToastController // AutozoomObserver: void OnAutozoomStateChanged( cros::mojom::CameraAutoFramingState state) override; - - // CameraActiveClientObserver: - void OnActiveClientChange(cros::mojom::CameraClientType type, - bool is_active) override; + void OnAutozoomControlEnabledChanged(bool enabled) override; // Updates the toast UI with the current privacy screen state. void UpdateToastView(); diff --git a/ash/system/camera/autozoom_toast_controller_unittest.cc b/ash/system/camera/autozoom_toast_controller_unittest.cc index 930b74c4fdefd..9cccd7ddcc669 100644 --- a/ash/system/camera/autozoom_toast_controller_unittest.cc +++ b/ash/system/camera/autozoom_toast_controller_unittest.cc @@ -21,19 +21,9 @@ class TestDelegate : public AutozoomToastController::Delegate { autozoom_observer = nullptr; } - void AddCameraActiveClientObserver( - media::CameraActiveClientObserver* observer) override { - ASSERT_EQ(camera_observer, nullptr); - camera_observer = observer; - } - - void RemoveCameraActiveClientObserver( - media::CameraActiveClientObserver* observer) override { - ASSERT_EQ(camera_observer, observer); - camera_observer = nullptr; - } + bool IsAutozoomEnabled() override { return autozoom_enabled_; } - bool AutozoomEnabled() override { return autozoom_enabled_; } + bool IsAutozoomControlEnabled() override { return autozoom_control_enabled_; } void SetAutozoomEnabled(bool autozoom_enabled) { autozoom_enabled_ = autozoom_enabled; @@ -44,17 +34,19 @@ class TestDelegate : public AutozoomToastController::Delegate { } } - void SetCameraActive(bool is_active) { - ASSERT_NE(camera_observer, nullptr); - camera_observer->OnActiveClientChange( - cros::mojom::CameraClientType::ASH_CHROME, is_active); + void SetAutozoomControlEnabled(bool autozoom_control_enabled) { + autozoom_control_enabled_ = autozoom_control_enabled; + if (autozoom_observer != nullptr) { + autozoom_observer->OnAutozoomControlEnabledChanged( + autozoom_control_enabled_); + } } AutozoomObserver* autozoom_observer = nullptr; - media::CameraActiveClientObserver* camera_observer = nullptr; private: bool autozoom_enabled_ = false; + bool autozoom_control_enabled_ = false; }; class AutozoomToastControllerTest : public AshTestBase { @@ -93,7 +85,7 @@ TEST_F(AutozoomToastControllerTest, ShowToastWhenCameraActive) { EXPECT_EQ(bubble_widget(), nullptr); // No toast when enabling camera when autozoom is disabled. - delegate_->SetCameraActive(true); + delegate_->SetAutozoomControlEnabled(true); EXPECT_EQ(bubble_widget(), nullptr); // No toast when enabling autozoom when camera is already active. @@ -101,8 +93,8 @@ TEST_F(AutozoomToastControllerTest, ShowToastWhenCameraActive) { EXPECT_EQ(bubble_widget(), nullptr); // Toast is shown when autozoom is enabled when camera become active. - delegate_->SetCameraActive(false); - delegate_->SetCameraActive(true); + delegate_->SetAutozoomControlEnabled(false); + delegate_->SetAutozoomControlEnabled(true); ASSERT_NE(bubble_widget(), nullptr); EXPECT_TRUE(bubble_widget()->IsVisible()); } diff --git a/media/capture/video/chromeos/camera_hal_dispatcher_impl.cc b/media/capture/video/chromeos/camera_hal_dispatcher_impl.cc index 2607139b0ce73..f9ba75e0b211a 100644 --- a/media/capture/video/chromeos/camera_hal_dispatcher_impl.cc +++ b/media/capture/video/chromeos/camera_hal_dispatcher_impl.cc @@ -23,6 +23,7 @@ #include "base/rand_util.h" #include "base/strings/string_number_conversions.h" #include "base/synchronization/waitable_event.h" +#include "base/task/bind_post_task.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/sequenced_task_runner_handle.h" #include "base/trace_event/trace_event.h" @@ -440,6 +441,10 @@ void CameraHalDispatcherImpl::RegisterServerWithToken( camera_hal_server_.set_disconnect_handler( base::BindOnce(&CameraHalDispatcherImpl::OnCameraHalServerConnectionError, base::Unretained(this))); + if (auto_framing_supported_callback_) { + camera_hal_server_->GetAutoFramingSupported( + std::move(auto_framing_supported_callback_)); + } camera_hal_server_->SetAutoFramingState(current_auto_framing_state_); CAMERA_LOG(EVENT) << "Camera HAL server registered"; std::move(callback).Run( @@ -933,6 +938,38 @@ void CameraHalDispatcherImpl::SetAutoFramingStateOnProxyThread( } } +void CameraHalDispatcherImpl::GetAutoFramingSupported( + cros::mojom::CameraHalServer::GetAutoFramingSupportedCallback callback) { + if (!proxy_thread_.IsRunning()) { + std::move(callback).Run(false); + return; + } + // Unretained reference is safe here because CameraHalDispatcherImpl owns + // |proxy_thread_|. + proxy_task_runner_->PostTask( + FROM_HERE, + base::BindOnce( + &CameraHalDispatcherImpl::GetAutoFramingSupportedOnProxyThread, + base::Unretained(this), + // Make sure to hop back to the current thread for the reply. + base::BindPostTask(base::SequencedTaskRunnerHandle::Get(), + std::move(callback), FROM_HERE))); +} + +void CameraHalDispatcherImpl::GetAutoFramingSupportedOnProxyThread( + cros::mojom::CameraHalServer::GetAutoFramingSupportedCallback callback) { + DCHECK(proxy_task_runner_->BelongsToCurrentThread()); + if (!camera_hal_server_) { + // TODO(pihsun): Currently only AutozoomControllerImpl calls + // GetAutoFramingSupported. Support multiple call to the function using + // CallbackList if it's needed. + DCHECK(!auto_framing_supported_callback_); + auto_framing_supported_callback_ = std::move(callback); + return; + } + camera_hal_server_->GetAutoFramingSupported(std::move(callback)); +} + TokenManager* CameraHalDispatcherImpl::GetTokenManagerForTesting() { return &token_manager_; } diff --git a/media/capture/video/chromeos/camera_hal_dispatcher_impl.h b/media/capture/video/chromeos/camera_hal_dispatcher_impl.h index fda23290a4045..ad5292f1af288 100644 --- a/media/capture/video/chromeos/camera_hal_dispatcher_impl.h +++ b/media/capture/video/chromeos/camera_hal_dispatcher_impl.h @@ -236,6 +236,8 @@ class CAPTURE_EXPORT CameraHalDispatcherImpl final cros::mojom::CameraClientType type); void SetAutoFramingState(cros::mojom::CameraAutoFramingState state); + void GetAutoFramingSupported( + cros::mojom::CameraHalServer::GetAutoFramingSupportedCallback callback); private: friend struct base::DefaultSingletonTraits; @@ -295,6 +297,8 @@ class CAPTURE_EXPORT CameraHalDispatcherImpl final void SetAutoFramingStateOnProxyThread( cros::mojom::CameraAutoFramingState state); + void GetAutoFramingSupportedOnProxyThread( + cros::mojom::CameraHalServer::GetAutoFramingSupportedCallback callback); void StopOnProxyThread(); @@ -342,6 +346,9 @@ class CAPTURE_EXPORT CameraHalDispatcherImpl final cros::mojom::CameraAutoFramingState current_auto_framing_state_ = cros::mojom::CameraAutoFramingState::OFF; + cros::mojom::CameraHalServer::GetAutoFramingSupportedCallback + auto_framing_supported_callback_; + scoped_refptr> privacy_switch_observers_; diff --git a/media/capture/video/chromeos/camera_hal_dispatcher_impl_unittest.cc b/media/capture/video/chromeos/camera_hal_dispatcher_impl_unittest.cc index 5e7eee94439ea..e5599aac98767 100644 --- a/media/capture/video/chromeos/camera_hal_dispatcher_impl_unittest.cc +++ b/media/capture/video/chromeos/camera_hal_dispatcher_impl_unittest.cc @@ -56,6 +56,8 @@ class MockCameraHalServer : public cros::mojom::CameraHalServer { callback)); MOCK_METHOD1(SetCameraSWPrivacySwitchState, void(cros::mojom::CameraPrivacySwitchState state)); + MOCK_METHOD1(GetAutoFramingSupported, + void(GetAutoFramingSupportedCallback callback)); mojo::PendingRemote GetPendingRemote() { return receiver_.BindNewPipeAndPassRemote(); diff --git a/media/capture/video/chromeos/mojom/cros_camera_service.mojom b/media/capture/video/chromeos/mojom/cros_camera_service.mojom index fc5e233d82b6d..7035a4945b9c5 100644 --- a/media/capture/video/chromeos/mojom/cros_camera_service.mojom +++ b/media/capture/video/chromeos/mojom/cros_camera_service.mojom @@ -120,7 +120,7 @@ interface CameraHalDispatcher { // The CrOS camera HAL v3 Mojo server. // -// Next method ID: 5 +// Next method ID: 6 interface CameraHalServer { // A caller calls CreateChannel to create a new Mojo channel to the camera // HAL v3 adapter. Upon successfully binding of |camera_module_receiver|, the @@ -144,6 +144,10 @@ interface CameraHalServer { // Enable or disable the camera software privacy switch. [MinVersion=8] SetCameraSWPrivacySwitchState@4(CameraPrivacySwitchState state); + + // Get if the HAL supports auto framing. + [MinVersion=9] + GetAutoFramingSupported@5() => (bool supported); }; // CameraHalServerCallbacks is an interface for CameraHalServer to notify