1// Copyright 2013 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 "ash/keyboard_uma_event_filter.h"
6
7#include "base/metrics/histogram.h"
8#include "ui/events/event.h"
9
10namespace {
11
12// This threshold is used to drop keystrokes that are more than some time apart.
13// These keystrokes are dropped to avoid recording outliers, as well as pauses
14// between actual segments of typing.
15const int kKeystrokeThresholdInSeconds = 5;
16
17}
18
19namespace ash {
20namespace internal {
21
22KeyboardUMAEventFilter::KeyboardUMAEventFilter() {}
23
24KeyboardUMAEventFilter::~KeyboardUMAEventFilter() {}
25
26void KeyboardUMAEventFilter::OnKeyEvent(ui::KeyEvent* event) {
27  // This is a rough approximation, so assume that each key release is the
28  // result of a typed key.
29  if (event->type() != ui::ET_KEY_RELEASED)
30    return;
31
32  // Reset the timer on non-character keystrokes.
33  if (!isprint(event->GetCharacter())) {
34    last_keystroke_time_ = base::TimeDelta();
35    return;
36  }
37
38  if (last_keystroke_time_.ToInternalValue() == 0) {
39    last_keystroke_time_ = event->time_stamp();
40    return;
41  }
42
43  base::TimeDelta delta = event->time_stamp() - last_keystroke_time_;
44  if (delta < base::TimeDelta::FromSeconds(kKeystrokeThresholdInSeconds))
45    UMA_HISTOGRAM_TIMES("Keyboard.KeystrokeDeltas", delta);
46
47  last_keystroke_time_ = event->time_stamp();
48}
49
50}  // namespace internal
51}  // namespace ash
52