autozoom_controller_impl.cc 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. // Copyright 2022 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/system/camera/autozoom_controller_impl.h"
  5. #include "ash/constants/ash_pref_names.h"
  6. #include "ash/session/session_controller_impl.h"
  7. #include "ash/shell.h"
  8. #include "media/capture/video/chromeos/camera_hal_dispatcher_impl.h"
  9. namespace ash {
  10. AutozoomControllerImpl::AutozoomControllerImpl()
  11. : nudge_controller_(std::make_unique<AutozoomNudgeController>(this)) {
  12. auto* camera_hal_dispatcher = media::CameraHalDispatcherImpl::GetInstance();
  13. if (camera_hal_dispatcher) {
  14. camera_hal_dispatcher->GetAutoFramingSupported(
  15. base::BindOnce(&AutozoomControllerImpl::SetAutozoomSupported,
  16. weak_ptr_factory_.GetWeakPtr()));
  17. camera_hal_dispatcher->AddActiveClientObserver(this);
  18. }
  19. Shell::Get()->session_controller()->AddObserver(this);
  20. }
  21. AutozoomControllerImpl::~AutozoomControllerImpl() {
  22. Shell::Get()->session_controller()->RemoveObserver(this);
  23. auto* camera_hal_dispatcher = media::CameraHalDispatcherImpl::GetInstance();
  24. if (camera_hal_dispatcher) {
  25. camera_hal_dispatcher->RemoveActiveClientObserver(this);
  26. }
  27. }
  28. bool AutozoomControllerImpl::IsAutozoomControlEnabled() {
  29. return autozoom_supported_ && active_camera_client_count_ > 0;
  30. }
  31. cros::mojom::CameraAutoFramingState AutozoomControllerImpl::GetState() {
  32. return state_;
  33. }
  34. void AutozoomControllerImpl::SetState(
  35. cros::mojom::CameraAutoFramingState state) {
  36. if (active_user_pref_service_) {
  37. active_user_pref_service_->SetInteger(prefs::kAutozoomState,
  38. static_cast<int32_t>(state));
  39. }
  40. }
  41. void AutozoomControllerImpl::SetAutozoomSupported(bool autozoom_supported) {
  42. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  43. bool orig_control_enabled = IsAutozoomControlEnabled();
  44. autozoom_supported_ = autozoom_supported;
  45. bool control_enabled = IsAutozoomControlEnabled();
  46. if (control_enabled != orig_control_enabled) {
  47. for (auto& observer : observers_)
  48. observer.OnAutozoomControlEnabledChanged(control_enabled);
  49. }
  50. }
  51. void AutozoomControllerImpl::Toggle() {
  52. SetState(state_ == cros::mojom::CameraAutoFramingState::OFF
  53. ? cros::mojom::CameraAutoFramingState::ON_SINGLE
  54. : cros::mojom::CameraAutoFramingState::OFF);
  55. }
  56. void AutozoomControllerImpl::AddObserver(AutozoomObserver* observer) {
  57. observers_.AddObserver(observer);
  58. }
  59. void AutozoomControllerImpl::RemoveObserver(AutozoomObserver* observer) {
  60. observers_.RemoveObserver(observer);
  61. }
  62. void AutozoomControllerImpl::OnActiveUserPrefServiceChanged(
  63. PrefService* pref_service) {
  64. if (pref_service == active_user_pref_service_)
  65. return;
  66. // Initial login and user switching in multi profiles.
  67. active_user_pref_service_ = pref_service;
  68. InitFromUserPrefs();
  69. }
  70. void AutozoomControllerImpl::OnStatePrefChanged() {
  71. Refresh();
  72. }
  73. void AutozoomControllerImpl::Refresh() {
  74. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  75. if (active_user_pref_service_) {
  76. state_ = static_cast<cros::mojom::CameraAutoFramingState>(
  77. active_user_pref_service_->GetInteger(prefs::kAutozoomState));
  78. } else {
  79. state_ = cros::mojom::CameraAutoFramingState::OFF;
  80. }
  81. auto* camera_hal_dispatcher = media::CameraHalDispatcherImpl::GetInstance();
  82. if (camera_hal_dispatcher) {
  83. camera_hal_dispatcher->SetAutoFramingState(state_);
  84. }
  85. for (auto& observer : observers_)
  86. observer.OnAutozoomStateChanged(state_);
  87. }
  88. void AutozoomControllerImpl::StartWatchingPrefsChanges() {
  89. DCHECK(active_user_pref_service_);
  90. pref_change_registrar_ = std::make_unique<PrefChangeRegistrar>();
  91. pref_change_registrar_->Init(active_user_pref_service_);
  92. pref_change_registrar_->Add(
  93. prefs::kAutozoomState,
  94. base::BindRepeating(&AutozoomControllerImpl::OnStatePrefChanged,
  95. base::Unretained(this)));
  96. }
  97. void AutozoomControllerImpl::InitFromUserPrefs() {
  98. StartWatchingPrefsChanges();
  99. Refresh();
  100. }
  101. void AutozoomControllerImpl::OnActiveClientChange(
  102. cros::mojom::CameraClientType type,
  103. bool is_active) {
  104. bool orig_control_enabled = IsAutozoomControlEnabled();
  105. if (is_active) {
  106. active_camera_client_count_++;
  107. } else {
  108. DCHECK(active_camera_client_count_ > 0);
  109. active_camera_client_count_--;
  110. }
  111. bool control_enabled = IsAutozoomControlEnabled();
  112. if (control_enabled != orig_control_enabled) {
  113. for (auto& observer : observers_)
  114. observer.OnAutozoomControlEnabledChanged(control_enabled);
  115. }
  116. }
  117. // static
  118. void AutozoomControllerImpl::RegisterProfilePrefs(
  119. PrefRegistrySimple* registry) {
  120. registry->RegisterIntegerPref(
  121. prefs::kAutozoomState,
  122. static_cast<int32_t>(cros::mojom::CameraAutoFramingState::OFF));
  123. }
  124. } // namespace ash