OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/input_method/input_method_manager_impl.h" | 5 #include "chrome/browser/chromeos/input_method/input_method_manager_impl.h" |
6 | 6 |
7 #include <algorithm> // std::find | 7 #include <algorithm> // std::find |
8 | 8 |
9 #include <sstream> | |
10 | |
9 #include "ash/ime/input_method_menu_item.h" | 11 #include "ash/ime/input_method_menu_item.h" |
10 #include "ash/ime/input_method_menu_manager.h" | 12 #include "ash/ime/input_method_menu_manager.h" |
11 #include "base/basictypes.h" | 13 #include "base/basictypes.h" |
12 #include "base/bind.h" | 14 #include "base/bind.h" |
13 #include "base/location.h" | 15 #include "base/location.h" |
14 #include "base/memory/scoped_ptr.h" | 16 #include "base/memory/scoped_ptr.h" |
15 #include "base/prefs/pref_service.h" | 17 #include "base/prefs/pref_service.h" |
16 #include "base/strings/string_split.h" | 18 #include "base/strings/string_split.h" |
17 #include "base/strings/string_util.h" | 19 #include "base/strings/string_util.h" |
18 #include "base/strings/stringprintf.h" | 20 #include "base/strings/stringprintf.h" |
19 #include "base/sys_info.h" | 21 #include "base/sys_info.h" |
20 #include "chrome/browser/browser_process.h" | 22 #include "chrome/browser/browser_process.h" |
21 #include "chrome/browser/chromeos/input_method/candidate_window_controller.h" | 23 #include "chrome/browser/chromeos/input_method/candidate_window_controller.h" |
22 #include "chrome/browser/chromeos/input_method/component_extension_ime_manager_i mpl.h" | 24 #include "chrome/browser/chromeos/input_method/component_extension_ime_manager_i mpl.h" |
23 #include "chrome/browser/chromeos/input_method/input_method_engine.h" | 25 #include "chrome/browser/chromeos/input_method/input_method_engine.h" |
24 #include "chrome/browser/chromeos/language_preferences.h" | 26 #include "chrome/browser/chromeos/language_preferences.h" |
27 #include "chrome/browser/chromeos/login/session/user_session_manager.h" | |
25 #include "chrome/browser/chromeos/login/users/user_manager.h" | 28 #include "chrome/browser/chromeos/login/users/user_manager.h" |
29 #include "chrome/browser/chromeos/profiles/profile_helper.h" | |
26 #include "chrome/browser/profiles/profile_manager.h" | 30 #include "chrome/browser/profiles/profile_manager.h" |
27 #include "chrome/common/pref_names.h" | 31 #include "chrome/common/pref_names.h" |
28 #include "chromeos/ime/component_extension_ime_manager.h" | 32 #include "chromeos/ime/component_extension_ime_manager.h" |
29 #include "chromeos/ime/extension_ime_util.h" | 33 #include "chromeos/ime/extension_ime_util.h" |
30 #include "chromeos/ime/fake_ime_keyboard.h" | 34 #include "chromeos/ime/fake_ime_keyboard.h" |
31 #include "chromeos/ime/ime_keyboard.h" | 35 #include "chromeos/ime/ime_keyboard.h" |
32 #include "chromeos/ime/input_method_delegate.h" | 36 #include "chromeos/ime/input_method_delegate.h" |
33 #include "third_party/icu/source/common/unicode/uloc.h" | 37 #include "third_party/icu/source/common/unicode/uloc.h" |
34 #include "ui/base/accelerators/accelerator.h" | 38 #include "ui/base/accelerators/accelerator.h" |
35 | 39 |
(...skipping 13 matching lines...) Expand all Loading... | |
49 bool InputMethodManagerImpl::IsLoginKeyboard( | 53 bool InputMethodManagerImpl::IsLoginKeyboard( |
50 const std::string& layout) const { | 54 const std::string& layout) const { |
51 return util_.IsLoginKeyboard(layout); | 55 return util_.IsLoginKeyboard(layout); |
52 } | 56 } |
53 | 57 |
54 bool InputMethodManagerImpl::MigrateInputMethods( | 58 bool InputMethodManagerImpl::MigrateInputMethods( |
55 std::vector<std::string>* input_method_ids) { | 59 std::vector<std::string>* input_method_ids) { |
56 return util_.MigrateInputMethods(input_method_ids); | 60 return util_.MigrateInputMethods(input_method_ids); |
57 } | 61 } |
58 | 62 |
63 InputMethodManagerImpl::StateImpl::StateImpl(InputMethodManagerImpl* manager, | |
64 Profile* profile) | |
65 : profile(profile), manager_(manager) { | |
66 } | |
67 | |
68 InputMethodManagerImpl::StateImpl::~StateImpl() { | |
69 } | |
70 | |
71 void InputMethodManagerImpl::StateImpl::InitFrom(const StateImpl& other) { | |
72 previous_input_method = other.previous_input_method; | |
73 current_input_method = other.current_input_method; | |
74 | |
75 active_input_method_ids = other.active_input_method_ids; | |
76 | |
77 pending_input_method_id = other.pending_input_method_id; | |
78 | |
79 enabled_extension_imes = other.enabled_extension_imes; | |
80 extra_input_methods = other.extra_input_methods; | |
81 } | |
82 | |
83 bool InputMethodManagerImpl::StateImpl::IsActive() const { | |
84 return manager_->state_.get() == this; | |
85 } | |
86 | |
87 std::string InputMethodManagerImpl::StateImpl::Dump() const { | |
88 std::ostringstream os; | |
89 | |
90 os << "################# " | |
91 << (profile ? profile->GetProfileName() : std::string("NULL")) | |
92 << " #################\n"; | |
93 | |
94 os << "previous_input_method: '" | |
95 << previous_input_method.GetPreferredKeyboardLayout() << "'\n"; | |
96 os << "current_input_method: '" | |
97 << current_input_method.GetPreferredKeyboardLayout() << "'\n"; | |
98 os << "active_input_method_ids (size=" << active_input_method_ids.size() | |
99 << "):"; | |
100 for (size_t i = 0; i < active_input_method_ids.size(); ++i) { | |
101 os << " '" << active_input_method_ids[i] << "',"; | |
102 } | |
103 os << "\n"; | |
104 os << "enabled_extension_imes (size=" << enabled_extension_imes.size() | |
105 << "):"; | |
106 for (size_t i = 0; i < enabled_extension_imes.size(); ++i) { | |
107 os << " '" << enabled_extension_imes[i] << "'\n"; | |
108 } | |
109 os << "\n"; | |
110 os << "extra_input_methods (size=" << extra_input_methods.size() << "):"; | |
111 for (std::map<std::string, InputMethodDescriptor>::const_iterator it = | |
112 extra_input_methods.begin(); | |
113 it != extra_input_methods.end(); | |
114 ++it) { | |
115 os << " '" << it->first << "' => '" << it->second.id() << "',\n"; | |
116 } | |
117 os << "pending_input_method_id: '" << pending_input_method_id << "'\n"; | |
118 | |
119 return os.str(); | |
120 } | |
121 | |
122 scoped_refptr<InputMethodManager::State> | |
123 InputMethodManagerImpl::StateImpl::Clone() const { | |
124 scoped_refptr<StateImpl> new_state(new StateImpl(this->manager_, profile)); | |
125 new_state->InitFrom(*this); | |
126 return scoped_refptr<InputMethodManager::State>(new_state.get()); | |
127 } | |
128 | |
129 void InputMethodManagerImpl::SetState( | |
130 scoped_refptr<InputMethodManager::State> state) { | |
131 DCHECK(state); | |
132 InputMethodManagerImpl::StateImpl* new_impl_state = | |
133 static_cast<InputMethodManagerImpl::StateImpl*>(state.get()); | |
134 const bool need_update_current_input_method = | |
135 (state_ ? state_->current_input_method.id() != | |
136 new_impl_state->current_input_method.id() | |
137 : true); | |
138 state_ = new_impl_state; | |
139 | |
140 if (state_ && state_->active_input_method_ids.size()) { | |
141 // Initialize candidate window controller and widgets such as | |
142 // candidate window, infolist and mode indicator. Note, mode | |
143 // indicator is used by only keyboard layout input methods. | |
144 MaybeInitializeCandidateWindowController(); | |
145 | |
146 if (need_update_current_input_method) | |
147 ChangeInputMethodInternal(state_->current_input_method, | |
148 false /* show_message */, | |
149 true /* notify_menu */); | |
150 } | |
151 } | |
152 | |
153 scoped_refptr<InputMethodManager::State> | |
154 InputMethodManagerImpl::GetActiveIMEState() { | |
155 return scoped_refptr<InputMethodManager::State>(state_.get()); | |
156 } | |
Shu Chen
2014/08/14 15:26:57
nit: can you please sort the code for StateImpl to
Alexander Alekseev
2014/08/15 19:46:08
Done.
| |
157 | |
59 InputMethodManagerImpl::InputMethodManagerImpl( | 158 InputMethodManagerImpl::InputMethodManagerImpl( |
60 scoped_ptr<InputMethodDelegate> delegate) | 159 scoped_ptr<InputMethodDelegate> delegate) |
61 : delegate_(delegate.Pass()), | 160 : delegate_(delegate.Pass()), |
62 state_(STATE_LOGIN_SCREEN), | 161 ui_session_(STATE_LOGIN_SCREEN), |
162 state_(NULL), | |
63 util_(delegate_.get()), | 163 util_(delegate_.get()), |
64 component_extension_ime_manager_(new ComponentExtensionIMEManager()) { | 164 component_extension_ime_manager_(new ComponentExtensionIMEManager()) { |
65 if (base::SysInfo::IsRunningOnChromeOS()) | 165 if (base::SysInfo::IsRunningOnChromeOS()) |
66 keyboard_.reset(ImeKeyboard::Create()); | 166 keyboard_.reset(ImeKeyboard::Create()); |
67 else | 167 else |
68 keyboard_.reset(new FakeImeKeyboard()); | 168 keyboard_.reset(new FakeImeKeyboard()); |
69 | 169 |
70 // Initializes the system IME list. | 170 // Initializes the system IME list. |
71 scoped_ptr<ComponentExtensionIMEManagerDelegate> comp_delegate( | 171 scoped_ptr<ComponentExtensionIMEManagerDelegate> comp_delegate( |
72 new ComponentExtensionIMEManagerImpl()); | 172 new ComponentExtensionIMEManagerImpl()); |
(...skipping 20 matching lines...) Expand all Loading... | |
93 void InputMethodManagerImpl::RemoveObserver( | 193 void InputMethodManagerImpl::RemoveObserver( |
94 InputMethodManager::Observer* observer) { | 194 InputMethodManager::Observer* observer) { |
95 observers_.RemoveObserver(observer); | 195 observers_.RemoveObserver(observer); |
96 } | 196 } |
97 | 197 |
98 void InputMethodManagerImpl::RemoveCandidateWindowObserver( | 198 void InputMethodManagerImpl::RemoveCandidateWindowObserver( |
99 InputMethodManager::CandidateWindowObserver* observer) { | 199 InputMethodManager::CandidateWindowObserver* observer) { |
100 candidate_window_observers_.RemoveObserver(observer); | 200 candidate_window_observers_.RemoveObserver(observer); |
101 } | 201 } |
102 | 202 |
103 InputMethodManager::State InputMethodManagerImpl::GetState() { | 203 InputMethodManager::UISessionState InputMethodManagerImpl::GetUISessionState() { |
104 return state_; | 204 return ui_session_; |
105 } | 205 } |
106 | 206 |
107 void InputMethodManagerImpl::SetState(State new_state) { | 207 void InputMethodManagerImpl::SetUISessionState(UISessionState new_ui_session) { |
108 const State old_state = state_; | 208 ui_session_ = new_ui_session; |
109 state_ = new_state; | 209 switch (ui_session_) { |
110 switch (state_) { | |
111 case STATE_LOGIN_SCREEN: | 210 case STATE_LOGIN_SCREEN: |
112 break; | 211 break; |
113 case STATE_BROWSER_SCREEN: | 212 case STATE_BROWSER_SCREEN: |
114 if (old_state == STATE_LOCK_SCREEN) | |
115 OnScreenUnlocked(); | |
116 break; | 213 break; |
117 case STATE_LOCK_SCREEN: | 214 case STATE_LOCK_SCREEN: |
118 OnScreenLocked(); | |
119 break; | 215 break; |
120 case STATE_TERMINATING: { | 216 case STATE_TERMINATING: { |
121 if (candidate_window_controller_.get()) | 217 if (candidate_window_controller_.get()) |
122 candidate_window_controller_.reset(); | 218 candidate_window_controller_.reset(); |
123 break; | 219 break; |
124 } | 220 } |
125 } | 221 } |
126 } | 222 } |
127 | 223 |
128 scoped_ptr<InputMethodDescriptors> | 224 scoped_ptr<InputMethodDescriptors> |
129 InputMethodManagerImpl::GetSupportedInputMethods() const { | 225 InputMethodManagerImpl::GetSupportedInputMethods() const { |
130 return scoped_ptr<InputMethodDescriptors>(new InputMethodDescriptors).Pass(); | 226 return scoped_ptr<InputMethodDescriptors>(new InputMethodDescriptors).Pass(); |
131 } | 227 } |
132 | 228 |
133 scoped_ptr<InputMethodDescriptors> | 229 scoped_ptr<InputMethodDescriptors> |
134 InputMethodManagerImpl::GetActiveInputMethods() const { | 230 InputMethodManagerImpl::StateImpl::GetActiveInputMethods() const { |
135 scoped_ptr<InputMethodDescriptors> result(new InputMethodDescriptors); | 231 scoped_ptr<InputMethodDescriptors> result(new InputMethodDescriptors); |
136 // Build the active input method descriptors from the active input | 232 // Build the active input method descriptors from the active input |
137 // methods cache |active_input_method_ids_|. | 233 // methods cache |active_input_method_ids|. |
138 for (size_t i = 0; i < active_input_method_ids_.size(); ++i) { | 234 for (size_t i = 0; i < active_input_method_ids.size(); ++i) { |
139 const std::string& input_method_id = active_input_method_ids_[i]; | 235 const std::string& input_method_id = active_input_method_ids[i]; |
140 const InputMethodDescriptor* descriptor = | 236 const InputMethodDescriptor* descriptor = |
141 util_.GetInputMethodDescriptorFromId(input_method_id); | 237 manager_->util_.GetInputMethodDescriptorFromId(input_method_id); |
142 if (descriptor) { | 238 if (descriptor) { |
143 result->push_back(*descriptor); | 239 result->push_back(*descriptor); |
144 } else { | 240 } else { |
145 std::map<std::string, InputMethodDescriptor>::const_iterator ix = | 241 std::map<std::string, InputMethodDescriptor>::const_iterator ix = |
146 extra_input_methods_.find(input_method_id); | 242 extra_input_methods.find(input_method_id); |
147 if (ix != extra_input_methods_.end()) | 243 if (ix != extra_input_methods.end()) |
148 result->push_back(ix->second); | 244 result->push_back(ix->second); |
149 else | 245 else |
150 DVLOG(1) << "Descriptor is not found for: " << input_method_id; | 246 DVLOG(1) << "Descriptor is not found for: " << input_method_id; |
151 } | 247 } |
152 } | 248 } |
153 if (result->empty()) { | 249 if (result->empty()) { |
154 // Initially |active_input_method_ids_| is empty. browser_tests might take | 250 // Initially |active_input_method_ids| is empty. browser_tests might take |
155 // this path. | 251 // this path. |
156 result->push_back( | 252 result->push_back( |
157 InputMethodUtil::GetFallbackInputMethodDescriptor()); | 253 InputMethodUtil::GetFallbackInputMethodDescriptor()); |
158 } | 254 } |
159 return result.Pass(); | 255 return result.Pass(); |
160 } | 256 } |
161 | 257 |
162 const std::vector<std::string>& | 258 const std::vector<std::string>& |
163 InputMethodManagerImpl::GetActiveInputMethodIds() const { | 259 InputMethodManagerImpl::StateImpl::GetActiveInputMethodIds() const { |
164 return active_input_method_ids_; | 260 return active_input_method_ids; |
165 } | 261 } |
166 | 262 |
167 size_t InputMethodManagerImpl::GetNumActiveInputMethods() const { | 263 size_t InputMethodManagerImpl::StateImpl::GetNumActiveInputMethods() const { |
168 return active_input_method_ids_.size(); | 264 return active_input_method_ids.size(); |
169 } | 265 } |
170 | 266 |
171 const InputMethodDescriptor* InputMethodManagerImpl::GetInputMethodFromId( | 267 const InputMethodDescriptor* |
268 InputMethodManagerImpl::StateImpl::GetInputMethodFromId( | |
172 const std::string& input_method_id) const { | 269 const std::string& input_method_id) const { |
173 const InputMethodDescriptor* ime = util_.GetInputMethodDescriptorFromId( | 270 const InputMethodDescriptor* ime = |
174 input_method_id); | 271 manager_->util_.GetInputMethodDescriptorFromId(input_method_id); |
175 if (!ime) { | 272 if (!ime) { |
176 std::map<std::string, InputMethodDescriptor>::const_iterator ix = | 273 std::map<std::string, InputMethodDescriptor>::const_iterator ix = |
177 extra_input_methods_.find(input_method_id); | 274 extra_input_methods.find(input_method_id); |
178 if (ix != extra_input_methods_.end()) | 275 if (ix != extra_input_methods.end()) |
179 ime = &ix->second; | 276 ime = &ix->second; |
180 } | 277 } |
181 return ime; | 278 return ime; |
182 } | 279 } |
183 | 280 |
184 void InputMethodManagerImpl::EnableLoginLayouts( | 281 void InputMethodManagerImpl::StateImpl::EnableLoginLayouts( |
185 const std::string& language_code, | 282 const std::string& language_code, |
186 const std::vector<std::string>& initial_layouts) { | 283 const std::vector<std::string>& initial_layouts) { |
187 if (state_ == STATE_TERMINATING) | 284 if (manager_->ui_session_ == STATE_TERMINATING) |
188 return; | 285 return; |
189 | 286 |
190 // First, hardware keyboard layout should be shown. | 287 // First, hardware keyboard layout should be shown. |
191 std::vector<std::string> candidates = | 288 std::vector<std::string> candidates = |
192 util_.GetHardwareLoginInputMethodIds(); | 289 manager_->util_.GetHardwareLoginInputMethodIds(); |
193 | 290 |
194 // Seocnd, locale based input method should be shown. | 291 // Second, locale based input method should be shown. |
195 // Add input methods associated with the language. | 292 // Add input methods associated with the language. |
196 std::vector<std::string> layouts_from_locale; | 293 std::vector<std::string> layouts_from_locale; |
197 util_.GetInputMethodIdsFromLanguageCode(language_code, | 294 manager_->util_.GetInputMethodIdsFromLanguageCode( |
198 kKeyboardLayoutsOnly, | 295 language_code, kKeyboardLayoutsOnly, &layouts_from_locale); |
199 &layouts_from_locale); | |
200 candidates.insert(candidates.end(), layouts_from_locale.begin(), | 296 candidates.insert(candidates.end(), layouts_from_locale.begin(), |
201 layouts_from_locale.end()); | 297 layouts_from_locale.end()); |
202 | 298 |
203 std::vector<std::string> layouts; | 299 std::vector<std::string> layouts; |
204 // First, add the initial input method ID, if it's requested, to | 300 // First, add the initial input method ID, if it's requested, to |
205 // layouts, so it appears first on the list of active input | 301 // layouts, so it appears first on the list of active input |
206 // methods at the input language status menu. | 302 // methods at the input language status menu. |
207 for (size_t i = 0; i < initial_layouts.size(); ++i) { | 303 for (size_t i = 0; i < initial_layouts.size(); ++i) { |
208 if (util_.IsValidInputMethodId(initial_layouts[i])) { | 304 if (manager_->util_.IsValidInputMethodId(initial_layouts[i])) { |
209 if (IsLoginKeyboard(initial_layouts[i])) { | 305 if (manager_->IsLoginKeyboard(initial_layouts[i])) { |
210 layouts.push_back(initial_layouts[i]); | 306 layouts.push_back(initial_layouts[i]); |
211 } else { | 307 } else { |
212 DVLOG(1) | 308 DVLOG(1) |
213 << "EnableLoginLayouts: ignoring non-login initial keyboard layout:" | 309 << "EnableLoginLayouts: ignoring non-login initial keyboard layout:" |
214 << initial_layouts[i]; | 310 << initial_layouts[i]; |
215 } | 311 } |
216 } else if (!initial_layouts[i].empty()) { | 312 } else if (!initial_layouts[i].empty()) { |
217 DVLOG(1) << "EnableLoginLayouts: ignoring non-keyboard or invalid ID: " | 313 DVLOG(1) << "EnableLoginLayouts: ignoring non-keyboard or invalid ID: " |
218 << initial_layouts[i]; | 314 << initial_layouts[i]; |
219 } | 315 } |
220 } | 316 } |
221 | 317 |
222 // Add candidates to layouts, while skipping duplicates. | 318 // Add candidates to layouts, while skipping duplicates. |
223 for (size_t i = 0; i < candidates.size(); ++i) { | 319 for (size_t i = 0; i < candidates.size(); ++i) { |
224 const std::string& candidate = candidates[i]; | 320 const std::string& candidate = candidates[i]; |
225 // Not efficient, but should be fine, as the two vectors are very | 321 // Not efficient, but should be fine, as the two vectors are very |
226 // short (2-5 items). | 322 // short (2-5 items). |
227 if (!Contains(layouts, candidate) && IsLoginKeyboard(candidate)) | 323 if (!Contains(layouts, candidate) && manager_->IsLoginKeyboard(candidate)) |
228 layouts.push_back(candidate); | 324 layouts.push_back(candidate); |
229 } | 325 } |
230 | 326 |
231 MigrateInputMethods(&layouts); | 327 manager_->MigrateInputMethods(&layouts); |
232 active_input_method_ids_.swap(layouts); | 328 active_input_method_ids.swap(layouts); |
233 | 329 |
234 // Initialize candidate window controller and widgets such as | 330 if (IsActive()) { |
235 // candidate window, infolist and mode indicator. Note, mode | 331 // Initialize candidate window controller and widgets such as |
236 // indicator is used by only keyboard layout input methods. | 332 // candidate window, infolist and mode indicator. Note, mode |
237 if (active_input_method_ids_.size() > 1) | 333 // indicator is used by only keyboard layout input methods. |
238 MaybeInitializeCandidateWindowController(); | 334 if (active_input_method_ids.size() > 1) |
335 manager_->MaybeInitializeCandidateWindowController(); | |
239 | 336 |
240 // you can pass empty |initial_layout|. | 337 // you can pass empty |initial_layout|. |
241 ChangeInputMethod(initial_layouts.empty() ? "" : | 338 ChangeInputMethod(initial_layouts.empty() |
242 extension_ime_util::GetInputMethodIDByEngineID(initial_layouts[0])); | 339 ? std::string() |
340 : extension_ime_util::GetInputMethodIDByEngineID( | |
341 initial_layouts[0]), | |
342 false); | |
343 } | |
344 } | |
345 | |
346 void InputMethodManagerImpl::StateImpl::EnableLockScreenLayouts() { | |
347 std::set<std::string> added_ids; | |
348 | |
349 const std::vector<std::string>& hardware_keyboard_ids = | |
350 manager_->util_.GetHardwareLoginInputMethodIds(); | |
351 | |
352 std::vector<std::string> new_active_input_method_ids; | |
353 for (size_t i = 0; i < active_input_method_ids.size(); ++i) { | |
354 const std::string& input_method_id = active_input_method_ids[i]; | |
355 // Skip if it's not a keyboard layout. Drop input methods including | |
356 // extension ones. | |
357 if (!manager_->IsLoginKeyboard(input_method_id) || | |
358 added_ids.count(input_method_id)) { | |
359 continue; | |
360 } | |
361 new_active_input_method_ids.push_back(input_method_id); | |
362 added_ids.insert(input_method_id); | |
363 } | |
364 | |
365 // We'll add the hardware keyboard if it's not included in | |
366 // |active_input_method_ids| so that the user can always use the hardware | |
367 // keyboard on the screen locker. | |
368 for (size_t i = 0; i < hardware_keyboard_ids.size(); ++i) { | |
369 if (added_ids.count(hardware_keyboard_ids[i])) | |
370 continue; | |
371 new_active_input_method_ids.push_back(hardware_keyboard_ids[i]); | |
372 added_ids.insert(hardware_keyboard_ids[i]); | |
373 } | |
374 | |
375 active_input_method_ids.swap(new_active_input_method_ids); | |
376 | |
377 // Re-check current_input_method. | |
378 ChangeInputMethod(current_input_method.id(), false); | |
243 } | 379 } |
244 | 380 |
245 // Adds new input method to given list. | 381 // Adds new input method to given list. |
246 bool InputMethodManagerImpl::EnableInputMethodImpl( | 382 bool InputMethodManagerImpl::StateImpl::EnableInputMethodImpl( |
247 const std::string& input_method_id, | 383 const std::string& input_method_id, |
248 std::vector<std::string>* new_active_input_method_ids) const { | 384 std::vector<std::string>* new_active_input_method_ids) const { |
249 DCHECK(new_active_input_method_ids); | 385 DCHECK(new_active_input_method_ids); |
250 if (!util_.IsValidInputMethodId(input_method_id)) { | 386 if (!manager_->util_.IsValidInputMethodId(input_method_id)) { |
251 DVLOG(1) << "EnableInputMethod: Invalid ID: " << input_method_id; | 387 DVLOG(1) << "EnableInputMethod: Invalid ID: " << input_method_id; |
252 return false; | 388 return false; |
253 } | 389 } |
254 | 390 |
255 if (!Contains(*new_active_input_method_ids, input_method_id)) | 391 if (!Contains(*new_active_input_method_ids, input_method_id)) |
256 new_active_input_method_ids->push_back(input_method_id); | 392 new_active_input_method_ids->push_back(input_method_id); |
257 | 393 |
258 return true; | 394 return true; |
259 } | 395 } |
260 | 396 |
261 // Starts or stops the system input method framework as needed. | 397 // Starts or stops the system input method framework as needed. |
262 void InputMethodManagerImpl::ReconfigureIMFramework() { | 398 void InputMethodManagerImpl::ReconfigureIMFramework( |
263 LoadNecessaryComponentExtensions(); | 399 InputMethodManagerImpl::StateImpl* state) { |
400 LoadNecessaryComponentExtensions(state); | |
264 | 401 |
265 // Initialize candidate window controller and widgets such as | 402 // Initialize candidate window controller and widgets such as |
266 // candidate window, infolist and mode indicator. Note, mode | 403 // candidate window, infolist and mode indicator. Note, mode |
267 // indicator is used by only keyboard layout input methods. | 404 // indicator is used by only keyboard layout input methods. |
268 MaybeInitializeCandidateWindowController(); | 405 if (state_.get() == state) |
406 MaybeInitializeCandidateWindowController(); | |
269 } | 407 } |
270 | 408 |
271 bool InputMethodManagerImpl::EnableInputMethod( | 409 bool InputMethodManagerImpl::StateImpl::EnableInputMethod( |
272 const std::string& input_method_id) { | 410 const std::string& input_method_id) { |
273 if (!EnableInputMethodImpl(input_method_id, &active_input_method_ids_)) | 411 if (!EnableInputMethodImpl(input_method_id, &active_input_method_ids)) |
274 return false; | 412 return false; |
275 | 413 |
276 ReconfigureIMFramework(); | 414 manager_->ReconfigureIMFramework(this); |
277 return true; | 415 return true; |
278 } | 416 } |
279 | 417 |
280 bool InputMethodManagerImpl::ReplaceEnabledInputMethods( | 418 bool InputMethodManagerImpl::StateImpl::ReplaceEnabledInputMethods( |
281 const std::vector<std::string>& new_active_input_method_ids) { | 419 const std::vector<std::string>& new_active_input_method_ids) { |
282 if (state_ == STATE_TERMINATING) | 420 if (manager_->ui_session_ == STATE_TERMINATING) |
283 return false; | 421 return false; |
284 | 422 |
285 // Filter unknown or obsolete IDs. | 423 // Filter unknown or obsolete IDs. |
286 std::vector<std::string> new_active_input_method_ids_filtered; | 424 std::vector<std::string> new_active_input_method_ids_filtered; |
287 | 425 |
288 for (size_t i = 0; i < new_active_input_method_ids.size(); ++i) | 426 for (size_t i = 0; i < new_active_input_method_ids.size(); ++i) |
289 EnableInputMethodImpl(new_active_input_method_ids[i], | 427 EnableInputMethodImpl(new_active_input_method_ids[i], |
290 &new_active_input_method_ids_filtered); | 428 &new_active_input_method_ids_filtered); |
291 | 429 |
292 if (new_active_input_method_ids_filtered.empty()) { | 430 if (new_active_input_method_ids_filtered.empty()) { |
293 DVLOG(1) << "ReplaceEnabledInputMethods: No valid input method ID"; | 431 DVLOG(1) << "ReplaceEnabledInputMethods: No valid input method ID"; |
294 return false; | 432 return false; |
295 } | 433 } |
296 | 434 |
297 // Copy extension IDs to |new_active_input_method_ids_filtered|. We have to | 435 // Copy extension IDs to |new_active_input_method_ids_filtered|. We have to |
298 // keep relative order of the extension input method IDs. | 436 // keep relative order of the extension input method IDs. |
299 for (size_t i = 0; i < active_input_method_ids_.size(); ++i) { | 437 for (size_t i = 0; i < active_input_method_ids.size(); ++i) { |
300 const std::string& input_method_id = active_input_method_ids_[i]; | 438 const std::string& input_method_id = active_input_method_ids[i]; |
301 if (extension_ime_util::IsExtensionIME(input_method_id)) | 439 if (extension_ime_util::IsExtensionIME(input_method_id)) |
302 new_active_input_method_ids_filtered.push_back(input_method_id); | 440 new_active_input_method_ids_filtered.push_back(input_method_id); |
303 } | 441 } |
304 active_input_method_ids_.swap(new_active_input_method_ids_filtered); | 442 active_input_method_ids.swap(new_active_input_method_ids_filtered); |
305 MigrateInputMethods(&active_input_method_ids_); | 443 manager_->MigrateInputMethods(&active_input_method_ids); |
306 | 444 |
307 ReconfigureIMFramework(); | 445 manager_->ReconfigureIMFramework(this); |
308 | 446 |
309 // If |current_input_method| is no longer in |active_input_method_ids_|, | 447 // If |current_input_method| is no longer in |active_input_method_ids|, |
310 // ChangeInputMethod() picks the first one in |active_input_method_ids_|. | 448 // ChangeInputMethod() picks the first one in |active_input_method_ids|. |
311 ChangeInputMethod(current_input_method_.id()); | 449 ChangeInputMethod(current_input_method.id(), false); |
312 return true; | 450 return true; |
313 } | 451 } |
314 | 452 |
315 void InputMethodManagerImpl::ChangeInputMethod( | 453 void InputMethodManagerImpl::StateImpl::ChangeInputMethod( |
316 const std::string& input_method_id) { | 454 const std::string& input_method_id, |
317 ChangeInputMethodInternal(input_method_id, false); | 455 bool show_message) { |
456 if (manager_->ui_session_ == STATE_TERMINATING) | |
457 return; | |
458 | |
459 bool notify_menu = false; | |
460 // For 3rd party IME, when the user just logged in, SetEnabledExtensionImes | |
461 // happens after activating the 3rd party IME. | |
462 // So here to record the 3rd party IME to be activated, and activate it | |
463 // when SetEnabledExtensionImes happens later. | |
464 if (MethodAwaitsExtensionLoad(input_method_id)) | |
465 pending_input_method_id = input_method_id; | |
466 | |
467 // Always lookup input method, even if it is the same as | |
468 // |current_input_method| because If it is no longer in | |
469 // |active_input_method_ids|, pick the first one in | |
470 // |active_input_method_ids|. | |
471 const InputMethodDescriptor* descriptor = | |
472 manager_->LookupInputMethod(input_method_id, this); | |
473 if (descriptor->id() != current_input_method.id()) { | |
474 previous_input_method = current_input_method; | |
475 current_input_method = *descriptor; | |
476 notify_menu = true; | |
477 } | |
478 | |
479 // Always change input method even if it is the same. | |
480 // TODO(komatsu): Revisit if this is neccessary. | |
481 if (IsActive()) | |
482 manager_->ChangeInputMethodInternal(*descriptor, show_message, notify_menu); | |
318 } | 483 } |
319 | 484 |
320 bool InputMethodManagerImpl::ChangeInputMethodInternal( | 485 bool InputMethodManagerImpl::StateImpl::MethodAwaitsExtensionLoad( |
486 const std::string& input_method_id) const { | |
487 // For 3rd party IME, when the user just logged in, SetEnabledExtensionImes | |
488 // happens after activating the 3rd party IME. | |
489 // So here to record the 3rd party IME to be activated, and activate it | |
490 // when SetEnabledExtensionImes happens later. | |
491 return !InputMethodIsActivated(input_method_id) && | |
492 extension_ime_util::IsExtensionIME(input_method_id); | |
493 } | |
494 | |
495 const InputMethodDescriptor* InputMethodManagerImpl::LookupInputMethod( | |
321 const std::string& input_method_id, | 496 const std::string& input_method_id, |
322 bool show_message) { | 497 InputMethodManagerImpl::StateImpl* state) { |
323 if (state_ == STATE_TERMINATING) | 498 DCHECK(state); |
324 return false; | |
325 | 499 |
326 std::string input_method_id_to_switch = input_method_id; | 500 std::string input_method_id_to_switch = input_method_id; |
327 | 501 |
328 // Sanity check. | 502 // Sanity check |
329 if (!InputMethodIsActivated(input_method_id)) { | 503 if (!state->InputMethodIsActivated(input_method_id)) { |
330 // For 3rd party IME, when the user just logged in, SetEnabledExtensionImes | 504 scoped_ptr<InputMethodDescriptors> input_methods( |
331 // happens after activating the 3rd party IME. | 505 state->GetActiveInputMethods()); |
332 // So here to record the 3rd party IME to be activated, and activate it | |
333 // when SetEnabledExtensionImes happens later. | |
334 if (extension_ime_util::IsExtensionIME(input_method_id)) | |
335 pending_input_method_id_ = input_method_id; | |
336 | |
337 scoped_ptr<InputMethodDescriptors> input_methods(GetActiveInputMethods()); | |
338 DCHECK(!input_methods->empty()); | 506 DCHECK(!input_methods->empty()); |
339 input_method_id_to_switch = input_methods->at(0).id(); | 507 input_method_id_to_switch = input_methods->at(0).id(); |
340 if (!input_method_id.empty()) { | 508 if (!input_method_id.empty()) { |
341 DVLOG(1) << "Can't change the current input method to " | 509 DVLOG(1) << "Can't change the current input method to " |
342 << input_method_id << " since the engine is not enabled. " | 510 << input_method_id << " since the engine is not enabled. " |
343 << "Switch to " << input_method_id_to_switch << " instead."; | 511 << "Switch to " << input_method_id_to_switch << " instead."; |
344 } | 512 } |
345 } | 513 } |
346 | 514 |
347 // Hide candidate window and info list. | 515 const InputMethodDescriptor* descriptor = NULL; |
516 if (extension_ime_util::IsExtensionIME(input_method_id_to_switch)) { | |
517 DCHECK(state->extra_input_methods.find(input_method_id_to_switch) != | |
518 state->extra_input_methods.end()); | |
519 descriptor = &(state->extra_input_methods[input_method_id_to_switch]); | |
520 } else { | |
521 descriptor = | |
522 util_.GetInputMethodDescriptorFromId(input_method_id_to_switch); | |
523 if (!descriptor) | |
524 LOG(ERROR) << "Unknown input method id: " << input_method_id_to_switch; | |
525 } | |
526 DCHECK(descriptor); | |
527 return descriptor; | |
528 } | |
529 | |
530 void InputMethodManagerImpl::ChangeInputMethodInternal( | |
531 const InputMethodDescriptor& descriptor, | |
532 bool show_message, | |
533 bool notify_menu) { | |
534 // No need to switch input method when terminating. | |
535 if (ui_session_ == STATE_TERMINATING) | |
536 return; | |
537 | |
348 if (candidate_window_controller_.get()) | 538 if (candidate_window_controller_.get()) |
349 candidate_window_controller_->Hide(); | 539 candidate_window_controller_->Hide(); |
350 | 540 |
351 // TODO(komatsu): Check if it is necessary to perform the above routine | 541 if (notify_menu) { |
352 // when the current input method is equal to |input_method_id_to_swich|. | |
353 if (current_input_method_.id() != input_method_id_to_switch) { | |
354 // Clear property list. Property list would be updated by | 542 // Clear property list. Property list would be updated by |
355 // extension IMEs via InputMethodEngine::(Set|Update)MenuItems. | 543 // extension IMEs via InputMethodEngine::(Set|Update)MenuItems. |
356 // If the current input method is a keyboard layout, empty | 544 // If the current input method is a keyboard layout, empty |
357 // properties are sufficient. | 545 // properties are sufficient. |
358 const ash::ime::InputMethodMenuItemList empty_menu_item_list; | 546 const ash::ime::InputMethodMenuItemList empty_menu_item_list; |
359 ash::ime::InputMethodMenuManager* input_method_menu_manager = | 547 ash::ime::InputMethodMenuManager* input_method_menu_manager = |
360 ash::ime::InputMethodMenuManager::GetInstance(); | 548 ash::ime::InputMethodMenuManager::GetInstance(); |
361 input_method_menu_manager->SetCurrentInputMethodMenuItemList( | 549 input_method_menu_manager->SetCurrentInputMethodMenuItemList( |
362 empty_menu_item_list); | 550 empty_menu_item_list); |
363 | |
364 const InputMethodDescriptor* descriptor = NULL; | |
365 if (extension_ime_util::IsExtensionIME(input_method_id_to_switch)) { | |
366 DCHECK(extra_input_methods_.find(input_method_id_to_switch) != | |
367 extra_input_methods_.end()); | |
368 descriptor = &(extra_input_methods_[input_method_id_to_switch]); | |
369 } else { | |
370 descriptor = | |
371 util_.GetInputMethodDescriptorFromId(input_method_id_to_switch); | |
372 if (!descriptor) | |
373 LOG(ERROR) << "Unknown input method id: " << input_method_id_to_switch; | |
374 } | |
375 DCHECK(descriptor); | |
376 | |
377 previous_input_method_ = current_input_method_; | |
378 current_input_method_ = *descriptor; | |
379 } | 551 } |
380 | 552 |
381 // Disable the current engine handler. | 553 // Disable the current engine handler. |
382 IMEEngineHandlerInterface* engine = | 554 IMEEngineHandlerInterface* engine = |
383 IMEBridge::Get()->GetCurrentEngineHandler(); | 555 IMEBridge::Get()->GetCurrentEngineHandler(); |
384 if (engine) | 556 if (engine) |
385 engine->Disable(); | 557 engine->Disable(); |
386 | 558 |
387 // Configure the next engine handler. | 559 // Configure the next engine handler. |
388 // This must be after |current_input_method_| has been set to new input | 560 // This must be after |current_input_method| has been set to new input |
389 // method, because engine's Enable() method needs to access it. | 561 // method, because engine's Enable() method needs to access it. |
390 const std::string& extension_id = | 562 const std::string& extension_id = |
391 extension_ime_util::GetExtensionIDFromInputMethodID( | 563 extension_ime_util::GetExtensionIDFromInputMethodID(descriptor.id()); |
392 input_method_id_to_switch); | |
393 const std::string& component_id = | 564 const std::string& component_id = |
394 extension_ime_util::GetComponentIDByInputMethodID( | 565 extension_ime_util::GetComponentIDByInputMethodID(descriptor.id()); |
395 input_method_id_to_switch); | |
396 engine = engine_map_[extension_id]; | 566 engine = engine_map_[extension_id]; |
567 | |
397 IMEBridge::Get()->SetCurrentEngineHandler(engine); | 568 IMEBridge::Get()->SetCurrentEngineHandler(engine); |
569 | |
398 if (engine) | 570 if (engine) |
399 engine->Enable(component_id); | 571 engine->Enable(component_id); |
400 | 572 |
401 // Change the keyboard layout to a preferred layout for the input method. | 573 // Change the keyboard layout to a preferred layout for the input method. |
402 if (!keyboard_->SetCurrentKeyboardLayoutByName( | 574 if (!keyboard_->SetCurrentKeyboardLayoutByName( |
403 current_input_method_.GetPreferredKeyboardLayout())) { | 575 descriptor.GetPreferredKeyboardLayout())) { |
404 LOG(ERROR) << "Failed to change keyboard layout to " | 576 LOG(ERROR) << "Failed to change keyboard layout to " |
405 << current_input_method_.GetPreferredKeyboardLayout(); | 577 << descriptor.GetPreferredKeyboardLayout(); |
406 } | 578 } |
407 | 579 |
408 // Update input method indicators (e.g. "US", "DV") in Chrome windows. | 580 // Update input method indicators (e.g. "US", "DV") in Chrome windows. |
409 FOR_EACH_OBSERVER(InputMethodManager::Observer, | 581 FOR_EACH_OBSERVER(InputMethodManager::Observer, |
410 observers_, | 582 observers_, |
411 InputMethodChanged(this, show_message)); | 583 InputMethodChanged(this, show_message)); |
412 return true; | |
413 } | 584 } |
414 | 585 |
415 void InputMethodManagerImpl::LoadNecessaryComponentExtensions() { | 586 void InputMethodManagerImpl::LoadNecessaryComponentExtensions( |
416 // Load component extensions but also update |active_input_method_ids_| as | 587 InputMethodManagerImpl::StateImpl* state) { |
588 // Load component extensions but also update |active_input_method_ids| as | |
417 // some component extension IMEs may have been removed from the Chrome OS | 589 // some component extension IMEs may have been removed from the Chrome OS |
418 // image. If specified component extension IME no longer exists, falling back | 590 // image. If specified component extension IME no longer exists, falling back |
419 // to an existing IME. | 591 // to an existing IME. |
592 DCHECK(state); | |
420 std::vector<std::string> unfiltered_input_method_ids; | 593 std::vector<std::string> unfiltered_input_method_ids; |
421 unfiltered_input_method_ids.swap(active_input_method_ids_); | 594 unfiltered_input_method_ids.swap(state->active_input_method_ids); |
422 for (size_t i = 0; i < unfiltered_input_method_ids.size(); ++i) { | 595 for (size_t i = 0; i < unfiltered_input_method_ids.size(); ++i) { |
423 if (!extension_ime_util::IsComponentExtensionIME( | 596 if (!extension_ime_util::IsComponentExtensionIME( |
424 unfiltered_input_method_ids[i])) { | 597 unfiltered_input_method_ids[i])) { |
425 // Legacy IMEs or xkb layouts are alwayes active. | 598 // Legacy IMEs or xkb layouts are alwayes active. |
426 active_input_method_ids_.push_back(unfiltered_input_method_ids[i]); | 599 state->active_input_method_ids.push_back(unfiltered_input_method_ids[i]); |
427 } else if (component_extension_ime_manager_->IsWhitelisted( | 600 } else if (component_extension_ime_manager_->IsWhitelisted( |
428 unfiltered_input_method_ids[i])) { | 601 unfiltered_input_method_ids[i])) { |
429 component_extension_ime_manager_->LoadComponentExtensionIME( | 602 component_extension_ime_manager_->LoadComponentExtensionIME( |
430 unfiltered_input_method_ids[i]); | 603 state->profile, unfiltered_input_method_ids[i]); |
431 active_input_method_ids_.push_back(unfiltered_input_method_ids[i]); | 604 state->active_input_method_ids.push_back(unfiltered_input_method_ids[i]); |
432 } | 605 } |
433 } | 606 } |
434 } | 607 } |
435 | 608 |
436 void InputMethodManagerImpl::ActivateInputMethodMenuItem( | 609 void InputMethodManagerImpl::ActivateInputMethodMenuItem( |
437 const std::string& key) { | 610 const std::string& key) { |
438 DCHECK(!key.empty()); | 611 DCHECK(!key.empty()); |
439 | 612 |
440 if (ash::ime::InputMethodMenuManager::GetInstance()-> | 613 if (ash::ime::InputMethodMenuManager::GetInstance()-> |
441 HasInputMethodMenuItemForKey(key)) { | 614 HasInputMethodMenuItemForKey(key)) { |
442 IMEEngineHandlerInterface* engine = | 615 IMEEngineHandlerInterface* engine = |
443 IMEBridge::Get()->GetCurrentEngineHandler(); | 616 IMEBridge::Get()->GetCurrentEngineHandler(); |
444 if (engine) | 617 if (engine) |
445 engine->PropertyActivate(key); | 618 engine->PropertyActivate(key); |
446 return; | 619 return; |
447 } | 620 } |
448 | 621 |
449 DVLOG(1) << "ActivateInputMethodMenuItem: unknown key: " << key; | 622 DVLOG(1) << "ActivateInputMethodMenuItem: unknown key: " << key; |
450 } | 623 } |
451 | 624 |
452 void InputMethodManagerImpl::AddInputMethodExtension( | 625 void InputMethodManagerImpl::StateImpl::AddInputMethodExtension( |
453 const std::string& extension_id, | 626 const std::string& extension_id, |
454 const InputMethodDescriptors& descriptors, | 627 const InputMethodDescriptors& descriptors, |
455 InputMethodEngineInterface* engine) { | 628 InputMethodEngineInterface* engine) { |
456 if (state_ == STATE_TERMINATING) | 629 if (manager_->ui_session_ == STATE_TERMINATING) |
457 return; | 630 return; |
458 | 631 |
459 DCHECK(engine); | 632 DCHECK(engine); |
460 | 633 |
461 engine_map_[extension_id] = engine; | 634 manager_->engine_map_[extension_id] = engine; |
462 | |
463 if (extension_id == extension_ime_util::GetExtensionIDFromInputMethodID( | |
464 current_input_method_.id())) { | |
465 IMEBridge::Get()->SetCurrentEngineHandler(engine); | |
466 engine->Enable(extension_ime_util::GetComponentIDByInputMethodID( | |
467 current_input_method_.id())); | |
468 } | |
469 | 635 |
470 bool contain = false; | 636 bool contain = false; |
471 for (size_t i = 0; i < descriptors.size(); i++) { | 637 for (size_t i = 0; i < descriptors.size(); i++) { |
472 const InputMethodDescriptor& descriptor = descriptors[i]; | 638 const InputMethodDescriptor& descriptor = descriptors[i]; |
473 const std::string& id = descriptor.id(); | 639 const std::string& id = descriptor.id(); |
474 extra_input_methods_[id] = descriptor; | 640 extra_input_methods[id] = descriptor; |
475 if (Contains(enabled_extension_imes_, id)) { | 641 if (Contains(enabled_extension_imes, id)) { |
476 if (!Contains(active_input_method_ids_, id)) { | 642 if (!Contains(active_input_method_ids, id)) { |
477 active_input_method_ids_.push_back(id); | 643 active_input_method_ids.push_back(id); |
478 } else { | 644 } else { |
479 DVLOG(1) << "AddInputMethodExtension: already added: " << id << ", " | 645 DVLOG(1) << "AddInputMethodExtension: already added: " << id << ", " |
480 << descriptor.name(); | 646 << descriptor.name(); |
481 } | 647 } |
482 contain = true; | 648 contain = true; |
483 } | 649 } |
484 } | 650 } |
485 | 651 |
486 // Ensure that the input method daemon is running. | 652 if (IsActive()) { |
487 if (contain) | 653 if (extension_id == extension_ime_util::GetExtensionIDFromInputMethodID( |
488 MaybeInitializeCandidateWindowController(); | 654 current_input_method.id())) { |
655 IMEBridge::Get()->SetCurrentEngineHandler(engine); | |
656 engine->Enable(extension_ime_util::GetComponentIDByInputMethodID( | |
657 current_input_method.id())); | |
658 } | |
659 | |
660 // Ensure that the input method daemon is running. | |
661 if (contain) | |
662 manager_->MaybeInitializeCandidateWindowController(); | |
663 } | |
489 } | 664 } |
490 | 665 |
491 void InputMethodManagerImpl::RemoveInputMethodExtension( | 666 void InputMethodManagerImpl::StateImpl::RemoveInputMethodExtension( |
492 const std::string& extension_id) { | 667 const std::string& extension_id) { |
493 // Remove the active input methods with |extension_id|. | 668 // Remove the active input methods with |extension_id|. |
494 std::vector<std::string> new_active_input_method_ids; | 669 std::vector<std::string> new_active_input_method_ids; |
495 for (size_t i = 0; i < active_input_method_ids_.size(); ++i) { | 670 for (size_t i = 0; i < active_input_method_ids.size(); ++i) { |
496 if (extension_id != extension_ime_util::GetExtensionIDFromInputMethodID( | 671 if (extension_id != extension_ime_util::GetExtensionIDFromInputMethodID( |
497 active_input_method_ids_[i])) | 672 active_input_method_ids[i])) |
498 new_active_input_method_ids.push_back(active_input_method_ids_[i]); | 673 new_active_input_method_ids.push_back(active_input_method_ids[i]); |
499 } | 674 } |
500 active_input_method_ids_.swap(new_active_input_method_ids); | 675 active_input_method_ids.swap(new_active_input_method_ids); |
501 | 676 |
502 // Remove the extra input methods with |extension_id|. | 677 // Remove the extra input methods with |extension_id|. |
503 std::map<std::string, InputMethodDescriptor> new_extra_input_methods; | 678 std::map<std::string, InputMethodDescriptor> new_extra_input_methods; |
504 for (std::map<std::string, InputMethodDescriptor>::iterator i = | 679 for (std::map<std::string, InputMethodDescriptor>::iterator i = |
505 extra_input_methods_.begin(); | 680 extra_input_methods.begin(); |
506 i != extra_input_methods_.end(); | 681 i != extra_input_methods.end(); |
507 ++i) { | 682 ++i) { |
508 if (extension_id != | 683 if (extension_id != |
509 extension_ime_util::GetExtensionIDFromInputMethodID(i->first)) | 684 extension_ime_util::GetExtensionIDFromInputMethodID(i->first)) |
510 new_extra_input_methods[i->first] = i->second; | 685 new_extra_input_methods[i->first] = i->second; |
511 } | 686 } |
512 extra_input_methods_.swap(new_extra_input_methods); | 687 extra_input_methods.swap(new_extra_input_methods); |
513 | 688 |
514 if (IMEBridge::Get()->GetCurrentEngineHandler() == engine_map_[extension_id]) | 689 if (IsActive()) { |
515 IMEBridge::Get()->SetCurrentEngineHandler(NULL); | 690 if (IMEBridge::Get()->GetCurrentEngineHandler() == |
516 engine_map_.erase(extension_id); | 691 manager_->engine_map_[extension_id]) { |
692 IMEBridge::Get()->SetCurrentEngineHandler(NULL); | |
693 } | |
694 manager_->engine_map_.erase(extension_id); | |
695 } | |
517 | 696 |
518 // No need to switch input method when terminating. | 697 // If |current_input_method| is no longer in |active_input_method_ids|, |
519 if (state_ != STATE_TERMINATING) { | 698 // switch to the first one in |active_input_method_ids|. |
520 // If |current_input_method| is no longer in |active_input_method_ids_|, | 699 ChangeInputMethod(current_input_method.id(), false); |
521 // switch to the first one in |active_input_method_ids_|. | |
522 ChangeInputMethod(current_input_method_.id()); | |
523 } | |
524 } | 700 } |
525 | 701 |
526 void InputMethodManagerImpl::GetInputMethodExtensions( | 702 void InputMethodManagerImpl::StateImpl::GetInputMethodExtensions( |
527 InputMethodDescriptors* result) { | 703 InputMethodDescriptors* result) { |
528 // Build the extension input method descriptors from the extra input | 704 // Build the extension input method descriptors from the extra input |
529 // methods cache |extra_input_methods_|. | 705 // methods cache |extra_input_methods|. |
530 std::map<std::string, InputMethodDescriptor>::iterator iter; | 706 std::map<std::string, InputMethodDescriptor>::iterator iter; |
531 for (iter = extra_input_methods_.begin(); iter != extra_input_methods_.end(); | 707 for (iter = extra_input_methods.begin(); iter != extra_input_methods.end(); |
532 ++iter) { | 708 ++iter) { |
533 if (extension_ime_util::IsExtensionIME(iter->first)) | 709 if (extension_ime_util::IsExtensionIME(iter->first)) |
534 result->push_back(iter->second); | 710 result->push_back(iter->second); |
535 } | 711 } |
536 } | 712 } |
537 | 713 |
538 void InputMethodManagerImpl::SetEnabledExtensionImes( | 714 void InputMethodManagerImpl::StateImpl::SetEnabledExtensionImes( |
539 std::vector<std::string>* ids) { | 715 std::vector<std::string>* ids) { |
540 enabled_extension_imes_.clear(); | 716 enabled_extension_imes.clear(); |
541 enabled_extension_imes_.insert(enabled_extension_imes_.end(), | 717 enabled_extension_imes.insert( |
542 ids->begin(), | 718 enabled_extension_imes.end(), ids->begin(), ids->end()); |
543 ids->end()); | |
544 | |
545 bool active_imes_changed = false; | 719 bool active_imes_changed = false; |
546 bool switch_to_pending = false; | 720 bool switch_to_pending = false; |
547 | 721 |
548 for (std::map<std::string, InputMethodDescriptor>::iterator extra_iter = | 722 for (std::map<std::string, InputMethodDescriptor>::iterator extra_iter = |
549 extra_input_methods_.begin(); extra_iter != extra_input_methods_.end(); | 723 extra_input_methods.begin(); |
724 extra_iter != extra_input_methods.end(); | |
550 ++extra_iter) { | 725 ++extra_iter) { |
551 if (extension_ime_util::IsComponentExtensionIME( | 726 if (extension_ime_util::IsComponentExtensionIME(extra_iter->first)) |
552 extra_iter->first)) | |
553 continue; // Do not filter component extension. | 727 continue; // Do not filter component extension. |
554 | 728 |
555 if (pending_input_method_id_ == extra_iter->first) | 729 if (pending_input_method_id == extra_iter->first) |
556 switch_to_pending = true; | 730 switch_to_pending = true; |
557 | 731 |
558 std::vector<std::string>::iterator active_iter = std::find( | 732 std::vector<std::string>::iterator active_iter = |
559 active_input_method_ids_.begin(), active_input_method_ids_.end(), | 733 std::find(active_input_method_ids.begin(), |
560 extra_iter->first); | 734 active_input_method_ids.end(), |
735 extra_iter->first); | |
561 | 736 |
562 bool active = active_iter != active_input_method_ids_.end(); | 737 bool active = active_iter != active_input_method_ids.end(); |
563 bool enabled = Contains(enabled_extension_imes_, extra_iter->first); | 738 bool enabled = Contains(enabled_extension_imes, extra_iter->first); |
564 | 739 |
565 if (active && !enabled) | 740 if (active && !enabled) |
566 active_input_method_ids_.erase(active_iter); | 741 active_input_method_ids.erase(active_iter); |
567 | 742 |
568 if (!active && enabled) | 743 if (!active && enabled) |
569 active_input_method_ids_.push_back(extra_iter->first); | 744 active_input_method_ids.push_back(extra_iter->first); |
570 | 745 |
571 if (active == !enabled) | 746 if (active == !enabled) |
572 active_imes_changed = true; | 747 active_imes_changed = true; |
573 } | 748 } |
574 | 749 |
575 if (active_imes_changed) { | 750 if (IsActive() && active_imes_changed) { |
576 MaybeInitializeCandidateWindowController(); | 751 manager_->MaybeInitializeCandidateWindowController(); |
577 | 752 |
578 if (switch_to_pending) { | 753 if (switch_to_pending) { |
579 ChangeInputMethod(pending_input_method_id_); | 754 ChangeInputMethod(pending_input_method_id, false); |
580 pending_input_method_id_.clear(); | 755 pending_input_method_id.clear(); |
581 } else { | 756 } else { |
582 // If |current_input_method| is no longer in |active_input_method_ids_|, | 757 // If |current_input_method| is no longer in |active_input_method_ids_|, |
583 // switch to the first one in |active_input_method_ids_|. | 758 // switch to the first one in |active_input_method_ids_|. |
584 ChangeInputMethod(current_input_method_.id()); | 759 ChangeInputMethod(current_input_method.id(), false); |
585 } | 760 } |
586 } | 761 } |
587 } | 762 } |
588 | 763 |
589 void InputMethodManagerImpl::SetInputMethodLoginDefaultFromVPD( | 764 void InputMethodManagerImpl::StateImpl::SetInputMethodLoginDefaultFromVPD( |
590 const std::string& locale, const std::string& oem_layout) { | 765 const std::string& locale, |
766 const std::string& oem_layout) { | |
591 std::string layout; | 767 std::string layout; |
592 if (!oem_layout.empty()) { | 768 if (!oem_layout.empty()) { |
593 // If the OEM layout information is provided, use it. | 769 // If the OEM layout information is provided, use it. |
594 layout = oem_layout; | 770 layout = oem_layout; |
595 } else { | 771 } else { |
596 // Otherwise, determine the hardware keyboard from the locale. | 772 // Otherwise, determine the hardware keyboard from the locale. |
597 std::vector<std::string> input_method_ids; | 773 std::vector<std::string> input_method_ids; |
598 if (util_.GetInputMethodIdsFromLanguageCode( | 774 if (manager_->util_.GetInputMethodIdsFromLanguageCode( |
599 locale, | 775 locale, |
600 chromeos::input_method::kKeyboardLayoutsOnly, | 776 chromeos::input_method::kKeyboardLayoutsOnly, |
601 &input_method_ids)) { | 777 &input_method_ids)) { |
602 // The output list |input_method_ids| is sorted by popularity, hence | 778 // The output list |input_method_ids| is sorted by popularity, hence |
603 // input_method_ids[0] now contains the most popular keyboard layout | 779 // input_method_ids[0] now contains the most popular keyboard layout |
604 // for the given locale. | 780 // for the given locale. |
605 DCHECK_GE(input_method_ids.size(), 1U); | 781 DCHECK_GE(input_method_ids.size(), 1U); |
606 layout = input_method_ids[0]; | 782 layout = input_method_ids[0]; |
607 } | 783 } |
608 } | 784 } |
609 | 785 |
610 if (layout.empty()) | 786 if (layout.empty()) |
611 return; | 787 return; |
612 | 788 |
613 std::vector<std::string> layouts; | 789 std::vector<std::string> layouts; |
614 base::SplitString(layout, ',', &layouts); | 790 base::SplitString(layout, ',', &layouts); |
615 MigrateInputMethods(&layouts); | 791 manager_->MigrateInputMethods(&layouts); |
616 | 792 |
617 PrefService* prefs = g_browser_process->local_state(); | 793 PrefService* prefs = g_browser_process->local_state(); |
618 prefs->SetString(prefs::kHardwareKeyboardLayout, JoinString(layouts, ",")); | 794 prefs->SetString(prefs::kHardwareKeyboardLayout, JoinString(layouts, ",")); |
619 | 795 |
620 // This asks the file thread to save the prefs (i.e. doesn't block). | 796 // This asks the file thread to save the prefs (i.e. doesn't block). |
621 // The latest values of Local State reside in memory so we can safely | 797 // The latest values of Local State reside in memory so we can safely |
622 // get the value of kHardwareKeyboardLayout even if the data is not | 798 // get the value of kHardwareKeyboardLayout even if the data is not |
623 // yet saved to disk. | 799 // yet saved to disk. |
624 prefs->CommitPendingWrite(); | 800 prefs->CommitPendingWrite(); |
625 | 801 |
626 util_.UpdateHardwareLayoutCache(); | 802 manager_->util_.UpdateHardwareLayoutCache(); |
627 | 803 |
628 EnableLoginLayouts(locale, layouts); | 804 EnableLoginLayouts(locale, layouts); |
629 LoadNecessaryComponentExtensions(); | 805 manager_->LoadNecessaryComponentExtensions(this); |
630 } | 806 } |
631 | 807 |
632 void InputMethodManagerImpl::SetInputMethodLoginDefault() { | 808 void InputMethodManagerImpl::StateImpl::SetInputMethodLoginDefault() { |
633 // Set up keyboards. For example, when |locale| is "en-US", enable US qwerty | 809 // Set up keyboards. For example, when |locale| is "en-US", enable US qwerty |
634 // and US dvorak keyboard layouts. | 810 // and US dvorak keyboard layouts. |
635 if (g_browser_process && g_browser_process->local_state()) { | 811 if (g_browser_process && g_browser_process->local_state()) { |
636 const std::string locale = g_browser_process->GetApplicationLocale(); | 812 const std::string locale = g_browser_process->GetApplicationLocale(); |
637 // If the preferred keyboard for the login screen has been saved, use it. | 813 // If the preferred keyboard for the login screen has been saved, use it. |
638 PrefService* prefs = g_browser_process->local_state(); | 814 PrefService* prefs = g_browser_process->local_state(); |
639 std::string initial_input_method_id = | 815 std::string initial_input_method_id = |
640 prefs->GetString(chromeos::language_prefs::kPreferredKeyboardLayout); | 816 prefs->GetString(chromeos::language_prefs::kPreferredKeyboardLayout); |
641 std::vector<std::string> input_methods_to_be_enabled; | 817 std::vector<std::string> input_methods_to_be_enabled; |
642 if (initial_input_method_id.empty()) { | 818 if (initial_input_method_id.empty()) { |
643 // If kPreferredKeyboardLayout is not specified, use the hardware layout. | 819 // If kPreferredKeyboardLayout is not specified, use the hardware layout. |
644 input_methods_to_be_enabled = util_.GetHardwareLoginInputMethodIds(); | 820 input_methods_to_be_enabled = |
821 manager_->util_.GetHardwareLoginInputMethodIds(); | |
645 } else { | 822 } else { |
646 input_methods_to_be_enabled.push_back(initial_input_method_id); | 823 input_methods_to_be_enabled.push_back(initial_input_method_id); |
647 } | 824 } |
648 EnableLoginLayouts(locale, input_methods_to_be_enabled); | 825 EnableLoginLayouts(locale, input_methods_to_be_enabled); |
649 LoadNecessaryComponentExtensions(); | 826 manager_->LoadNecessaryComponentExtensions(this); |
650 } | 827 } |
651 } | 828 } |
652 | 829 |
653 bool InputMethodManagerImpl::SwitchToNextInputMethod() { | 830 bool InputMethodManagerImpl::StateImpl::SwitchToNextInputMethod() { |
654 // Sanity checks. | 831 // Sanity checks. |
655 if (active_input_method_ids_.empty()) { | 832 if (active_input_method_ids.empty()) { |
656 DVLOG(1) << "active input method is empty"; | 833 DVLOG(1) << "active input method is empty"; |
657 return false; | 834 return false; |
658 } | 835 } |
659 | 836 |
660 if (current_input_method_.id().empty()) { | 837 if (current_input_method.id().empty()) { |
661 DVLOG(1) << "current_input_method_ is unknown"; | 838 DVLOG(1) << "current_input_method is unknown"; |
662 return false; | 839 return false; |
663 } | 840 } |
664 | 841 |
665 // Do not consume key event if there is only one input method is enabled. | 842 // Do not consume key event if there is only one input method is enabled. |
666 // Ctrl+Space or Alt+Shift may be used by other application. | 843 // Ctrl+Space or Alt+Shift may be used by other application. |
667 if (active_input_method_ids_.size() == 1) | 844 if (active_input_method_ids.size() == 1) |
668 return false; | 845 return false; |
669 | 846 |
670 // Find the next input method and switch to it. | 847 // Find the next input method and switch to it. |
671 SwitchToNextInputMethodInternal(active_input_method_ids_, | 848 SwitchToNextInputMethodInternal(active_input_method_ids, |
672 current_input_method_.id()); | 849 current_input_method.id()); |
673 return true; | 850 return true; |
674 } | 851 } |
675 | 852 |
676 bool InputMethodManagerImpl::SwitchToPreviousInputMethod( | 853 bool InputMethodManagerImpl::StateImpl::SwitchToPreviousInputMethod( |
677 const ui::Accelerator& accelerator) { | 854 const ui::Accelerator& accelerator) { |
678 // Sanity check. | 855 // Sanity check. |
679 if (active_input_method_ids_.empty()) { | 856 if (active_input_method_ids.empty()) { |
680 DVLOG(1) << "active input method is empty"; | 857 DVLOG(1) << "active input method is empty"; |
681 return false; | 858 return false; |
682 } | 859 } |
683 | 860 |
684 // Do not consume key event if there is only one input method is enabled. | 861 // Do not consume key event if there is only one input method is enabled. |
685 // Ctrl+Space or Alt+Shift may be used by other application. | 862 // Ctrl+Space or Alt+Shift may be used by other application. |
686 if (active_input_method_ids_.size() == 1) | 863 if (active_input_method_ids.size() == 1) |
687 return false; | 864 return false; |
688 | 865 |
689 if (accelerator.type() == ui::ET_KEY_RELEASED) | 866 if (accelerator.type() == ui::ET_KEY_RELEASED) |
690 return true; | 867 return true; |
691 | 868 |
692 if (previous_input_method_.id().empty() || | 869 if (previous_input_method.id().empty() || |
693 previous_input_method_.id() == current_input_method_.id()) { | 870 previous_input_method.id() == current_input_method.id()) { |
694 return SwitchToNextInputMethod(); | 871 return SwitchToNextInputMethod(); |
695 } | 872 } |
696 | 873 |
697 std::vector<std::string>::const_iterator iter = | 874 std::vector<std::string>::const_iterator iter = |
698 std::find(active_input_method_ids_.begin(), | 875 std::find(active_input_method_ids.begin(), |
699 active_input_method_ids_.end(), | 876 active_input_method_ids.end(), |
700 previous_input_method_.id()); | 877 previous_input_method.id()); |
701 if (iter == active_input_method_ids_.end()) { | 878 if (iter == active_input_method_ids.end()) { |
702 // previous_input_method_ is not supported. | 879 // previous_input_method is not supported. |
703 return SwitchToNextInputMethod(); | 880 return SwitchToNextInputMethod(); |
704 } | 881 } |
705 ChangeInputMethodInternal(*iter, true); | 882 ChangeInputMethod(*iter, true); |
883 | |
706 return true; | 884 return true; |
707 } | 885 } |
708 | 886 |
709 bool InputMethodManagerImpl::SwitchInputMethod( | 887 bool InputMethodManagerImpl::StateImpl::SwitchInputMethod( |
710 const ui::Accelerator& accelerator) { | 888 const ui::Accelerator& accelerator) { |
711 // Sanity check. | 889 // Sanity check. |
712 if (active_input_method_ids_.empty()) { | 890 if (active_input_method_ids.empty()) { |
713 DVLOG(1) << "active input method is empty"; | 891 DVLOG(1) << "active input method is empty"; |
714 return false; | 892 return false; |
715 } | 893 } |
716 | 894 |
717 // Get the list of input method ids for the |accelerator|. For example, get | 895 // Get the list of input method ids for the |accelerator|. For example, get |
718 // { "mozc-hangul", "xkb:kr:kr104:kor" } for ui::VKEY_DBE_SBCSCHAR. | 896 // { "mozc-hangul", "xkb:kr:kr104:kor" } for ui::VKEY_DBE_SBCSCHAR. |
719 std::vector<std::string> input_method_ids_to_switch; | 897 std::vector<std::string> input_method_ids_to_switch; |
720 switch (accelerator.key_code()) { | 898 switch (accelerator.key_code()) { |
721 case ui::VKEY_CONVERT: // Henkan key on JP106 keyboard | 899 case ui::VKEY_CONVERT: // Henkan key on JP106 keyboard |
722 input_method_ids_to_switch.push_back( | 900 input_method_ids_to_switch.push_back( |
(...skipping 13 matching lines...) Expand all Loading... | |
736 default: | 914 default: |
737 NOTREACHED(); | 915 NOTREACHED(); |
738 break; | 916 break; |
739 } | 917 } |
740 if (input_method_ids_to_switch.empty()) { | 918 if (input_method_ids_to_switch.empty()) { |
741 DVLOG(1) << "Unexpected VKEY: " << accelerator.key_code(); | 919 DVLOG(1) << "Unexpected VKEY: " << accelerator.key_code(); |
742 return false; | 920 return false; |
743 } | 921 } |
744 | 922 |
745 // Obtain the intersection of input_method_ids_to_switch and | 923 // Obtain the intersection of input_method_ids_to_switch and |
746 // active_input_method_ids_. The order of IDs in active_input_method_ids_ is | 924 // active_input_method_ids. The order of IDs in active_input_method_ids is |
747 // preserved. | 925 // preserved. |
748 std::vector<std::string> ids; | 926 std::vector<std::string> ids; |
749 for (size_t i = 0; i < input_method_ids_to_switch.size(); ++i) { | 927 for (size_t i = 0; i < input_method_ids_to_switch.size(); ++i) { |
750 const std::string& id = input_method_ids_to_switch[i]; | 928 const std::string& id = input_method_ids_to_switch[i]; |
751 if (Contains(active_input_method_ids_, id)) | 929 if (Contains(active_input_method_ids, id)) |
752 ids.push_back(id); | 930 ids.push_back(id); |
753 } | 931 } |
754 if (ids.empty()) { | 932 if (ids.empty()) { |
755 // No input method for the accelerator is active. For example, we should | 933 // No input method for the accelerator is active. For example, we should |
756 // just ignore VKEY_HANGUL when mozc-hangul is not active. | 934 // just ignore VKEY_HANGUL when mozc-hangul is not active. |
757 return false; | 935 return false; |
758 } | 936 } |
759 | 937 |
760 SwitchToNextInputMethodInternal(ids, current_input_method_.id()); | 938 SwitchToNextInputMethodInternal(ids, current_input_method.id()); |
761 return true; // consume the accelerator. | 939 return true; // consume the accelerator. |
762 } | 940 } |
763 | 941 |
764 void InputMethodManagerImpl::SwitchToNextInputMethodInternal( | 942 void InputMethodManagerImpl::StateImpl::SwitchToNextInputMethodInternal( |
765 const std::vector<std::string>& input_method_ids, | 943 const std::vector<std::string>& input_method_ids, |
766 const std::string& current_input_method_id) { | 944 const std::string& current_input_methodid) { |
767 std::vector<std::string>::const_iterator iter = | 945 std::vector<std::string>::const_iterator iter = std::find( |
768 std::find(input_method_ids.begin(), | 946 input_method_ids.begin(), input_method_ids.end(), current_input_methodid); |
769 input_method_ids.end(), | |
770 current_input_method_id); | |
771 if (iter != input_method_ids.end()) | 947 if (iter != input_method_ids.end()) |
772 ++iter; | 948 ++iter; |
773 if (iter == input_method_ids.end()) | 949 if (iter == input_method_ids.end()) |
774 iter = input_method_ids.begin(); | 950 iter = input_method_ids.begin(); |
775 ChangeInputMethodInternal(*iter, true); | 951 ChangeInputMethod(*iter, true); |
776 } | 952 } |
777 | 953 |
778 InputMethodDescriptor InputMethodManagerImpl::GetCurrentInputMethod() const { | 954 InputMethodDescriptor InputMethodManagerImpl::StateImpl::GetCurrentInputMethod() |
779 if (current_input_method_.id().empty()) | 955 const { |
956 if (current_input_method.id().empty()) | |
780 return InputMethodUtil::GetFallbackInputMethodDescriptor(); | 957 return InputMethodUtil::GetFallbackInputMethodDescriptor(); |
781 | 958 |
782 return current_input_method_; | 959 return current_input_method; |
783 } | 960 } |
784 | 961 |
785 bool InputMethodManagerImpl::IsISOLevel5ShiftUsedByCurrentInputMethod() const { | 962 bool InputMethodManagerImpl::IsISOLevel5ShiftUsedByCurrentInputMethod() const { |
786 return keyboard_->IsISOLevel5ShiftAvailable(); | 963 return keyboard_->IsISOLevel5ShiftAvailable(); |
787 } | 964 } |
788 | 965 |
789 bool InputMethodManagerImpl::IsAltGrUsedByCurrentInputMethod() const { | 966 bool InputMethodManagerImpl::IsAltGrUsedByCurrentInputMethod() const { |
790 return keyboard_->IsAltGrAvailable(); | 967 return keyboard_->IsAltGrAvailable(); |
791 } | 968 } |
792 | 969 |
793 ImeKeyboard* InputMethodManagerImpl::GetImeKeyboard() { | 970 ImeKeyboard* InputMethodManagerImpl::GetImeKeyboard() { |
794 return keyboard_.get(); | 971 return keyboard_.get(); |
795 } | 972 } |
796 | 973 |
797 InputMethodUtil* InputMethodManagerImpl::GetInputMethodUtil() { | 974 InputMethodUtil* InputMethodManagerImpl::GetInputMethodUtil() { |
798 return &util_; | 975 return &util_; |
799 } | 976 } |
800 | 977 |
801 ComponentExtensionIMEManager* | 978 ComponentExtensionIMEManager* |
802 InputMethodManagerImpl::GetComponentExtensionIMEManager() { | 979 InputMethodManagerImpl::GetComponentExtensionIMEManager() { |
803 return component_extension_ime_manager_.get(); | 980 return component_extension_ime_manager_.get(); |
804 } | 981 } |
805 | 982 |
983 scoped_refptr<InputMethodManager::State> InputMethodManagerImpl::CreateNewState( | |
984 Profile* profile) { | |
985 return scoped_refptr<InputMethodManager::State>(new StateImpl(this, profile)); | |
986 } | |
987 | |
806 void InputMethodManagerImpl::SetCandidateWindowControllerForTesting( | 988 void InputMethodManagerImpl::SetCandidateWindowControllerForTesting( |
807 CandidateWindowController* candidate_window_controller) { | 989 CandidateWindowController* candidate_window_controller) { |
808 candidate_window_controller_.reset(candidate_window_controller); | 990 candidate_window_controller_.reset(candidate_window_controller); |
809 candidate_window_controller_->AddObserver(this); | 991 candidate_window_controller_->AddObserver(this); |
810 } | 992 } |
811 | 993 |
812 void InputMethodManagerImpl::SetImeKeyboardForTesting(ImeKeyboard* keyboard) { | 994 void InputMethodManagerImpl::SetImeKeyboardForTesting(ImeKeyboard* keyboard) { |
813 keyboard_.reset(keyboard); | 995 keyboard_.reset(keyboard); |
814 } | 996 } |
815 | 997 |
(...skipping 16 matching lines...) Expand all Loading... | |
832 candidate_window_observers_, | 1014 candidate_window_observers_, |
833 CandidateWindowOpened(this)); | 1015 CandidateWindowOpened(this)); |
834 } | 1016 } |
835 | 1017 |
836 void InputMethodManagerImpl::CandidateWindowClosed() { | 1018 void InputMethodManagerImpl::CandidateWindowClosed() { |
837 FOR_EACH_OBSERVER(InputMethodManager::CandidateWindowObserver, | 1019 FOR_EACH_OBSERVER(InputMethodManager::CandidateWindowObserver, |
838 candidate_window_observers_, | 1020 candidate_window_observers_, |
839 CandidateWindowClosed(this)); | 1021 CandidateWindowClosed(this)); |
840 } | 1022 } |
841 | 1023 |
842 void InputMethodManagerImpl::OnScreenLocked() { | 1024 bool InputMethodManagerImpl::StateImpl::InputMethodIsActivated( |
843 saved_previous_input_method_ = previous_input_method_; | 1025 const std::string& input_method_id) const { |
844 saved_current_input_method_ = current_input_method_; | 1026 return Contains(active_input_method_ids, input_method_id); |
845 saved_active_input_method_ids_ = active_input_method_ids_; | |
846 | |
847 std::set<std::string> added_ids_; | |
848 | |
849 const std::vector<std::string>& hardware_keyboard_ids = | |
850 util_.GetHardwareLoginInputMethodIds(); | |
851 | |
852 active_input_method_ids_.clear(); | |
853 for (size_t i = 0; i < saved_active_input_method_ids_.size(); ++i) { | |
854 const std::string& input_method_id = saved_active_input_method_ids_[i]; | |
855 // Skip if it's not a keyboard layout. Drop input methods including | |
856 // extension ones. | |
857 if (!IsLoginKeyboard(input_method_id) || | |
858 added_ids_.find(input_method_id) != added_ids_.end()) | |
859 continue; | |
860 active_input_method_ids_.push_back(input_method_id); | |
861 added_ids_.insert(input_method_id); | |
862 } | |
863 | |
864 // We'll add the hardware keyboard if it's not included in | |
865 // |active_input_method_ids_| so that the user can always use the hardware | |
866 // keyboard on the screen locker. | |
867 for (size_t i = 0; i < hardware_keyboard_ids.size(); ++i) { | |
868 if (added_ids_.find(hardware_keyboard_ids[i]) == added_ids_.end()) { | |
869 active_input_method_ids_.push_back(hardware_keyboard_ids[i]); | |
870 added_ids_.insert(hardware_keyboard_ids[i]); | |
871 } | |
872 } | |
873 | |
874 ChangeInputMethod(current_input_method_.id()); | |
875 } | |
876 | |
877 void InputMethodManagerImpl::OnScreenUnlocked() { | |
878 previous_input_method_ = saved_previous_input_method_; | |
879 current_input_method_ = saved_current_input_method_; | |
880 active_input_method_ids_ = saved_active_input_method_ids_; | |
881 | |
882 ChangeInputMethod(current_input_method_.id()); | |
883 } | |
884 | |
885 bool InputMethodManagerImpl::InputMethodIsActivated( | |
886 const std::string& input_method_id) { | |
887 return Contains(active_input_method_ids_, input_method_id); | |
888 } | 1027 } |
889 | 1028 |
890 void InputMethodManagerImpl::MaybeInitializeCandidateWindowController() { | 1029 void InputMethodManagerImpl::MaybeInitializeCandidateWindowController() { |
891 if (candidate_window_controller_.get()) | 1030 if (candidate_window_controller_.get()) |
892 return; | 1031 return; |
893 | 1032 |
894 candidate_window_controller_.reset( | 1033 candidate_window_controller_.reset( |
895 CandidateWindowController::CreateCandidateWindowController()); | 1034 CandidateWindowController::CreateCandidateWindowController()); |
896 candidate_window_controller_->AddObserver(this); | 1035 candidate_window_controller_->AddObserver(this); |
897 } | 1036 } |
898 | 1037 |
899 } // namespace input_method | 1038 } // namespace input_method |
900 } // namespace chromeos | 1039 } // namespace chromeos |
OLD | NEW |