// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_ASH_SYSTEM_INPUT_DEVICE_SETTINGS_H_
#define CHROME_BROWSER_ASH_SYSTEM_INPUT_DEVICE_SETTINGS_H_

#include "base/functional/callback_forward.h"
#include "third_party/abseil-cpp/absl/types/optional.h"

namespace ash {
namespace system {

class InputDeviceSettings;

// Sensitivity values; used for both cursor sensitivity and scroll sensitivity.
// Do not change/reuse numbers (used for IPC calls and metrics).
enum class PointerSensitivity {
  kLowest = 1,
  kLow = 2,
  kMedium = 3,
  kHigh = 4,
  kHighest = 5,
  kMaxValue = kHighest,
};

// Auxiliary class used to update several touchpad settings at a time. User
// should set any number of settings and pass object to UpdateTouchpadSettings
// method of InputDeviceSettings.
// Objects of this class have no default values for settings, so it is error
// to call Get* method before calling corresponding Set* method at least
// once.
class TouchpadSettings {
 public:
  TouchpadSettings();
  TouchpadSettings(const TouchpadSettings& other);
  TouchpadSettings& operator=(const TouchpadSettings& other);

  void SetSensitivity(int value);
  int GetSensitivity() const;
  bool IsSensitivitySet() const;

  void SetTapToClick(bool enabled);
  bool GetTapToClick() const;
  bool IsTapToClickSet() const;

  void SetThreeFingerClick(bool enabled);
  bool GetThreeFingerClick() const;
  bool IsThreeFingerClickSet() const;

  void SetTapDragging(bool enabled);
  bool GetTapDragging() const;
  bool IsTapDraggingSet() const;

  void SetAcceleration(bool enabled);
  bool GetAcceleration() const;
  bool IsAccelerationSet() const;

  void SetNaturalScroll(bool enabled);
  bool GetNaturalScroll() const;
  bool IsNaturalScrollSet() const;

  void SetScrollSensitivity(int value);
  int GetScrollSensitivity() const;
  bool IsScrollSensitivitySet() const;

  void SetScrollAcceleration(bool enabled);
  bool GetScrollAcceleration() const;
  bool IsScrollAccelerationSet() const;

  void SetHapticFeedback(bool enabled);
  bool GetHapticFeedback() const;
  bool IsHapticFeedbackSet() const;

  void SetHapticClickSensitivity(int value);
  int GetHapticClickSensitivity() const;
  bool IsHapticClickSensitivitySet() const;

  // Updates |this| with |settings|. If at least one setting was updated returns
  // true.
  bool Update(const TouchpadSettings& settings);

  // Apply |settings| to input devices.
  static void Apply(const TouchpadSettings& touchpad_settings,
                    InputDeviceSettings* input_device_settings);

 private:
  absl::optional<bool> acceleration_;
  absl::optional<bool> haptic_feedback_;
  absl::optional<int> haptic_click_sensitivity_;
  absl::optional<bool> natural_scroll_;
  absl::optional<int> sensitivity_;
  absl::optional<bool> scroll_acceleration_;
  absl::optional<int> scroll_sensitivity_;
  absl::optional<bool> tap_dragging_;
  absl::optional<bool> tap_to_click_;
  absl::optional<bool> three_finger_click_;
};

// Auxiliary class used to update several mouse settings at a time. User
// should set any number of settings and pass object to UpdateMouseSettings
// method of InputDeviceSettings.
// Objects of this class have no default values for settings, so it is error
// to call Get* method before calling corresponding Set* method at least
// once.
class MouseSettings {
 public:
  MouseSettings();
  MouseSettings(const MouseSettings& other);
  MouseSettings& operator=(const MouseSettings& other);

  void SetSensitivity(int value);
  int GetSensitivity() const;
  bool IsSensitivitySet() const;

  void SetPrimaryButtonRight(bool right);
  bool GetPrimaryButtonRight() const;
  bool IsPrimaryButtonRightSet() const;

  void SetAcceleration(bool enabled);
  bool GetAcceleration() const;
  bool IsAccelerationSet() const;

