189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Copyright 2013 The Chromium Authors. All rights reserved.
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be
368335fdd6e9c1d622384612605d6952503cb7fd0Jean-Baptiste Queru// found in the LICENSE file.
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "ash/keyboard_uma_event_filter.h"
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "base/metrics/histogram.h"
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "ui/events/event.h"
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace {
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// This threshold is used to drop keystrokes that are more than some time apart.
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// These keystrokes are dropped to avoid recording outliers, as well as pauses
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// between actual segments of typing.
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectconst int kKeystrokeThresholdInSeconds = 5;
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace ash {
2034fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn
2134fb29696b0f3abf61b10f8d053b1f33d501de0aMark SalyzynKeyboardUMAEventFilter::KeyboardUMAEventFilter() {}
2234fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn
2334fb29696b0f3abf61b10f8d053b1f33d501de0aMark SalyzynKeyboardUMAEventFilter::~KeyboardUMAEventFilter() {}
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
257562408b2261d38415453378b6188f74fda99d88Mathias Agopianvoid KeyboardUMAEventFilter::OnKeyEvent(ui::KeyEvent* event) {
263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian  // This is a rough approximation, so assume that each key release is the
2737047fceba836f341d0108beed0991b0f8dfc543James Dong  // result of a typed key.
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project  if (event->type() != ui::ET_KEY_RELEASED)
29df712ea86e6350f7005a02ab0e1c60c28a343ed0Mathias Agopian    return;
308ba01021b573889802e67e029225a96f0dfa471aAndy McFadden
31b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi  // Reset the timer on non-character keystrokes.
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project  if (!isprint(event->GetCharacter())) {
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    last_keystroke_time_ = base::TimeDelta();
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return;
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project  }
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project  if (last_keystroke_time_.ToInternalValue() == 0) {
38b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    last_keystroke_time_ = event->time_stamp();
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return;
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project  }
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project  base::TimeDelta delta = event->time_stamp() - last_keystroke_time_;
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project  if (delta < base::TimeDelta::FromSeconds(kKeystrokeThresholdInSeconds))
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    UMA_HISTOGRAM_TIMES("Keyboard.KeystrokeDeltas", delta);
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project  last_keystroke_time_ = event->time_stamp();
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}  // namespace ash
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project