diff options
Diffstat (limited to 'chrome/browser/chromeos/accessibility/accessibility_manager.cc')
-rw-r--r-- | chrome/browser/chromeos/accessibility/accessibility_manager.cc | 59 |
1 files changed, 54 insertions, 5 deletions
diff --git a/chrome/browser/chromeos/accessibility/accessibility_manager.cc b/chrome/browser/chromeos/accessibility/accessibility_manager.cc index 58a9d6f..8f65061 100644 --- a/chrome/browser/chromeos/accessibility/accessibility_manager.cc +++ b/chrome/browser/chromeos/accessibility/accessibility_manager.cc @@ -18,6 +18,8 @@ #include "base/path_service.h" #include "base/prefs/pref_member.h" #include "base/prefs/pref_service.h" +#include "base/strings/string_split.h" +#include "base/strings/string_util.h" #include "base/time/time.h" #include "base/values.h" #include "chrome/browser/accessibility/accessibility_extension_api.h" @@ -39,6 +41,7 @@ #include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h" #include "chrome/common/pref_names.h" #include "chromeos/audio/chromeos_sounds.h" +#include "chromeos/ime/input_method_manager.h" #include "chromeos/login/login_state.h" #include "content/public/browser/browser_accessibility_state.h" #include "content/public/browser/browser_thread.h" @@ -66,6 +69,7 @@ using content::BrowserThread; using content::RenderViewHost; using extensions::api::braille_display_private::BrailleController; using extensions::api::braille_display_private::DisplayState; +using extensions::api::braille_display_private::KeyEvent; namespace chromeos { @@ -310,7 +314,8 @@ AccessibilityManager::AccessibilityManager() should_speak_chrome_vox_announcements_on_user_screen_(true), system_sounds_enabled_(false), braille_display_connected_(false), - scoped_braille_observer_(this) { + scoped_braille_observer_(this), + braille_ime_current_(false) { notification_registrar_.Add(this, chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, content::NotificationService::AllSources()); @@ -511,6 +516,7 @@ void AccessibilityManager::UpdateSpokenFeedbackFromPref() { } else { UnloadChromeVox(); } + UpdateBrailleImeState(); } void AccessibilityManager::LoadChromeVox() { @@ -764,7 +770,33 @@ void AccessibilityManager::CheckBrailleState() { void AccessibilityManager::ReceiveBrailleDisplayState( scoped_ptr<extensions::api::braille_display_private::DisplayState> state) { - OnDisplayStateChanged(*state); + OnBrailleDisplayStateChanged(*state); +} + +void AccessibilityManager::UpdateBrailleImeState() { + if (!profile_) + return; + PrefService* pref_service = profile_->GetPrefs(); + std::vector<std::string> preload_engines; + base::SplitString(pref_service->GetString(prefs::kLanguagePreloadEngines), + ',', + &preload_engines); + std::vector<std::string>::iterator it = + std::find(preload_engines.begin(), + preload_engines.end(), + extension_misc::kBrailleImeEngineId); + bool is_enabled = (it != preload_engines.end()); + bool should_be_enabled = + (spoken_feedback_enabled_ && braille_display_connected_); + if (is_enabled == should_be_enabled) + return; + if (should_be_enabled) + preload_engines.push_back(extension_misc::kBrailleImeEngineId); + else + preload_engines.erase(it); + pref_service->SetString(prefs::kLanguagePreloadEngines, + JoinString(preload_engines, ',')); + braille_ime_current_ = false; } // Overridden from InputMethodManager::Observer. @@ -777,6 +809,10 @@ void AccessibilityManager::InputMethodChanged( manager->IsISOLevel5ShiftUsedByCurrentInputMethod(), manager->IsAltGrUsedByCurrentInputMethod()); #endif + const chromeos::input_method::InputMethodDescriptor descriptor = + manager->GetCurrentInputMethod(); + braille_ime_current_ = + (descriptor.id() == extension_misc::kBrailleImeEngineId); } void AccessibilityManager::SetProfile(Profile* profile) { @@ -841,7 +877,8 @@ void AccessibilityManager::SetProfile(Profile* profile) { if (!had_profile && profile) CheckBrailleState(); - + else + UpdateBrailleImeState(); UpdateLargeCursorFromPref(); UpdateStickyKeysFromPref(); UpdateSpokenFeedbackFromPref(); @@ -982,11 +1019,13 @@ void AccessibilityManager::Observe( } } -void AccessibilityManager::OnDisplayStateChanged( +void AccessibilityManager::OnBrailleDisplayStateChanged( const DisplayState& display_state) { braille_display_connected_ = display_state.available; - if (braille_display_connected_) + if (braille_display_connected_) { EnableSpokenFeedback(true, ash::A11Y_NOTIFICATION_SHOW); + } + UpdateBrailleImeState(); AccessibilityStatusEventDetails details( ACCESSIBILITY_BRAILLE_DISPLAY_CONNECTION_STATE_CHANGED, @@ -995,6 +1034,16 @@ void AccessibilityManager::OnDisplayStateChanged( NotifyAccessibilityStatusChanged(details); } +void AccessibilityManager::OnBrailleKeyEvent(const KeyEvent& event) { + // Ensure the braille IME is active on braille keyboard (dots) input. + if ((event.command == + extensions::api::braille_display_private::KEY_COMMAND_DOTS) && + !braille_ime_current_) { + input_method::InputMethodManager::Get()->ChangeInputMethod( + extension_misc::kBrailleImeEngineId); + } +} + void AccessibilityManager::PostLoadChromeVox(Profile* profile) { // Do any setup work needed immediately after ChromeVox actually loads. if (system_sounds_enabled_) |