  void SetReverseScroll(bool enabled);
  bool GetReverseScroll() const;
  bool IsReverseScrollSet() const;

  void SetScrollSensitivity(int value);
  int GetScrollSensitivity() const;
  bool IsScrollSensitivitySet() const;

  void SetScrollAcceleration(bool enabled);
  bool GetScrollAcceleration() const;
  bool IsScrollAccelerationSet() const;

  // Updates |this| with |settings|. If at least one setting was updated returns
  // true.
  bool Update(const MouseSettings& settings);

  // Apply |settings| to input devices.
  static void Apply(const MouseSettings& mouse_settings,
                    InputDeviceSettings* input_device_settings);

 private:
  absl::optional<bool> acceleration_;
  absl::optional<bool> primary_button_right_;
  absl::optional<bool> reverse_scroll_;
  absl::optional<bool> scroll_acceleration_;
  absl::optional<int> scroll_sensitivity_;
  absl::optional<int> sensitivity_;
};

// Auxiliary class used to update several pointing stick settings at a time.
// User should set any number of settings and pass object to
// UpdatePointingStickSettings method of InputDeviceSettings.
// Objects of this class have no default values for settings, so it is error
// to call Get* method before calling corresponding Set* method at least
// once.
class PointingStickSettings {
 public:
  PointingStickSettings();
  PointingStickSettings(const PointingStickSettings& other);
  PointingStickSettings& operator=(const PointingStickSettings& other);

  void SetSensitivity(int value);
  int GetSensitivity() const;
  bool IsSensitivitySet() const;

  void SetPrimaryButtonRight(bool right);
  bool GetPrimaryButtonRight() const;
  bool IsPrimaryButtonRightSet() const;

  void SetAcceleration(bool enabled);
  bool GetAcceleration() const;
  bool IsAccelerationSet() const;

  // Updates |this| with |settings|. If at least one setting was updated returns
  // true.
  bool Update(const PointingStickSettings& settings);

  // Apply |settings| to input devices.
  static void Apply(const PointingStickSettings& pointing_stick_settings,
                    InputDeviceSettings* input_device_settings);

 private:
  absl::optional<bool> acceleration_;
  absl::optional<bool> primary_button_right_;
  absl::optional<int> sensitivity_;
};

// Interface for configuring input device settings.
class InputDeviceSettings {
 public:
  using DeviceExistsCallback = base::OnceCallback<void(bool)>;

  // Interface for faking touchpad and mouse. Accessed through
  // GetFakeInterface(), implemented only in FakeInputDeviceSettings.
  class FakeInterface {
   public:
    virtual void set_touchpad_exists(bool exists) = 0;
    virtual void set_haptic_touchpad_exists(bool exists) = 0;
    virtual void set_mouse_exists(bool exists) = 0;
    virtual void set_pointing_stick_exists(bool exists) = 0;
    virtual const TouchpadSettings& current_touchpad_settings() const = 0;
    virtual const MouseSettings& current_mouse_settings() const = 0;
    virtual const PointingStickSettings& current_pointing_stick_settings()
        const = 0;
  };

  virtual ~InputDeviceSettings() {}

  // Returns current instance of InputDeviceSettings.
  static InputDeviceSettings* Get();

  // Returns true if UI should implement enhanced keyboard support for cases
  // where other input devices like mouse are absent.
  static bool ForceKeyboardDrivenUINavigation();

  // Calls |callback|, possibly asynchronously, after determining if a touchpad
  // is connected.
  virtual void TouchpadExists(DeviceExistsCallback callback) = 0;

  // Updates several touchpad settings at a time. Updates only settings that
  // are set in |settings| object. It is more efficient to use this method to
  // update several settings then calling Set* methods one by one.
  virtual void UpdateTouchpadSettings(const TouchpadSettings& settings) = 0;

  // Sets the touchpad sensitivity in the range [kMinPointerSensitivity,
  // kMaxPointerSensitivity].
  virtual void SetTouchpadSensitivity(int value) = 0;

  // Sets the touchpad scroll sensitivity in the range [kMinPointerSensitivity,
  // kMaxPointerSensitivity].
  virtual void SetTouchpadScrollSensitivity(int value) = 0;

