gesture_touch_uma_histogram.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Copyright 2014 The Chromium Authors. All rights reserved.
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Use of this source code is governed by a BSD-style license that can be
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// found in the LICENSE file.
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "ui/events/gesture_detection/gesture_touch_uma_histogram.h"
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "base/metrics/histogram.h"
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace ui {
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgGestureTouchUMAHistogram::GestureTouchUMAHistogram()
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    : max_distance_from_start_squared_(0), is_single_finger_(true) {
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgGestureTouchUMAHistogram::~GestureTouchUMAHistogram() {
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid GestureTouchUMAHistogram::RecordGestureEvent(
1959b3a4ca1db1bb16568f4d184c7cd13e9c1f5786fischman@webrtc.org    const GestureEventData& gesture) {
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  UMA_HISTOGRAM_ENUMERATION(
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "Event.GestureCreated", UMAEventTypeFromEvent(gesture), UMA_ET_COUNT);
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid GestureTouchUMAHistogram::RecordTouchEvent(const MotionEvent& event) {
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (event.GetAction() == MotionEvent::ACTION_DOWN) {
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    start_time_ = event.GetEventTime();
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    start_touch_position_ = gfx::Point(event.GetX(), event.GetY());
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    is_single_finger_ = true;
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    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
52UMAEventType 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
145