summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos/accessibility/accessibility_manager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/chromeos/accessibility/accessibility_manager.cc')
-rw-r--r--chrome/browser/chromeos/accessibility/accessibility_manager.cc59
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_)