1 // Copyright 2013 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.
5 #include "chrome/browser/chromeos/device_uma.h"
7 #include <X11/extensions/XInput.h>
8 #include <X11/extensions/XInput2.h>
10 #include "base/logging.h"
11 #include "base/memory/singleton.h"
12 #include "base/metrics/histogram.h"
13 #include "ui/events/devices/x11/device_data_manager_x11.h"
14 #include "ui/events/event_constants.h"
15 #include "ui/events/event_utils.h"
16 #include "ui/events/platform/platform_event_source.h"
18 // Enum type for CrOS gesture lib UMA
19 enum UMACrosGestureMetricsType
{
20 // To give an estimated number of all interested events.
21 UMA_CROS_GESTURE_METRICS_ALL_EVENTS
,
22 UMA_CROS_GESTURE_METRICS_NOISY_GROUND
,
23 // NOTE: Add states only immediately above this line. Make sure to
24 // update the enum list in tools/metrics/histograms/histograms.xml
26 UMA_CROS_GESTURE_METRICS_COUNT
31 DeviceUMA
* DeviceUMA::GetInstance() {
32 return base::Singleton
<DeviceUMA
>::get();
35 DeviceUMA::DeviceUMA()
37 ui::PlatformEventSource::GetInstance()->AddPlatformEventObserver(this);
40 DeviceUMA::~DeviceUMA() {
44 void DeviceUMA::Stop() {
47 ui::PlatformEventSource::GetInstance()->RemovePlatformEventObserver(this);
51 void DeviceUMA::WillProcessEvent(const ui::PlatformEvent
& event
) {
52 CheckIncomingEvent(event
);
55 void DeviceUMA::DidProcessEvent(const ui::PlatformEvent
& event
) {
58 void DeviceUMA::CheckTouchpadEvent(XEvent
* native_event
) {
60 static_cast<XIDeviceEvent
*>(native_event
->xcookie
.data
);
61 // We take only the slave event since there is no need to count twice.
62 if (xiev
->deviceid
!= xiev
->sourceid
)
64 UMA_HISTOGRAM_ENUMERATION("Touchpad.Metrics",
65 UMA_CROS_GESTURE_METRICS_ALL_EVENTS
,
66 UMA_CROS_GESTURE_METRICS_COUNT
);
68 // Check for the CrOS touchpad metrics gesture
69 ui::DeviceDataManagerX11
*manager
= ui::DeviceDataManagerX11::GetInstance();
70 if (manager
->IsCMTMetricsEvent(native_event
)) {
71 ui::GestureMetricsType type
;
73 manager
->GetMetricsData(native_event
, &type
, &data1
, &data2
);
75 // We currently track only the noisy ground issue. Please see
76 // http://crbug.com/237683.
77 if (type
== ui::kGestureMetricsTypeNoisyGround
) {
78 UMA_HISTOGRAM_ENUMERATION("Touchpad.Metrics",
79 UMA_CROS_GESTURE_METRICS_NOISY_GROUND
,
80 UMA_CROS_GESTURE_METRICS_COUNT
);
85 void DeviceUMA::CheckIncomingEvent(XEvent
* event
) {
86 switch (event
->type
) {
88 ui::DeviceDataManagerX11
* devices
=
89 ui::DeviceDataManagerX11::GetInstance();
90 if (devices
->IsXIDeviceEvent(event
) &&
91 devices
->IsTouchpadXInputEvent(event
)) {
92 CheckTouchpadEvent(event
);
102 } // namespace chromeos