14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file.
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/keyboard_uma_event_filter.h"
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/metrics/histogram.h"
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/events/event.h"
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace {
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// This threshold is used to drop keystrokes that are more than some time apart.
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// These keystrokes are dropped to avoid recording outliers, as well as pauses
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// between actual segments of typing.
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kKeystrokeThresholdInSeconds = 5;
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace ash {
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace internal {
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)KeyboardUMAEventFilter::KeyboardUMAEventFilter() {}
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)KeyboardUMAEventFilter::~KeyboardUMAEventFilter() {}
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void KeyboardUMAEventFilter::OnKeyEvent(ui::KeyEvent* event) {
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // This is a rough approximation, so assume that each key release is the
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // result of a typed key.
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (event->type() != ui::ET_KEY_RELEASED)
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Reset the timer on non-character keystrokes.
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!isprint(event->GetCharacter())) {
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    last_keystroke_time_ = base::TimeDelta();
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (last_keystroke_time_.ToInternalValue() == 0) {
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    last_keystroke_time_ = event->time_stamp();
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::TimeDelta delta = event->time_stamp() - last_keystroke_time_;
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (delta < base::TimeDelta::FromSeconds(kKeystrokeThresholdInSeconds))
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    UMA_HISTOGRAM_TIMES("Keyboard.KeystrokeDeltas", delta);
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  last_keystroke_time_ = event->time_stamp();
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace internal
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace ash
52