  // Calls |callback|, possibly asynchronously, after determining if at least
  // one touchpad that supports haptics is connected.
  virtual void HapticTouchpadExists(DeviceExistsCallback callback) = 0;

  // Turns touchpad haptic feedback on/off.
  virtual void SetTouchpadHapticFeedback(bool enabled) = 0;

  // Sets the touchpad haptic click sensitivity from Soft feedback to Firm
  // feedback [1, 3, 5].
  virtual void SetTouchpadHapticClickSensitivity(int value) = 0;

  // Turns tap to click on/off.
  virtual void SetTapToClick(bool enabled) = 0;

  // Switch for three-finger click.
  virtual void SetThreeFingerClick(bool enabled) = 0;

  // Turns tap-dragging on/off.
  virtual void SetTapDragging(bool enabled) = 0;

  // Turns natural scrolling on/off for all devices except wheel mice
  virtual void SetNaturalScroll(bool enabled) = 0;

  // Calls |callback|, possibly asynchronously, after determining if a mouse is
  // connected.
  virtual void MouseExists(DeviceExistsCallback callback) = 0;

  // Updates several mouse settings at a time. Updates only settings that
  // are set in |settings| object. It is more efficient to use this method to
  // update several settings then calling Set* methods one by one.
  virtual void UpdateMouseSettings(const MouseSettings& settings) = 0;

  // Sets the mouse sensitivity in the range [kMinPointerSensitivity,
  // kMaxPointerSensitivity].
  virtual void SetMouseSensitivity(int value) = 0;

  // Sets the mouse scroll sensitivity in the range [kMinPointerSensitivity,
  // kMaxPointerSensitivity].
  virtual void SetMouseScrollSensitivity(int value) = 0;

  // Sets the primary mouse button to the right button if |right| is true.
  virtual void SetPrimaryButtonRight(bool right) = 0;

  // Turns mouse reverse scrolling on/off.
  virtual void SetMouseReverseScroll(bool enabled) = 0;

  // Turns mouse acceleration on/off.
  virtual void SetMouseAcceleration(bool enabled) = 0;

  // Turns mouse scroll acceleration on/off.
  virtual void SetMouseScrollAcceleration(bool enabled) = 0;

  // Calls |callback|, possibly asynchronously, after determining if a pointing
  // stick is connected.
  virtual void PointingStickExists(DeviceExistsCallback callback) = 0;

  // Updates several pointing stick settings at a time. Updates only settings
  // that are set in |settings| object. It is more efficient to use this method
  // to update several settings then calling Set* methods one by one.
  virtual void UpdatePointingStickSettings(
      const PointingStickSettings& settings) = 0;

  // Sets the pointing stick sensitivity in the range [kMinPointerSensitivity,
  // kMaxPointerSensitivity].
  virtual void SetPointingStickSensitivity(int value) = 0;

  // Sets the primary button for the pointing stick to the right button if
  // |right| is true.
  virtual void SetPointingStickPrimaryButtonRight(bool right) = 0;

  // Turns pointing stick acceleration on/off.
  virtual void SetPointingStickAcceleration(bool enabled) = 0;

  // Turns touchpad acceleration on/off.
  virtual void SetTouchpadAcceleration(bool enabled) = 0;

  // Turns touchpad scroll acceleration on/off.
  virtual void SetTouchpadScrollAcceleration(bool enabled) = 0;

  // Reapplies previously set touchpad settings.
  virtual void ReapplyTouchpadSettings() = 0;

  // Reapplies previously set mouse settings.
  virtual void ReapplyMouseSettings() = 0;

  // Reapplies previously set pointing stick settings.
  virtual void ReapplyPointingStickSettings() = 0;

  // Returns an interface for faking settings, or nullptr.
  virtual FakeInterface* GetFakeInterface() = 0;

 private:
  virtual void SetInternalTouchpadEnabled(bool enabled) {}
  virtual void SetTouchscreensEnabled(bool enabled) {}
};

}  // namespace system
}  // namespace ash

#endif  // CHROME_BROWSER_ASH_SYSTEM_INPUT_DEVICE_SETTINGS_H_
