Chromium Code Reviews| Index: ui/events/gesture_detection/gesture_touch_uma_histogram.cc |
| diff --git a/ui/events/gesture_detection/gesture_touch_uma_histogram.cc b/ui/events/gesture_detection/gesture_touch_uma_histogram.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..5eadd865234fc3461d0c6535ecacf114ab732043 |
| --- /dev/null |
| +++ b/ui/events/gesture_detection/gesture_touch_uma_histogram.cc |
| @@ -0,0 +1,175 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "ui/events/gesture_detection/gesture_touch_uma_histogram.h" |
| + |
| +#include "base/logging.h" |
| +#include "base/metrics/histogram.h" |
| + |
| +namespace ui { |
| + |
| +GestureTouchUMAHistogram::GestureTouchUMAHistogram() { |
| +} |
| + |
| +GestureTouchUMAHistogram::~GestureTouchUMAHistogram() { |
| +} |
| + |
| +GestureTouchUMAHistogram::WindowTouchDetails::WindowTouchDetails() |
| + : max_distance_from_start_squared_(0), is_single_finger_(false) { |
| +} |
| + |
| +GestureTouchUMAHistogram::WindowTouchDetails::WindowTouchDetails( |
| + const base::TimeTicks& start_time, |
| + const gfx::Point& start_touch_position) |
| + : start_time_(start_time), |
| + start_touch_position_(start_touch_position), |
| + max_distance_from_start_squared_(0), |
| + is_single_finger_(true) { |
| +} |
| + |
| +GestureTouchUMAHistogram::WindowTouchDetails::~WindowTouchDetails() { |
| +} |
| + |
| +void GestureTouchUMAHistogram::RecordGestureEvent( |
| + const GestureEventData& gesture) { |
| + UMA_HISTOGRAM_ENUMERATION( |
| + "Event.GestureCreated", UMAEventTypeFromEvent(gesture), UMA_ET_COUNT); |
| +} |
| + |
| +void GestureTouchUMAHistogram::RecordTouchEvent(const MotionEvent& event) { |
| + EventType eventType = TouchEventTypeFromMotionEvent(event); |
|
tdresser
2014/08/27 12:35:39
Just use GetAction() from the MotionEvent directly
lanwei
2014/08/27 23:32:00
Done.
|
| + if (eventType == ET_TOUCH_PRESSED) { |
| + details.reset(new WindowTouchDetails( |
| + event.GetEventTime(), gfx::Point(event.GetX(), event.GetY()))); |
| + } else if (eventType == ET_TOUCH_MOVED && details->is_single_finger_) { |
| + float cur_dist = (details->start_touch_position_ - |
| + gfx::Point(event.GetX(), event.GetY())).LengthSquared(); |
| + if (cur_dist > details->max_distance_from_start_squared_) |
| + details->max_distance_from_start_squared_ = cur_dist; |
| + } else { |
| + if (eventType == ET_TOUCH_RELEASED && event.GetPointerCount() == 1 && |
| + details->is_single_finger_) { |
| + UMA_HISTOGRAM_CUSTOM_COUNTS( |
| + "Event.TouchMaxDistance", |
|
tdresser
2014/08/27 12:35:39
You'll need to modify histograms.xml to deprecate
lanwei
2014/08/27 23:31:59
Done.
|
| + static_cast<int>(sqrt(details->max_distance_from_start_squared_)), |
| + 0, |
| + 1500, |
| + 50); |
| + |
| + base::TimeDelta duration = event.GetEventTime() - details->start_time_; |
| + UMA_HISTOGRAM_TIMES("Event.TouchDuration2", duration); |
| + } |
| + details.reset(new WindowTouchDetails()); |
| + } |
| +} |
| + |
| +EventType GestureTouchUMAHistogram::TouchEventTypeFromMotionEvent( |
|
tdresser
2014/08/27 12:35:39
This is unnecessary.
lanwei
2014/08/27 23:31:59
Done.
|
| + const MotionEvent& event) { |
| + switch (event.GetAction()) { |
| + case MotionEvent::ACTION_DOWN: |
| + return ET_TOUCH_PRESSED; |
| + case MotionEvent::ACTION_UP: |
| + return ET_TOUCH_RELEASED; |
| + case MotionEvent::ACTION_MOVE: |
| + return ET_TOUCH_MOVED; |
| + case MotionEvent::ACTION_CANCEL: |
| + return ET_TOUCH_CANCELLED; |
| + default: |
| + return ET_UNKNOWN; |
| + } |
| +} |
| + |
| +UMAEventType GestureTouchUMAHistogram::UMAEventTypeFromEvent( |
| + const GestureEventData& gesture) { |
| + switch (gesture.type()) { |
| + case ET_TOUCH_RELEASED: |
| + return UMA_ET_TOUCH_RELEASED; |
| + case ET_TOUCH_PRESSED: |
| + return UMA_ET_TOUCH_PRESSED; |
| + case ET_TOUCH_MOVED: |
| + return UMA_ET_TOUCH_MOVED; |
| + case ET_TOUCH_CANCELLED: |
| + return UMA_ET_TOUCH_CANCELLED; |
| + case ET_GESTURE_SCROLL_BEGIN: |
| + return UMA_ET_GESTURE_SCROLL_BEGIN; |
| + case ET_GESTURE_SCROLL_END: |
| + return UMA_ET_GESTURE_SCROLL_END; |
| + case ET_GESTURE_SCROLL_UPDATE: { |
| + int touch_points = gesture.details.touch_points(); |
| + if (touch_points == 1) |
| + return UMA_ET_GESTURE_SCROLL_UPDATE; |
| + else if (touch_points == 2) |
| + return UMA_ET_GESTURE_SCROLL_UPDATE_2; |
| + else if (touch_points == 3) |
| + return UMA_ET_GESTURE_SCROLL_UPDATE_3; |
| + return UMA_ET_GESTURE_SCROLL_UPDATE_4P; |
| + } |
| + case ET_GESTURE_TAP: { |
| + int tap_count = gesture.details.tap_count(); |
| + if (tap_count == 1) |
| + return UMA_ET_GESTURE_TAP; |
| + if (tap_count == 2) |
| + return UMA_ET_GESTURE_DOUBLE_TAP; |
| + if (tap_count == 3) |
| + return UMA_ET_GESTURE_TRIPLE_TAP; |
| + NOTREACHED() << "Received tap with tapcount " << tap_count; |
| + return UMA_ET_UNKNOWN; |
| + } |
| + case ET_GESTURE_TAP_DOWN: |
| + return UMA_ET_GESTURE_TAP_DOWN; |
| + case ET_GESTURE_BEGIN: |
| + return UMA_ET_GESTURE_BEGIN; |
| + case ET_GESTURE_END: |
| + return UMA_ET_GESTURE_END; |
| + case ET_GESTURE_TWO_FINGER_TAP: |
| + return UMA_ET_GESTURE_TWO_FINGER_TAP; |
| + case ET_GESTURE_PINCH_BEGIN: |
| + return UMA_ET_GESTURE_PINCH_BEGIN; |
| + case ET_GESTURE_PINCH_END: |
| + return UMA_ET_GESTURE_PINCH_END; |
| + case ET_GESTURE_PINCH_UPDATE: { |
| + int touch_points = gesture.details.touch_points(); |
| + if (touch_points >= 4) |
| + return UMA_ET_GESTURE_PINCH_UPDATE_4P; |
| + else if (touch_points == 3) |
| + return UMA_ET_GESTURE_PINCH_UPDATE_3; |
| + return UMA_ET_GESTURE_PINCH_UPDATE; |
| + } |
| + case ET_GESTURE_LONG_PRESS: |
| + return UMA_ET_GESTURE_LONG_PRESS; |
| + case ET_GESTURE_LONG_TAP: |
| + return UMA_ET_GESTURE_LONG_TAP; |
| + case ET_GESTURE_SWIPE: { |
| + int touch_points = gesture.details.touch_points(); |
| + if (touch_points == 1) |
| + return UMA_ET_GESTURE_SWIPE_1; |
| + else if (touch_points == 2) |
| + return UMA_ET_GESTURE_SWIPE_2; |
| + else if (touch_points == 3) |
| + return UMA_ET_GESTURE_SWIPE_3; |
| + return UMA_ET_GESTURE_SWIPE_4P; |
| + } |
| + case ET_GESTURE_WIN8_EDGE_SWIPE: |
| + return UMA_ET_GESTURE_WIN8_EDGE_SWIPE; |
| + case ET_GESTURE_TAP_CANCEL: |
| + return UMA_ET_GESTURE_TAP_CANCEL; |
| + case ET_GESTURE_SHOW_PRESS: |
| + return UMA_ET_GESTURE_SHOW_PRESS; |
| + case ET_SCROLL: |
| + return UMA_ET_SCROLL; |
| + case ET_SCROLL_FLING_START: |
| + return UMA_ET_SCROLL_FLING_START; |
| + case ET_SCROLL_FLING_CANCEL: |
| + return UMA_ET_SCROLL_FLING_CANCEL; |
| + case ET_GESTURE_TAP_UNCONFIRMED: |
| + return UMA_ET_GESTURE_TAP_UNCONFIRMED; |
| + case ET_GESTURE_DOUBLE_TAP: |
| + return UMA_ET_GESTURE_DOUBLE_TAP; |
| + default: |
| + NOTREACHED(); |
| + return UMA_ET_UNKNOWN; |
| + } |
| +} |
| + |
| +} // namespace ui |