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