11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/events/gesture_detection/gesture_touch_uma_histogram.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/metrics/histogram.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace ui {
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciGestureTouchUMAHistogram::GestureTouchUMAHistogram()
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : max_distance_from_start_squared_(0), is_single_finger_(true) {
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciGestureTouchUMAHistogram::~GestureTouchUMAHistogram() {
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GestureTouchUMAHistogram::RecordGestureEvent(
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GestureEventData& gesture) {
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UMA_HISTOGRAM_ENUMERATION(
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "Event.GestureCreated", UMAEventTypeFromEvent(gesture), UMA_ET_COUNT);
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GestureTouchUMAHistogram::RecordTouchEvent(const MotionEvent& event) {
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (event.GetAction() == MotionEvent::ACTION_DOWN) {
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    start_time_ = event.GetEventTime();
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    start_touch_position_ = gfx::Point(event.GetX(), event.GetY());
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    is_single_finger_ = true;
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    max_distance_from_start_squared_ = 0;
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else if (event.GetAction() == MotionEvent::ACTION_MOVE &&
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             is_single_finger_) {
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    float cur_dist = (start_touch_position_ -
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      gfx::Point(event.GetX(), event.GetY())).LengthSquared();
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (cur_dist > max_distance_from_start_squared_)
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      max_distance_from_start_squared_ = cur_dist;
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (event.GetAction() == MotionEvent::ACTION_UP && is_single_finger_) {
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      UMA_HISTOGRAM_CUSTOM_COUNTS(
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "Event.TouchMaxDistance",
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          static_cast<int>(sqrt(max_distance_from_start_squared_)),
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          0,
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          1500,
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          50);
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::TimeDelta duration = event.GetEventTime() - start_time_;
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      UMA_HISTOGRAM_TIMES("Event.TouchDuration", duration);
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    is_single_finger_ = false;
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciUMAEventType GestureTouchUMAHistogram::UMAEventTypeFromEvent(
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GestureEventData& gesture) {
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (gesture.type()) {
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_TOUCH_RELEASED:
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_TOUCH_RELEASED;
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_TOUCH_PRESSED:
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_TOUCH_PRESSED;
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_TOUCH_MOVED:
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_TOUCH_MOVED;
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_TOUCH_CANCELLED:
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_TOUCH_CANCELLED;
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_SCROLL_BEGIN:
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_GESTURE_SCROLL_BEGIN;
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_SCROLL_END:
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_GESTURE_SCROLL_END;
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_SCROLL_UPDATE: {
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int touch_points = gesture.details.touch_points();
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (touch_points == 1)
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return UMA_ET_GESTURE_SCROLL_UPDATE;
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else if (touch_points == 2)
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return UMA_ET_GESTURE_SCROLL_UPDATE_2;
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else if (touch_points == 3)
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return UMA_ET_GESTURE_SCROLL_UPDATE_3;
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_GESTURE_SCROLL_UPDATE_4P;
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_TAP: {
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int tap_count = gesture.details.tap_count();
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (tap_count == 1)
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return UMA_ET_GESTURE_TAP;
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (tap_count == 2)
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return UMA_ET_GESTURE_DOUBLE_TAP;
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (tap_count == 3)
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return UMA_ET_GESTURE_TRIPLE_TAP;
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NOTREACHED() << "Received tap with tapcount " << tap_count;
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_UNKNOWN;
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_TAP_DOWN:
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_GESTURE_TAP_DOWN;
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_BEGIN:
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_GESTURE_BEGIN;
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_END:
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_GESTURE_END;
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_TWO_FINGER_TAP:
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_GESTURE_TWO_FINGER_TAP;
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_PINCH_BEGIN:
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_GESTURE_PINCH_BEGIN;
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_PINCH_END:
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_GESTURE_PINCH_END;
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_PINCH_UPDATE: {
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int touch_points = gesture.details.touch_points();
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (touch_points >= 4)
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return UMA_ET_GESTURE_PINCH_UPDATE_4P;
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else if (touch_points == 3)
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return UMA_ET_GESTURE_PINCH_UPDATE_3;
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_GESTURE_PINCH_UPDATE;
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_LONG_PRESS:
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_GESTURE_LONG_PRESS;
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_LONG_TAP:
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_GESTURE_LONG_TAP;
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_SWIPE: {
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int touch_points = gesture.details.touch_points();
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (touch_points == 1)
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return UMA_ET_GESTURE_SWIPE_1;
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else if (touch_points == 2)
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return UMA_ET_GESTURE_SWIPE_2;
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else if (touch_points == 3)
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return UMA_ET_GESTURE_SWIPE_3;
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_GESTURE_SWIPE_4P;
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_WIN8_EDGE_SWIPE:
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_GESTURE_WIN8_EDGE_SWIPE;
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_TAP_CANCEL:
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_GESTURE_TAP_CANCEL;
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_SHOW_PRESS:
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_GESTURE_SHOW_PRESS;
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_SCROLL:
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_SCROLL;
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_SCROLL_FLING_START:
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_SCROLL_FLING_START;
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_SCROLL_FLING_CANCEL:
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_SCROLL_FLING_CANCEL;
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_TAP_UNCONFIRMED:
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_GESTURE_TAP_UNCONFIRMED;
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case ET_GESTURE_DOUBLE_TAP:
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_GESTURE_DOUBLE_TAP;
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NOTREACHED();
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return UMA_ET_UNKNOWN;
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  //  namespace ui
145