Home | History | Annotate | Download | only in ash
      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 
     10 namespace {
     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.
     15 const int kKeystrokeThresholdInSeconds = 5;
     16 
     17 }
     18 
     19 namespace ash {
     20 
     21 KeyboardUMAEventFilter::KeyboardUMAEventFilter() {}
     22 
     23 KeyboardUMAEventFilter::~KeyboardUMAEventFilter() {}
     24 
     25 void KeyboardUMAEventFilter::OnKeyEvent(ui::KeyEvent* event) {
     26   // This is a rough approximation, so assume that each key release is the
     27   // result of a typed key.
     28   if (event->type() != ui::ET_KEY_RELEASED)
     29     return;
     30 
     31   // Reset the timer on non-character keystrokes.
     32   if (!isprint(event->GetCharacter())) {
     33     last_keystroke_time_ = base::TimeDelta();
     34     return;
     35   }
     36 
     37   if (last_keystroke_time_.ToInternalValue() == 0) {
     38     last_keystroke_time_ = event->time_stamp();
     39     return;
     40   }
     41 
     42   base::TimeDelta delta = event->time_stamp() - last_keystroke_time_;
     43   if (delta < base::TimeDelta::FromSeconds(kKeystrokeThresholdInSeconds))
     44     UMA_HISTOGRAM_TIMES("Keyboard.KeystrokeDeltas", delta);
     45 
     46   last_keystroke_time_ = event->time_stamp();
     47 }
     48 
     49 }  // namespace ash
     50