Home | History | Annotate | Download | only in gesture_detection
      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
    145