1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
// 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.
#ifndef CHROMEOS_ASH_COMPONENTS_HID_DETECTION_HID_DETECTION_MANAGER_H_
#define CHROMEOS_ASH_COMPONENTS_HID_DETECTION_HID_DETECTION_MANAGER_H_
#include <optional>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "chromeos/ash/components/hid_detection/bluetooth_hid_detector.h"
namespace ash::hid_detection {
// Manages detecting and automatically connecting to human interface devices.
class HidDetectionManager {
public:
// The connection state of an input.
enum class InputState {
// No device is connected.
kSearching,
// A device is connected via USB.
kConnectedViaUsb,
// A device is being paired with via Bluetooth.
kPairingViaBluetooth,
// A device is connected via Bluetooth.
kPairedViaBluetooth,
// A device is connected, but is not known to be USB (Bluetooth vs USB vs
// serial).
kConnected
};
// Info of an input on the device.
struct InputMetadata {
InputState state = InputState::kSearching;
// The name of the HID currently being interfaced with. Empty if |state| is
// kSearching (no HID is being interfaced with).
std::string detected_hid_name;
};
// Represents the status of inputs on the device.
struct HidDetectionStatus {
HidDetectionStatus(InputMetadata pointer_metadata,
InputMetadata keyboard_metadata,
bool touchscreen_detected,
std::optional<BluetoothHidPairingState> pairing_state);
HidDetectionStatus(HidDetectionStatus&& other);
HidDetectionStatus& operator=(HidDetectionStatus&& other);
~HidDetectionStatus();
// Pointer input info of the device.
InputMetadata pointer_metadata;
// Keyboard input info of the device.
InputMetadata keyboard_metadata;
// Indicates the device has a touchscreen connected.
bool touchscreen_detected = false;
// Set if the current pairing requires a code that should be displayed to
// the user to enter.
std::optional<BluetoothHidPairingState> pairing_state;
};
class Delegate {
public:
virtual ~Delegate() = default;
// Invoked whenever any HID detection status property changes.
virtual void OnHidDetectionStatusChanged(HidDetectionStatus status) = 0;
};
virtual ~HidDetectionManager();
// Invokes |callback| with a result indicating whether HID detection is
// required or not. If both a keyboard and pointer are connected, HID
// detection is not required, otherwise it is.
virtual void GetIsHidDetectionRequired(
base::OnceCallback<void(bool)> callback) = 0;
// Begins scanning for HIDs. Informs |delegate| every time
// the status of HID detection changes. This should only be called once in the
// lifetime of this class.
void StartHidDetection(Delegate* delegate);
// Stops scanning for HIDs. This should only be called while HID detection is
// active.
void StopHidDetection();
protected:
HidDetectionManager() = default;
// Implementation-specific version of StartHidDetection().
virtual void PerformStartHidDetection() = 0;
// Implementation-specific version of StopHidDetection().
virtual void PerformStopHidDetection() = 0;
// Computes the HID detection status sent to |delegate_|.
virtual HidDetectionStatus ComputeHidDetectionStatus() const = 0;
// Notifies |delegate_| of status changes; should be called by derived
// types to notify observers of status changes.
void NotifyHidDetectionStatusChanged();
raw_ptr<Delegate> delegate_ = nullptr;
};
} // namespace ash::hid_detection
#endif // CHROMEOS_ASH_COMPONENTS_HID_DETECTION_HID_DETECTION_MANAGER_H_
|