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