From c567824cbec549cc2fed1aeb22675e8f89a66c20 Mon Sep 17 00:00:00 2001 From: Gavin Williams Date: Wed, 13 Oct 2021 03:38:36 +0000 Subject: [PATCH] Input: Create pref for touchpad haptic feedback Adds plumbing to send value to gesture library. Bug: 1257318 Change-Id: Iba9942b18002a7fddf280eaa6bd9c474f2b3ecef Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3219533 Reviewed-by: Sean O'Brien Reviewed-by: Zentaro Kavanagh Reviewed-by: James Cook Reviewed-by: Michael Spang Commit-Queue: Gavin Williams Cr-Commit-Position: refs/heads/main@{#930921} --- .../ash_window_tree_host_platform_unittest.cc | 1 + chrome/browser/ash/preferences.cc | 13 ++++++++++++ chrome/browser/ash/preferences.h | 1 + .../ash/preferences_ash_browsertest.cc | 3 +++ .../ash/system/fake_input_device_settings.cc | 6 ++++++ .../ash/system/fake_input_device_settings.h | 1 + .../ash/system/input_device_settings.cc | 19 ++++++++++++++++++ .../ash/system/input_device_settings.h | 8 ++++++++ .../input_device_settings_impl_ozone.cc | 6 ++++++ .../api/settings_private/prefs_util.cc | 2 ++ chrome/common/pref_names.cc | 3 +++ chrome/common/pref_names.h | 1 + .../histograms/metadata/others/histograms.xml | 20 +++++++++++++++++++ .../ozone/evdev/input_controller_evdev.cc | 5 +++++ .../ozone/evdev/input_controller_evdev.h | 1 + .../ozone/evdev/input_device_settings_evdev.h | 1 + ui/ozone/public/input_controller.cc | 1 + ui/ozone/public/input_controller.h | 1 + 18 files changed, 93 insertions(+) diff --git a/ash/host/ash_window_tree_host_platform_unittest.cc b/ash/host/ash_window_tree_host_platform_unittest.cc index 553d0ebd147a87..1f81b67a40be91 100644 --- a/ash/host/ash_window_tree_host_platform_unittest.cc +++ b/ash/host/ash_window_tree_host_platform_unittest.cc @@ -48,6 +48,7 @@ class TestInputController : public ui::InputController { } void SetTouchpadSensitivity(int value) override {} void SetTouchpadScrollSensitivity(int value) override {} + void SetTouchpadHapticFeedback(bool enabled) override {} void SetTapToClick(bool enabled) override {} void SetThreeFingerClick(bool enabled) override {} void SetTapDragging(bool enabled) override {} diff --git a/chrome/browser/ash/preferences.cc b/chrome/browser/ash/preferences.cc index 9c0379ae8112eb..1b717d1de6b061 100644 --- a/chrome/browser/ash/preferences.cc +++ b/chrome/browser/ash/preferences.cc @@ -214,6 +214,9 @@ void Preferences::RegisterProfilePrefs( registry->RegisterBooleanPref( ::prefs::kTouchpadScrollAcceleration, true, user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PRIORITY_PREF); + registry->RegisterBooleanPref( + ::prefs::kTouchpadHapticFeedback, true, + user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PRIORITY_PREF); registry->RegisterBooleanPref(::prefs::kLabsMediaplayerEnabled, false); registry->RegisterBooleanPref(::prefs::kLabsAdvancedFilesystemEnabled, false); registry->RegisterBooleanPref(::prefs::kAppReinstallRecommendationEnabled, @@ -518,6 +521,8 @@ void Preferences::InitUserPrefs(sync_preferences::PrefServiceSyncable* prefs) { touchpad_acceleration_.Init(::prefs::kTouchpadAcceleration, prefs, callback); touchpad_scroll_acceleration_.Init(::prefs::kTouchpadScrollAcceleration, prefs, callback); + touchpad_haptic_feedback_.Init(::prefs::kTouchpadHapticFeedback, prefs, + callback); download_default_directory_.Init(::prefs::kDownloadDefaultDirectory, prefs, callback); preload_engines_.Init(::prefs::kLanguagePreloadEngines, prefs, callback); @@ -875,6 +880,14 @@ void Preferences::ApplyPreferences(ApplyReason reason, "Touchpad.ScrollAcceleration.Started", enabled); } + if (reason != REASON_PREF_CHANGED || + pref_name == ::prefs::kTouchpadHapticFeedback) { + const bool enabled = touchpad_haptic_feedback_.GetValue(); + if (user_is_active) + touchpad_settings.SetHapticFeedback(enabled); + ReportBooleanPrefApplication(reason, "Touchpad.HapticFeedback.Changed", + "Touchpad.HapticFeedback.Started", enabled); + } if (reason != REASON_PREF_CHANGED || pref_name == ::prefs::kDownloadDefaultDirectory) { const bool default_download_to_drive = drive::util::IsUnderDriveMountPoint( diff --git a/chrome/browser/ash/preferences.h b/chrome/browser/ash/preferences.h index 23f3783624e161..43112017939239 100644 --- a/chrome/browser/ash/preferences.h +++ b/chrome/browser/ash/preferences.h @@ -151,6 +151,7 @@ class Preferences : public sync_preferences::PrefServiceSyncableObserver, BooleanPrefMember pointing_stick_acceleration_; BooleanPrefMember touchpad_acceleration_; BooleanPrefMember touchpad_scroll_acceleration_; + BooleanPrefMember touchpad_haptic_feedback_; FilePathPrefMember download_default_directory_; StringListPrefMember allowed_languages_; diff --git a/chrome/browser/ash/preferences_ash_browsertest.cc b/chrome/browser/ash/preferences_ash_browsertest.cc index 506ac85d6ceb9f..37b8c10386af83 100644 --- a/chrome/browser/ash/preferences_ash_browsertest.cc +++ b/chrome/browser/ash/preferences_ash_browsertest.cc @@ -69,6 +69,7 @@ class PreferencesTest : public LoginManagerTest { prefs->SetBoolean(::prefs::kPointingStickAcceleration, variant); prefs->SetBoolean(::prefs::kTouchpadAcceleration, variant); prefs->SetBoolean(::prefs::kTouchpadScrollAcceleration, variant); + prefs->SetBoolean(::prefs::kTouchpadHapticFeedback, variant); prefs->SetBoolean(::prefs::kEnableTouchpadThreeFingerClick, !variant); prefs->SetInteger(::prefs::kMouseSensitivity, !variant); prefs->SetInteger(::prefs::kMouseScrollSensitivity, variant ? 1 : 4); @@ -107,6 +108,8 @@ class PreferencesTest : public LoginManagerTest { EXPECT_EQ( prefs->GetBoolean(::prefs::kTouchpadScrollAcceleration), input_settings_->current_touchpad_settings().GetScrollAcceleration()); + EXPECT_EQ(prefs->GetBoolean(::prefs::kTouchpadHapticFeedback), + input_settings_->current_touchpad_settings().GetHapticFeedback()); EXPECT_EQ( prefs->GetBoolean(::prefs::kEnableTouchpadThreeFingerClick), input_settings_->current_touchpad_settings().GetThreeFingerClick()); diff --git a/chrome/browser/ash/system/fake_input_device_settings.cc b/chrome/browser/ash/system/fake_input_device_settings.cc index 0ed99ccda44e0b..bb4dcbb30c59ca 100644 --- a/chrome/browser/ash/system/fake_input_device_settings.cc +++ b/chrome/browser/ash/system/fake_input_device_settings.cc @@ -37,6 +37,12 @@ void FakeInputDeviceSettings::SetTouchpadScrollSensitivity(int value) { UpdateTouchpadSettings(settings); } +void FakeInputDeviceSettings::SetTouchpadHapticFeedback(bool enabled) { + TouchpadSettings settings; + settings.SetHapticFeedback(enabled); + UpdateTouchpadSettings(settings); +} + void FakeInputDeviceSettings::SetTapToClick(bool enabled) { TouchpadSettings settings; settings.SetTapToClick(enabled); diff --git a/chrome/browser/ash/system/fake_input_device_settings.h b/chrome/browser/ash/system/fake_input_device_settings.h index 5054281fdd92ae..d536e721f4c677 100644 --- a/chrome/browser/ash/system/fake_input_device_settings.h +++ b/chrome/browser/ash/system/fake_input_device_settings.h @@ -28,6 +28,7 @@ class FakeInputDeviceSettings : public InputDeviceSettings, void UpdateTouchpadSettings(const TouchpadSettings& settings) override; void SetTouchpadSensitivity(int value) override; void SetTouchpadScrollSensitivity(int value) override; + void SetTouchpadHapticFeedback(bool enabled) override; void SetTapToClick(bool enabled) override; void SetThreeFingerClick(bool enabled) override; void SetTapDragging(bool enabled) override; diff --git a/chrome/browser/ash/system/input_device_settings.cc b/chrome/browser/ash/system/input_device_settings.cc index d2e53294bb981d..13645fb9eff884 100644 --- a/chrome/browser/ash/system/input_device_settings.cc +++ b/chrome/browser/ash/system/input_device_settings.cc @@ -34,6 +34,7 @@ TouchpadSettings::TouchpadSettings(const TouchpadSettings& other) = default; TouchpadSettings& TouchpadSettings::operator=(const TouchpadSettings& other) { if (&other != this) { acceleration_ = other.acceleration_; + haptic_feedback_ = other.haptic_feedback_; natural_scroll_ = other.natural_scroll_; scroll_acceleration_ = other.scroll_acceleration_; scroll_sensitivity_ = other.scroll_sensitivity_; @@ -141,6 +142,18 @@ bool TouchpadSettings::IsScrollAccelerationSet() const { return scroll_acceleration_.has_value(); } +void TouchpadSettings::SetHapticFeedback(bool enabled) { + haptic_feedback_ = enabled; +} + +bool TouchpadSettings::GetHapticFeedback() const { + return *haptic_feedback_; +} + +bool TouchpadSettings::IsHapticFeedbackSet() const { + return haptic_feedback_.has_value(); +} + bool TouchpadSettings::Update(const TouchpadSettings& settings) { bool updated = false; if (UpdateIfHasValue(settings.sensitivity_, &sensitivity_)) @@ -157,6 +170,8 @@ bool TouchpadSettings::Update(const TouchpadSettings& settings) { updated = true; if (UpdateIfHasValue(settings.scroll_acceleration_, &scroll_acceleration_)) updated = true; + if (UpdateIfHasValue(settings.haptic_feedback_, &haptic_feedback_)) + updated = true; UpdateIfHasValue(settings.natural_scroll_, &natural_scroll_); // Always send natural scrolling to the shell command, as a workaround. // See crbug.com/406480 @@ -202,6 +217,10 @@ void TouchpadSettings::Apply(const TouchpadSettings& touchpad_settings, input_device_settings->SetTouchpadScrollAcceleration( touchpad_settings.scroll_acceleration_.value()); } + if (touchpad_settings.haptic_feedback_.has_value()) { + input_device_settings->SetTouchpadHapticFeedback( + touchpad_settings.haptic_feedback_.value()); + } } MouseSettings::MouseSettings() = default; diff --git a/chrome/browser/ash/system/input_device_settings.h b/chrome/browser/ash/system/input_device_settings.h index 478e9999d0053d..c5820aaa0b2e45 100644 --- a/chrome/browser/ash/system/input_device_settings.h +++ b/chrome/browser/ash/system/input_device_settings.h @@ -68,6 +68,10 @@ class TouchpadSettings { bool GetScrollAcceleration() const; bool IsScrollAccelerationSet() const; + void SetHapticFeedback(bool enabled); + bool GetHapticFeedback() const; + bool IsHapticFeedbackSet() const; + // Updates |this| with |settings|. If at least one setting was updated returns // true. bool Update(const TouchpadSettings& settings); @@ -78,6 +82,7 @@ class TouchpadSettings { private: absl::optional acceleration_; + absl::optional haptic_feedback_; absl::optional natural_scroll_; absl::optional sensitivity_; absl::optional scroll_acceleration_; @@ -222,6 +227,9 @@ class InputDeviceSettings { // kMaxPointerSensitivity]. virtual void SetTouchpadScrollSensitivity(int value) = 0; + // Turns touchpad haptic feedback on/off. + virtual void SetTouchpadHapticFeedback(bool enabled) = 0; + // Turns tap to click on/off. virtual void SetTapToClick(bool enabled) = 0; diff --git a/chrome/browser/ash/system/input_device_settings_impl_ozone.cc b/chrome/browser/ash/system/input_device_settings_impl_ozone.cc index 625a323bb993fd..22b7eeab007cc0 100644 --- a/chrome/browser/ash/system/input_device_settings_impl_ozone.cc +++ b/chrome/browser/ash/system/input_device_settings_impl_ozone.cc @@ -38,6 +38,7 @@ class InputDeviceSettingsImplOzone : public InputDeviceSettings { void UpdateTouchpadSettings(const TouchpadSettings& settings) override; void SetTouchpadSensitivity(int value) override; void SetTouchpadScrollSensitivity(int value) override; + void SetTouchpadHapticFeedback(bool enabled) override; void SetTapToClick(bool enabled) override; void SetThreeFingerClick(bool enabled) override; void SetTapDragging(bool enabled) override; @@ -103,6 +104,11 @@ void InputDeviceSettingsImplOzone::SetTouchpadScrollSensitivity(int value) { input_controller()->SetTouchpadScrollSensitivity(value); } +void InputDeviceSettingsImplOzone::SetTouchpadHapticFeedback(bool enabled) { + current_touchpad_settings_.SetHapticFeedback(enabled); + input_controller()->SetTouchpadHapticFeedback(enabled); +} + void InputDeviceSettingsImplOzone::SetNaturalScroll(bool enabled) { current_touchpad_settings_.SetNaturalScroll(enabled); input_controller()->SetNaturalScroll(enabled); diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc index adc407305376ef..a4a9cc44584fc7 100644 --- a/chrome/browser/extensions/api/settings_private/prefs_util.cc +++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc @@ -736,6 +736,8 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetAllowlistedKeys() { settings_api::PrefType::PREF_TYPE_NUMBER; (*s_allowlist)[::prefs::kTouchpadScrollSensitivity] = settings_api::PrefType::PREF_TYPE_NUMBER; + (*s_allowlist)[::prefs::kTouchpadHapticFeedback] = + settings_api::PrefType::PREF_TYPE_BOOLEAN; (*s_allowlist)[::prefs::kPrimaryMouseButtonRight] = settings_api::PrefType::PREF_TYPE_BOOLEAN; (*s_allowlist)[::prefs::kPrimaryPointingStickButtonRight] = diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index c32cf58553425c..cad48c2a8cb572 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc @@ -532,6 +532,9 @@ const char kTouchpadAcceleration[] = "settings.touchpad.acceleration"; const char kTouchpadScrollAcceleration[] = "settings.touchpad.scroll_acceleration"; +// A boolean pref set to true if touchpad haptic feedback is enabled. +const char kTouchpadHapticFeedback[] = "settings.touchpad.haptic_feedback"; + // A integer pref for the touchpad sensitivity. const char kMouseSensitivity[] = "settings.mouse.sensitivity2"; diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index c3498ce2f4a76f..e038b5ab95e842 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h @@ -224,6 +224,7 @@ extern const char kMouseScrollAcceleration[]; extern const char kPointingStickAcceleration[]; extern const char kTouchpadAcceleration[]; extern const char kTouchpadScrollAcceleration[]; +extern const char kTouchpadHapticFeedback[]; extern const char kMouseSensitivity[]; extern const char kMouseScrollSensitivity[]; extern const char kTouchpadSensitivity[]; diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index 17de5e958ba260..c4dbd1a0e03e1d 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml @@ -18011,6 +18011,26 @@ should be kept until we use this API. --> Tracks touchpad device state. + + gavinwill@chromium.org + cros-peripherals@chromium.org + + Tracks touchpad haptic feedback setting changes by the user. Only reported + on Chrome OS. + + + + + gavinwill@chromium.org + cros-peripherals@chromium.org + + Tracks touchpad haptic feedback setting on startup. Only reported on Chrome + OS. + + + zentaro@chromium.org diff --git a/ui/events/ozone/evdev/input_controller_evdev.cc b/ui/events/ozone/evdev/input_controller_evdev.cc index 70c15bf393cc27..4fdfba2692cb3a 100644 --- a/ui/events/ozone/evdev/input_controller_evdev.cc +++ b/ui/events/ozone/evdev/input_controller_evdev.cc @@ -143,6 +143,11 @@ void InputControllerEvdev::SetTouchpadScrollSensitivity(int value) { ScheduleUpdateDeviceSettings(); } +void InputControllerEvdev::SetTouchpadHapticFeedback(bool enabled) { + input_device_settings_.touchpad_haptic_feedback_enabled = enabled; + ScheduleUpdateDeviceSettings(); +} + void InputControllerEvdev::SetTapToClick(bool enabled) { input_device_settings_.tap_to_click_enabled = enabled; ScheduleUpdateDeviceSettings(); diff --git a/ui/events/ozone/evdev/input_controller_evdev.h b/ui/events/ozone/evdev/input_controller_evdev.h index 20664ada914a25..7e36493ea7a72b 100644 --- a/ui/events/ozone/evdev/input_controller_evdev.h +++ b/ui/events/ozone/evdev/input_controller_evdev.h @@ -62,6 +62,7 @@ class COMPONENT_EXPORT(EVDEV) InputControllerEvdev : public InputController { void SetTouchEventLoggingEnabled(bool enabled) override; void SetTouchpadSensitivity(int value) override; void SetTouchpadScrollSensitivity(int value) override; + void SetTouchpadHapticFeedback(bool enabled) override; void SetTapToClick(bool enabled) override; void SetThreeFingerClick(bool enabled) override; void SetTapDragging(bool enabled) override; diff --git a/ui/events/ozone/evdev/input_device_settings_evdev.h b/ui/events/ozone/evdev/input_device_settings_evdev.h index da64293342af8a..b838dd021ac052 100644 --- a/ui/events/ozone/evdev/input_device_settings_evdev.h +++ b/ui/events/ozone/evdev/input_device_settings_evdev.h @@ -32,6 +32,7 @@ struct InputDeviceSettingsEvdev { bool pointing_stick_acceleration_enabled = true; bool touchpad_acceleration_enabled = true; bool touchpad_scroll_acceleration_enabled = true; + bool touchpad_haptic_feedback_enabled = true; int touchpad_sensitivity = kDefaultSensitivity; int touchpad_scroll_sensitivity = kDefaultSensitivity; diff --git a/ui/ozone/public/input_controller.cc b/ui/ozone/public/input_controller.cc index f2f9fd37d04752..38a15fe1963fec 100644 --- a/ui/ozone/public/input_controller.cc +++ b/ui/ozone/public/input_controller.cc @@ -60,6 +60,7 @@ class StubInputController : public InputController { void SetPointingStickAcceleration(bool enabled) override {} void SetTouchpadAcceleration(bool enabled) override {} void SetTouchpadScrollAcceleration(bool enabled) override {} + void SetTouchpadHapticFeedback(bool enabled) override {} void SetTapToClickPaused(bool state) override {} void GetTouchDeviceStatus(GetTouchDeviceStatusReply reply) override { std::move(reply).Run(std::string()); diff --git a/ui/ozone/public/input_controller.h b/ui/ozone/public/input_controller.h index df8b5e10c4e335..8af4e8cd48c803 100644 --- a/ui/ozone/public/input_controller.h +++ b/ui/ozone/public/input_controller.h @@ -76,6 +76,7 @@ class COMPONENT_EXPORT(OZONE_BASE) InputController { virtual void SetNaturalScroll(bool enabled) = 0; virtual void SetTouchpadAcceleration(bool enabled) = 0; virtual void SetTouchpadScrollAcceleration(bool enabled) = 0; + virtual void SetTouchpadHapticFeedback(bool enabled) = 0; // Mouse settings. virtual void SetMouseSensitivity(int value) = 0;