1 // Copyright 2014 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 "ui/events/gesture_detection/gesture_touch_uma_histogram.h"
7 #include "base/metrics/histogram.h"
11 GestureTouchUMAHistogram::GestureTouchUMAHistogram()
12 : max_distance_from_start_squared_(0), is_single_finger_(true) {
15 GestureTouchUMAHistogram::~GestureTouchUMAHistogram() {
18 void GestureTouchUMAHistogram::RecordGestureEvent(
19 const GestureEventData
& gesture
) {
20 UMA_HISTOGRAM_ENUMERATION(
21 "Event.GestureCreated", UMAEventTypeFromEvent(gesture
), UMA_ET_COUNT
);
24 void GestureTouchUMAHistogram::RecordTouchEvent(const MotionEvent
& event
) {
25 if (event
.GetAction() == MotionEvent::ACTION_DOWN
) {
26 start_time_
= event
.GetEventTime();
27 start_touch_position_
= gfx::Point(event
.GetX(), event
.GetY());
28 is_single_finger_
= true;
29 max_distance_from_start_squared_
= 0;
30 } else if (event
.GetAction() == MotionEvent::ACTION_MOVE
&&
32 float cur_dist
= (start_touch_position_
-
33 gfx::Point(event
.GetX(), event
.GetY())).LengthSquared();
34 if (cur_dist
> max_distance_from_start_squared_
)
35 max_distance_from_start_squared_
= cur_dist
;
37 if (event
.GetAction() == MotionEvent::ACTION_UP
&& is_single_finger_
) {
38 UMA_HISTOGRAM_CUSTOM_COUNTS(
39 "Event.TouchMaxDistance",
40 static_cast<int>(sqrt(max_distance_from_start_squared_
)),
45 base::TimeDelta duration
= event
.GetEventTime() - start_time_
;
46 UMA_HISTOGRAM_TIMES("Event.TouchDuration", duration
);
48 is_single_finger_
= false;
52 UMAEventType
GestureTouchUMAHistogram::UMAEventTypeFromEvent(
53 const GestureEventData
& gesture
) {
54 switch (gesture
.type()) {
55 case ET_TOUCH_RELEASED
:
56 return UMA_ET_TOUCH_RELEASED
;
57 case ET_TOUCH_PRESSED
:
58 return UMA_ET_TOUCH_PRESSED
;
60 return UMA_ET_TOUCH_MOVED
;
61 case ET_TOUCH_CANCELLED
:
62 return UMA_ET_TOUCH_CANCELLED
;
63 case ET_GESTURE_SCROLL_BEGIN
:
64 return UMA_ET_GESTURE_SCROLL_BEGIN
;
65 case ET_GESTURE_SCROLL_END
:
66 return UMA_ET_GESTURE_SCROLL_END
;
67 case ET_GESTURE_SCROLL_UPDATE
: {
68 int touch_points
= gesture
.details
.touch_points();
69 if (touch_points
== 1)
70 return UMA_ET_GESTURE_SCROLL_UPDATE
;
71 else if (touch_points
== 2)
72 return UMA_ET_GESTURE_SCROLL_UPDATE_2
;
73 else if (touch_points
== 3)
74 return UMA_ET_GESTURE_SCROLL_UPDATE_3
;
75 return UMA_ET_GESTURE_SCROLL_UPDATE_4P
;
77 case ET_GESTURE_TAP
: {
78 int tap_count
= gesture
.details
.tap_count();
80 return UMA_ET_GESTURE_TAP
;
82 return UMA_ET_GESTURE_DOUBLE_TAP
;
84 return UMA_ET_GESTURE_TRIPLE_TAP
;
85 NOTREACHED() << "Received tap with tapcount " << tap_count
;
86 return UMA_ET_UNKNOWN
;
88 case ET_GESTURE_TAP_DOWN
:
89 return UMA_ET_GESTURE_TAP_DOWN
;
90 case ET_GESTURE_BEGIN
:
91 return UMA_ET_GESTURE_BEGIN
;
93 return UMA_ET_GESTURE_END
;
94 case ET_GESTURE_TWO_FINGER_TAP
:
95 return UMA_ET_GESTURE_TWO_FINGER_TAP
;
96 case ET_GESTURE_PINCH_BEGIN
:
97 return UMA_ET_GESTURE_PINCH_BEGIN
;
98 case ET_GESTURE_PINCH_END
:
99 return UMA_ET_GESTURE_PINCH_END
;
100 case ET_GESTURE_PINCH_UPDATE
: {
101 int touch_points
= gesture
.details
.touch_points();
102 if (touch_points
>= 4)
103 return UMA_ET_GESTURE_PINCH_UPDATE_4P
;
104 else if (touch_points
== 3)
105 return UMA_ET_GESTURE_PINCH_UPDATE_3
;
106 return UMA_ET_GESTURE_PINCH_UPDATE
;
108 case ET_GESTURE_LONG_PRESS
:
109 return UMA_ET_GESTURE_LONG_PRESS
;
110 case ET_GESTURE_LONG_TAP
:
111 return UMA_ET_GESTURE_LONG_TAP
;
112 case ET_GESTURE_SWIPE
: {
113 int touch_points
= gesture
.details
.touch_points();
114 if (touch_points
== 1)
115 return UMA_ET_GESTURE_SWIPE_1
;
116 else if (touch_points
== 2)
117 return UMA_ET_GESTURE_SWIPE_2
;
118 else if (touch_points
== 3)
119 return UMA_ET_GESTURE_SWIPE_3
;
120 return UMA_ET_GESTURE_SWIPE_4P
;
122 case ET_GESTURE_WIN8_EDGE_SWIPE
:
123 return UMA_ET_GESTURE_WIN8_EDGE_SWIPE
;
124 case ET_GESTURE_TAP_CANCEL
:
125 return UMA_ET_GESTURE_TAP_CANCEL
;
126 case ET_GESTURE_SHOW_PRESS
:
127 return UMA_ET_GESTURE_SHOW_PRESS
;
129 return UMA_ET_SCROLL
;
130 case ET_SCROLL_FLING_START
:
131 return UMA_ET_SCROLL_FLING_START
;
132 case ET_SCROLL_FLING_CANCEL
:
133 return UMA_ET_SCROLL_FLING_CANCEL
;
134 case ET_GESTURE_TAP_UNCONFIRMED
:
135 return UMA_ET_GESTURE_TAP_UNCONFIRMED
;
136 case ET_GESTURE_DOUBLE_TAP
:
137 return UMA_ET_GESTURE_DOUBLE_TAP
;
140 return UMA_ET_UNKNOWN
;