Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / ui / events / gesture_detection / gesture_touch_uma_histogram.cc
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.
4
5 #include "ui/events/gesture_detection/gesture_touch_uma_histogram.h"
6
7 #include "base/metrics/histogram.h"
8
9 namespace ui {
10
11 GestureTouchUMAHistogram::GestureTouchUMAHistogram()
12     : max_distance_from_start_squared_(0), is_single_finger_(true) {
13 }
14
15 GestureTouchUMAHistogram::~GestureTouchUMAHistogram() {
16 }
17
18 void GestureTouchUMAHistogram::RecordGestureEvent(
19     const GestureEventData& gesture) {
20   UMA_HISTOGRAM_ENUMERATION(
21       "Event.GestureCreated", UMAEventTypeFromEvent(gesture), UMA_ET_COUNT);
22 }
23
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 &&
31              is_single_finger_) {
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;
36   } else {
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_)),
41           0,
42           1500,
43           50);
44
45       base::TimeDelta duration = event.GetEventTime() - start_time_;
46       UMA_HISTOGRAM_TIMES("Event.TouchDuration", duration);
47     }
48     is_single_finger_ = false;
49   }
50 }
51
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;
59     case ET_TOUCH_MOVED:
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;
76     }
77     case ET_GESTURE_TAP: {
78       int tap_count = gesture.details.tap_count();
79       if (tap_count == 1)
80         return UMA_ET_GESTURE_TAP;
81       if (tap_count == 2)
82         return UMA_ET_GESTURE_DOUBLE_TAP;
83       if (tap_count == 3)
84         return UMA_ET_GESTURE_TRIPLE_TAP;
85       NOTREACHED() << "Received tap with tapcount " << tap_count;
86       return UMA_ET_UNKNOWN;
87     }
88     case ET_GESTURE_TAP_DOWN:
89       return UMA_ET_GESTURE_TAP_DOWN;
90     case ET_GESTURE_BEGIN:
91       return UMA_ET_GESTURE_BEGIN;
92     case ET_GESTURE_END:
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;
107     }
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;
121     }
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;
128     case ET_SCROLL:
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;
138     default:
139       NOTREACHED();
140       return UMA_ET_UNKNOWN;
141   }
142 }
143
144 }  //  namespace ui