OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 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. | |
4 | |
5 #ifndef CHROME_BROWSER_SPEECH_SPEECH_RECOGNITION_BUBBLE_CONTROLLER_H_ | |
6 #define CHROME_BROWSER_SPEECH_SPEECH_RECOGNITION_BUBBLE_CONTROLLER_H_ | |
7 | |
8 #include "base/basictypes.h" | |
9 #include "base/memory/ref_counted.h" | |
10 #include "base/synchronization/lock.h" | |
11 #include "chrome/browser/speech/speech_recognition_bubble.h" | |
12 #include "ui/gfx/rect.h" | |
13 | |
14 namespace speech { | |
15 | |
16 // This class handles the speech recognition popup UI on behalf of | |
17 // SpeechRecognitionManager, which invokes methods on the IO thread, processing | |
18 // those requests on the UI thread. At most one bubble can be active. | |
19 class SpeechRecognitionBubbleController | |
20 : public base::RefCountedThreadSafe<SpeechRecognitionBubbleController>, | |
21 public SpeechRecognitionBubbleDelegate { | |
22 public: | |
23 // All methods of this delegate are called on the IO thread. | |
24 class Delegate { | |
25 public: | |
26 // Invoked when the user clicks on a button in the speech recognition UI. | |
27 virtual void InfoBubbleButtonClicked( | |
28 int session_id, SpeechRecognitionBubble::Button button) = 0; | |
29 | |
30 // Invoked when the user clicks outside the speech recognition info bubble | |
31 // causing it to close and input focus to change. | |
32 virtual void InfoBubbleFocusChanged(int session_id) = 0; | |
33 | |
34 protected: | |
35 virtual ~Delegate() {} | |
36 }; | |
37 | |
38 explicit SpeechRecognitionBubbleController(Delegate* delegate); | |
39 | |
40 // Creates and shows a new speech recognition UI bubble in warmup mode. | |
41 void CreateBubble(int session_id, | |
42 int render_process_id, | |
43 int render_view_id, | |
44 const gfx::Rect& element_rect); | |
45 | |
46 // Indicates to the user that audio recording is in progress. | |
47 void SetBubbleRecordingMode(); | |
48 | |
49 // Indicates to the user that recognition is in progress. | |
50 void SetBubbleRecognizingMode(); | |
51 | |
52 // Displays the given string with the 'Try again' and 'Cancel' buttons. | |
53 void SetBubbleMessage(const base::string16& text); | |
54 | |
55 // Checks whether the bubble is active and is showing a message. | |
56 bool IsShowingMessage() const; | |
57 | |
58 // Updates the current captured audio volume displayed on screen. | |
59 void SetBubbleInputVolume(float volume, float noise_volume); | |
60 | |
61 // Closes the bubble. | |
62 void CloseBubble(); | |
63 | |
64 // This is the only method that can be called from the UI thread. | |
65 void CloseBubbleForRenderViewOnUIThread(int render_process_id, | |
66 int render_view_id); | |
67 | |
68 // Retrieves the session ID associated to the active bubble (if any). | |
69 // Returns 0 if no bubble is currently shown. | |
70 int GetActiveSessionID(); | |
71 | |
72 // SpeechRecognitionBubble::Delegate methods. | |
73 virtual void InfoBubbleButtonClicked( | |
74 SpeechRecognitionBubble::Button button) OVERRIDE; | |
75 virtual void InfoBubbleFocusChanged() OVERRIDE; | |
76 | |
77 private: | |
78 friend class base::RefCountedThreadSafe<SpeechRecognitionBubbleController>; | |
79 | |
80 // The various calls received by this object and handled on the UI thread. | |
81 enum RequestType { | |
82 REQUEST_CREATE, | |
83 REQUEST_SET_RECORDING_MODE, | |
84 REQUEST_SET_RECOGNIZING_MODE, | |
85 REQUEST_SET_MESSAGE, | |
86 REQUEST_SET_INPUT_VOLUME, | |
87 REQUEST_CLOSE, | |
88 }; | |
89 | |
90 struct UIRequest { | |
91 RequestType type; | |
92 base::string16 message; | |
93 gfx::Rect element_rect; | |
94 float volume; | |
95 float noise_volume; | |
96 int render_process_id; | |
97 int render_view_id; | |
98 | |
99 explicit UIRequest(RequestType type_value); | |
100 ~UIRequest(); | |
101 }; | |
102 | |
103 virtual ~SpeechRecognitionBubbleController(); | |
104 | |
105 void InvokeDelegateButtonClicked(SpeechRecognitionBubble::Button button); | |
106 void InvokeDelegateFocusChanged(); | |
107 void ProcessRequestInUiThread(const UIRequest& request); | |
108 | |
109 // The following are accessed only on the IO thread. | |
110 Delegate* delegate_; | |
111 RequestType last_request_issued_; | |
112 | |
113 // The following are accessed only on the UI thread. | |
114 scoped_ptr<SpeechRecognitionBubble> bubble_; | |
115 | |
116 // The following are accessed on both IO and UI threads. | |
117 base::Lock lock_; | |
118 | |
119 // The session id for currently visible bubble. | |
120 int current_bubble_session_id_; | |
121 | |
122 // The render process and view ids for the currently visible bubble. | |
123 int current_bubble_render_process_id_; | |
124 int current_bubble_render_view_id_; | |
125 }; | |
126 | |
127 // This typedef is to workaround the issue with certain versions of | |
128 // Visual Studio where it gets confused between multiple Delegate | |
129 // classes and gives a C2500 error. (I saw this error on the try bots - | |
130 // the workaround was not needed for my machine). | |
131 typedef SpeechRecognitionBubbleController::Delegate | |
132 SpeechRecognitionBubbleControllerDelegate; | |
133 | |
134 } // namespace speech | |
135 | |
136 #endif // CHROME_BROWSER_SPEECH_SPEECH_RECOGNITION_BUBBLE_CONTROLLER_H_ | |
OLD | NEW |