| OLD | NEW |
| 1 // Copyright 2014 The ChromeOS IME Authors. All Rights Reserved. | 1 // Copyright 2014 The ChromeOS IME Authors. All Rights Reserved. |
| 2 // limitations under the License. | 2 // limitations under the License. |
| 3 // See the License for the specific language governing permissions and | 3 // See the License for the specific language governing permissions and |
| 4 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 4 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 5 // distributed under the License is distributed on an "AS-IS" BASIS, | 5 // distributed under the License is distributed on an "AS-IS" BASIS, |
| 6 // Unless required by applicable law or agreed to in writing, software | 6 // Unless required by applicable law or agreed to in writing, software |
| 7 // | 7 // |
| 8 // http://www.apache.org/licenses/LICENSE-2.0 | 8 // http://www.apache.org/licenses/LICENSE-2.0 |
| 9 // | 9 // |
| 10 // You may obtain a copy of the License at | 10 // You may obtain a copy of the License at |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 | 80 |
| 81 /** | 81 /** |
| 82 * Number of characters entered between each backspace. | 82 * Number of characters entered between each backspace. |
| 83 * | 83 * |
| 84 * @private {number} | 84 * @private {number} |
| 85 */ | 85 */ |
| 86 Statistics.prototype.charactersBetweenBackspaces_ = 0; | 86 Statistics.prototype.charactersBetweenBackspaces_ = 0; |
| 87 | 87 |
| 88 | 88 |
| 89 /** | 89 /** |
| 90 * Maximum pause duration in milliseconds. |
| 91 * |
| 92 * @private {number} |
| 93 * @const |
| 94 */ |
| 95 Statistics.prototype.MAX_PAUSE_DURATION_ = 3000; |
| 96 |
| 97 |
| 98 /** |
| 99 * Minimum words typed before committing the WPM statistic. |
| 100 * |
| 101 * @private {number} |
| 102 * @const |
| 103 */ |
| 104 Statistics.prototype.MIN_WORDS_FOR_WPM_ = 10; |
| 105 |
| 106 |
| 107 /** |
| 108 * Timestamp of last activity. |
| 109 * |
| 110 * @private {number} |
| 111 */ |
| 112 Statistics.prototype.lastActivityTimeStamp_ = 0; |
| 113 |
| 114 |
| 115 /** |
| 116 * Time spent typing. |
| 117 * |
| 118 * @private {number} |
| 119 */ |
| 120 Statistics.prototype.typingDuration_ = 0; |
| 121 |
| 122 |
| 123 /** |
| 90 * Whether recording for physical keyboard specially. | 124 * Whether recording for physical keyboard specially. |
| 91 * | 125 * |
| 92 * @private {boolean} | 126 * @private {boolean} |
| 93 */ | 127 */ |
| 94 Statistics.prototype.isPhysicalKeyboard_ = false; | 128 Statistics.prototype.isPhysicalKeyboard_ = false; |
| 95 | 129 |
| 96 | 130 |
| 97 /** | 131 /** |
| 98 * The length of the last text commit. | 132 * The length of the last text commit. |
| 99 * | 133 * |
| 100 * @private {number} | 134 * @private {number} |
| 101 */ | 135 */ |
| 102 Statistics.prototype.lastCommitLength_ = 0; | 136 Statistics.prototype.lastCommitLength_ = 0; |
| 103 | 137 |
| 104 | 138 |
| 105 /** | 139 /** |
| 106 * The number of characters typed in this session. | 140 * The number of characters typed in this session. |
| 107 * | 141 * |
| 108 * @private {number} | 142 * @private {number} |
| 109 */ | 143 */ |
| 110 Statistics.prototype.charactersCommitted_ = 0; | 144 Statistics.prototype.charactersCommitted_ = 0; |
| 111 | 145 |
| 112 | 146 |
| 113 /** | 147 /** |
| 148 * The number of characters to ignore when calculating WPM. |
| 149 * |
| 150 * @private {number} |
| 151 */ |
| 152 Statistics.prototype.droppedKeys_ = 0; |
| 153 |
| 154 |
| 155 /** |
| 114 * Sets whether recording for physical keyboard. | 156 * Sets whether recording for physical keyboard. |
| 115 * | 157 * |
| 116 * @param {boolean} isPhysicalKeyboard . | 158 * @param {boolean} isPhysicalKeyboard . |
| 117 */ | 159 */ |
| 118 Statistics.prototype.setPhysicalKeyboard = function(isPhysicalKeyboard) { | 160 Statistics.prototype.setPhysicalKeyboard = function(isPhysicalKeyboard) { |
| 119 this.isPhysicalKeyboard_ = isPhysicalKeyboard; | 161 this.isPhysicalKeyboard_ = isPhysicalKeyboard; |
| 120 }; | 162 }; |
| 121 | 163 |
| 122 | 164 |
| 123 /** | 165 /** |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 | 210 |
| 169 | 211 |
| 170 /** | 212 /** |
| 171 * Records that the controller session ended. | 213 * Records that the controller session ended. |
| 172 */ | 214 */ |
| 173 Statistics.prototype.recordSessionEnd = function() { | 215 Statistics.prototype.recordSessionEnd = function() { |
| 174 // Do not record cases where we gain and immediately lose focus. This also | 216 // Do not record cases where we gain and immediately lose focus. This also |
| 175 // excudes the focus loss-gain on the new tab page from being counted. | 217 // excudes the focus loss-gain on the new tab page from being counted. |
| 176 if (this.charactersCommitted_ > 0) { | 218 if (this.charactersCommitted_ > 0) { |
| 177 this.recordValue('InputMethod.VirtualKeyboard.CharactersCommitted', | 219 this.recordValue('InputMethod.VirtualKeyboard.CharactersCommitted', |
| 178 this.charactersCommitted_, 16384, 50); | 220 this.charactersCommitted_, 16384, 50); |
| 179 // TODO: Add WPM metrics. | 221 var words = (this.charactersCommitted_ - this.droppedKeys_) / 5; |
| 222 if (this.typingDuration_ > 0 && words > this.MIN_WORDS_FOR_WPM_) { |
| 223 // Milliseconds to minutes. |
| 224 var minutes = this.typingDuration_ / 60000; |
| 225 this.recordValue('InputMethod.VirtualKeyboard.WordsPerMinute', |
| 226 Math.round(words / minutes), 100, 100); |
| 227 } |
| 180 } | 228 } |
| 229 this.droppedKeys_ = 0; |
| 181 this.charactersCommitted_ = 0; | 230 this.charactersCommitted_ = 0; |
| 182 this.lastCommitLength_ = 0; | 231 this.lastCommitLength_ = 0; |
| 232 this.typingDuration_ = 0; |
| 233 this.lastActivityTimeStamp_ = 0; |
| 183 }; | 234 }; |
| 184 | 235 |
| 185 | 236 |
| 186 /** | 237 /** |
| 187 * Records the metrics for each commit. | 238 * Records the metrics for each commit. |
| 188 * | 239 * |
| 189 * @param {string} source . | 240 * @param {string} source . |
| 190 * @param {string} target . | 241 * @param {string} target . |
| 191 * @param {number} targetIndex The target index. | 242 * @param {number} targetIndex The target index. |
| 192 * @param {number} triggerType The trigger type: | 243 * @param {number} triggerType The trigger type: |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 'buckets': bucketCount | 407 'buckets': bucketCount |
| 357 }, count); | 408 }, count); |
| 358 } | 409 } |
| 359 }; | 410 }; |
| 360 | 411 |
| 361 | 412 |
| 362 /** | 413 /** |
| 363 * Records a key down. | 414 * Records a key down. |
| 364 */ | 415 */ |
| 365 Statistics.prototype.recordCharacterKey = function() { | 416 Statistics.prototype.recordCharacterKey = function() { |
| 417 var now = Date.now(); |
| 418 if (this.lastActivityTimeStamp_) { |
| 419 if (now < (this.lastActivityTimeStamp_ + this.MAX_PAUSE_DURATION_)) { |
| 420 this.typingDuration_ += (now - this.lastActivityTimeStamp_); |
| 421 } else { |
| 422 // Exceeded pause duration. Ignore this character. |
| 423 this.droppedKeys_++; |
| 424 } |
| 425 } else { |
| 426 // Ignore the first character in the new session. |
| 427 this.droppedKeys_++; |
| 428 } |
| 429 this.lastActivityTimeStamp_ = now; |
| 366 this.charactersBetweenBackspaces_++; | 430 this.charactersBetweenBackspaces_++; |
| 367 }; | 431 }; |
| 368 | 432 |
| 369 | 433 |
| 370 /** | 434 /** |
| 371 * Records a backspace. | 435 * Records a backspace. |
| 372 */ | 436 */ |
| 373 Statistics.prototype.recordBackspace = function() { | 437 Statistics.prototype.recordBackspace = function() { |
| 374 // Ignore multiple backspaces typed in succession. | 438 // Ignore multiple backspaces typed in succession. |
| 375 if (this.charactersBetweenBackspaces_ > 0) { | 439 if (this.charactersBetweenBackspaces_ > 0) { |
| 376 this.recordValue( | 440 this.recordValue( |
| 377 'InputMethod.VirtualKeyboard.CharactersBetweenBackspaces', | 441 'InputMethod.VirtualKeyboard.CharactersBetweenBackspaces', |
| 378 this.charactersBetweenBackspaces_, 4096, 50); | 442 this.charactersBetweenBackspaces_, 4096, 50); |
| 379 } | 443 } |
| 380 this.charactersBetweenBackspaces_ = 0; | 444 this.charactersBetweenBackspaces_ = 0; |
| 381 }; | 445 }; |
| 382 }); // goog.scope | 446 }); // goog.scope |
| OLD | NEW |