Scroll in Android HTML Element accessibility navigation
[chromium-blink-merge.git] / ui / app_list / speech_ui_model.cc
blob12ac66d3f03c44478177a7ca680a9093c263c57a
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.
5 #include "ui/app_list/speech_ui_model.h"
7 #include <algorithm>
9 namespace app_list {
11 namespace {
13 // The default sound level, just gotten from the developer device.
14 const int16 kDefaultSoundLevel = 200;
16 } // namespace
18 SpeechUIModel::SpeechUIModel()
19 : is_final_(false),
20 sound_level_(0),
21 state_(app_list::SPEECH_RECOGNITION_OFF),
22 minimum_sound_level_(kDefaultSoundLevel),
23 maximum_sound_level_(kDefaultSoundLevel) {
26 SpeechUIModel::~SpeechUIModel() {}
28 void SpeechUIModel::SetSpeechResult(const base::string16& result,
29 bool is_final) {
30 if (result_ == result && is_final_ == is_final)
31 return;
33 result_ = result;
34 is_final_ = is_final;
35 FOR_EACH_OBSERVER(SpeechUIModelObserver,
36 observers_,
37 OnSpeechResult(result, is_final));
40 void SpeechUIModel::UpdateSoundLevel(int16 level) {
41 if (sound_level_ == level)
42 return;
44 sound_level_ = level;
46 // Tweak the sound level limits adaptively.
47 // - min is the minimum value during the speech recognition starts but speech
48 // itself hasn't started.
49 // - max is the maximum value when the user speaks.
50 if (state_ == SPEECH_RECOGNITION_IN_SPEECH)
51 maximum_sound_level_ = std::max(level, maximum_sound_level_);
52 else
53 minimum_sound_level_ = std::min(level, minimum_sound_level_);
55 if (maximum_sound_level_ < minimum_sound_level_) {
56 maximum_sound_level_ = std::max(
57 static_cast<int16>(minimum_sound_level_ + kDefaultSoundLevel),
58 kint16max);
61 int16 range = maximum_sound_level_ - minimum_sound_level_;
62 uint8 visible_level = 0;
63 if (range > 0) {
64 int16 visible_level_in_range =
65 std::min(std::max(minimum_sound_level_, sound_level_),
66 maximum_sound_level_);
67 visible_level =
68 (visible_level_in_range - minimum_sound_level_) * kuint8max / range;
71 FOR_EACH_OBSERVER(SpeechUIModelObserver,
72 observers_,
73 OnSpeechSoundLevelChanged(visible_level));
76 void SpeechUIModel::SetSpeechRecognitionState(SpeechRecognitionState new_state,
77 bool always_show_ui) {
78 // Don't show the speech view on a change to a network error or if the state
79 // has not changed, unless |always_show_ui| is true.
80 if (!always_show_ui &&
81 (state_ == new_state || new_state == SPEECH_RECOGNITION_NETWORK_ERROR)) {
82 state_ = new_state;
83 return;
86 state_ = new_state;
88 // Revert the min/max sound level to the default.
89 if (state_ != SPEECH_RECOGNITION_RECOGNIZING &&
90 state_ != SPEECH_RECOGNITION_IN_SPEECH) {
91 minimum_sound_level_ = kDefaultSoundLevel;
92 maximum_sound_level_ = kDefaultSoundLevel;
95 FOR_EACH_OBSERVER(SpeechUIModelObserver,
96 observers_,
97 OnSpeechRecognitionStateChanged(new_state));
100 void SpeechUIModel::AddObserver(SpeechUIModelObserver* observer) {
101 observers_.AddObserver(observer);
104 void SpeechUIModel::RemoveObserver(SpeechUIModelObserver* observer) {
105 observers_.RemoveObserver(observer);
108 } // namespace app_list