| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ash/system/input_device_settings/input_device_tracker.h" |
| |
| #include <algorithm> |
| #include <memory> |
| #include <string> |
| #include <string_view> |
| |
| #include "ash/constants/ash_features.h" |
| #include "ash/session/session_controller_impl.h" |
| #include "ash/shell.h" |
| #include "ash/system/input_device_settings/input_device_key_alias_manager.h" |
| #include "ash/system/input_device_settings/input_device_settings_controller_impl.h" |
| #include "ash/system/input_device_settings/input_device_settings_pref_names.h" |
| #include "components/prefs/pref_member.h" |
| #include "components/prefs/pref_registry_simple.h" |
| #include "components/prefs/pref_service.h" |
| |
| namespace ash { |
| |
| InputDeviceTracker::InputDeviceTracker() { |
| Shell::Get()->session_controller()->AddObserver(this); |
| } |
| |
| InputDeviceTracker::~InputDeviceTracker() { |
| Shell::Get()->session_controller()->RemoveObserver(this); |
| } |
| |
| void InputDeviceTracker::RegisterProfilePrefs( |
| PrefRegistrySimple* pref_registry) { |
| pref_registry->RegisterListPref(prefs::kMouseObservedDevicesPref); |
| pref_registry->RegisterListPref(prefs::kKeyboardObservedDevicesPref); |
| pref_registry->RegisterListPref(prefs::kTouchpadObservedDevicesPref); |
| pref_registry->RegisterListPref(prefs::kPointingStickObservedDevicesPref); |
| } |
| |
| void InputDeviceTracker::ResetPrefMembers() { |
| mouse_observed_devices_ = std::make_unique<StringListPrefMember>(); |
| touchpad_observed_devices_ = std::make_unique<StringListPrefMember>(); |
| keyboard_observed_devices_ = std::make_unique<StringListPrefMember>(); |
| pointing_stick_observed_devices_ = std::make_unique<StringListPrefMember>(); |
| } |
| |
| void InputDeviceTracker::OnActiveUserPrefServiceChanged( |
| PrefService* pref_service) { |
| // When the user's `pref_service` changes, we need to re-initialize our |
| // `StringListPrefMember`s and record that we have seen all currently |
| // connected devices. |
| Init(pref_service); |
| } |
| |
| bool InputDeviceTracker::WasDevicePreviouslyConnected( |
| InputDeviceCategory category, |
| std::string_view device_key) const { |
| const auto* observed_devices = GetObservedDevicesForCategory(category); |
| return observed_devices && |
| std::ranges::contains(observed_devices->GetValue(), device_key); |
| } |
| |
| void InputDeviceTracker::Init(PrefService* pref_service) { |
| ResetPrefMembers(); |
| |
| mouse_observed_devices_->Init(prefs::kMouseObservedDevicesPref, pref_service); |
| touchpad_observed_devices_->Init(prefs::kTouchpadObservedDevicesPref, |
| pref_service); |
| keyboard_observed_devices_->Init(prefs::kKeyboardObservedDevicesPref, |
| pref_service); |
| pointing_stick_observed_devices_->Init( |
| prefs::kPointingStickObservedDevicesPref, pref_service); |
| } |
| |
| StringListPrefMember* InputDeviceTracker::GetObservedDevicesForCategory( |
| InputDeviceCategory category) const { |
| switch (category) { |
| case InputDeviceCategory::kMouse: |
| return mouse_observed_devices_.get(); |
| case InputDeviceCategory::kKeyboard: |
| return keyboard_observed_devices_.get(); |
| case InputDeviceCategory::kPointingStick: |
| return pointing_stick_observed_devices_.get(); |
| case InputDeviceCategory::kTouchpad: |
| return touchpad_observed_devices_.get(); |
| } |
| } |
| |
| } // namespace ash |