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