rgb_keyboard_manager.cc 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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/rgb_keyboard/rgb_keyboard_manager.h"
  5. #include <stdint.h>
  6. #include <vector>
  7. #include "ash/constants/ash_features.h"
  8. #include "ash/ime/ime_controller_impl.h"
  9. #include "ash/rgb_keyboard/histogram_util.h"
  10. #include "ash/rgb_keyboard/rgb_keyboard_util.h"
  11. #include "base/check.h"
  12. #include "base/check_op.h"
  13. #include "base/logging.h"
  14. #include "base/system/sys_info.h"
  15. #include "chromeos/ash/components/dbus/rgbkbd/rgbkbd_client.h"
  16. namespace ash {
  17. namespace {
  18. RgbKeyboardManager* g_instance = nullptr;
  19. } // namespace
  20. RgbKeyboardManager::RgbKeyboardManager(ImeControllerImpl* ime_controller)
  21. : ime_controller_ptr_(ime_controller) {
  22. DCHECK(ime_controller_ptr_);
  23. DCHECK(!g_instance);
  24. g_instance = this;
  25. RgbkbdClient::Get()->AddObserver(this);
  26. VLOG(1) << "Initializing RGB Keyboard support";
  27. FetchRgbKeyboardSupport();
  28. }
  29. RgbKeyboardManager::~RgbKeyboardManager() {
  30. RgbkbdClient::Get()->RemoveObserver(this);
  31. if (IsPerKeyKeyboard()) {
  32. ime_controller_ptr_->RemoveObserver(this);
  33. }
  34. DCHECK_EQ(g_instance, this);
  35. g_instance = nullptr;
  36. }
  37. void RgbKeyboardManager::FetchRgbKeyboardSupport() {
  38. DCHECK(RgbkbdClient::Get());
  39. RgbkbdClient::Get()->GetRgbKeyboardCapabilities(
  40. base::BindOnce(&RgbKeyboardManager::OnGetRgbKeyboardCapabilities,
  41. weak_ptr_factory_.GetWeakPtr()));
  42. }
  43. rgbkbd::RgbKeyboardCapabilities RgbKeyboardManager::GetRgbKeyboardCapabilities()
  44. const {
  45. return capabilities_;
  46. }
  47. void RgbKeyboardManager::SetStaticBackgroundColor(uint8_t r,
  48. uint8_t g,
  49. uint8_t b) {
  50. DCHECK(RgbkbdClient::Get());
  51. if (!IsRgbKeyboardSupported()) {
  52. LOG(ERROR) << "Attempted to set RGB keyboard color, but flag is disabled.";
  53. return;
  54. }
  55. VLOG(1) << "Setting RGB keyboard color to R:" << static_cast<int>(r)
  56. << " G:" << static_cast<int>(g) << " B:" << static_cast<int>(b);
  57. ash::rgb_keyboard::metrics::EmitRgbBacklightChangeType(
  58. ash::rgb_keyboard::metrics::RgbKeyboardBacklightChangeType::
  59. kStaticBackgroundColorChanged,
  60. capabilities_);
  61. RgbkbdClient::Get()->SetStaticBackgroundColor(r, g, b);
  62. }
  63. void RgbKeyboardManager::SetRainbowMode() {
  64. DCHECK(RgbkbdClient::Get());
  65. if (!IsRgbKeyboardSupported()) {
  66. LOG(ERROR) << "Attempted to set RGB rainbow mode, but flag is disabled.";
  67. return;
  68. }
  69. VLOG(1) << "Setting RGB keyboard to rainbow mode";
  70. ash::rgb_keyboard::metrics::EmitRgbBacklightChangeType(
  71. ash::rgb_keyboard::metrics::RgbKeyboardBacklightChangeType::
  72. kRainbowModeSelected,
  73. capabilities_);
  74. RgbkbdClient::Get()->SetRainbowMode();
  75. }
  76. void RgbKeyboardManager::SetAnimationMode(rgbkbd::RgbAnimationMode mode) {
  77. if (!features::IsExperimentalRgbKeyboardPatternsEnabled()) {
  78. LOG(ERROR) << "Attempted to set RGB animation mode, but flag is disabled.";
  79. return;
  80. }
  81. DCHECK(RgbkbdClient::Get());
  82. VLOG(1) << "Setting RGB keyboard animation mode to "
  83. << static_cast<uint32_t>(mode);
  84. RgbkbdClient::Get()->SetAnimationMode(mode);
  85. }
  86. void RgbKeyboardManager::OnCapsLockChanged(bool enabled) {
  87. VLOG(1) << "Setting RGB keyboard caps lock state to " << enabled;
  88. RgbkbdClient::Get()->SetCapsLockState(enabled);
  89. }
  90. // static
  91. RgbKeyboardManager* RgbKeyboardManager::Get() {
  92. return g_instance;
  93. }
  94. void RgbKeyboardManager::OnCapabilityUpdatedForTesting(
  95. rgbkbd::RgbKeyboardCapabilities capability) {
  96. capabilities_ = capability;
  97. }
  98. void RgbKeyboardManager::OnGetRgbKeyboardCapabilities(
  99. absl::optional<rgbkbd::RgbKeyboardCapabilities> reply) {
  100. if (!reply.has_value()) {
  101. if (base::SysInfo::IsRunningOnChromeOS()) {
  102. LOG(ERROR) << "No response received for GetRgbKeyboardCapabilities";
  103. }
  104. return;
  105. }
  106. capabilities_ = reply.value();
  107. ash::rgb_keyboard::metrics::EmitRgbKeyboardCapabilityType(capabilities_);
  108. VLOG(1) << "RGB Keyboard capabilities="
  109. << static_cast<uint32_t>(capabilities_);
  110. if (IsRgbKeyboardSupported())
  111. InitializeRgbKeyboard();
  112. }
  113. void RgbKeyboardManager::InitializeRgbKeyboard() {
  114. DCHECK(RgbkbdClient::Get());
  115. // Initialize caps lock color changing if supported
  116. if (IsPerKeyKeyboard()) {
  117. VLOG(1) << "Setting initial RGB keyboard caps lock state to "
  118. << ime_controller_ptr_->IsCapsLockEnabled();
  119. RgbkbdClient::Get()->SetCapsLockState(
  120. ime_controller_ptr_->IsCapsLockEnabled());
  121. ime_controller_ptr_->AddObserver(this);
  122. }
  123. }
  124. bool RgbKeyboardManager::IsPerKeyKeyboard() const {
  125. return capabilities_ == rgbkbd::RgbKeyboardCapabilities::kIndividualKey;
  126. }
  127. } // namespace ash