1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/login/wizard_accessibility_helper.h" 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/logging.h" 8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/stl_util-inl.h" 9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/browser_process.h" 10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/extensions/extension_accessibility_api.h" 11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/prefs/pref_service.h" 1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile_manager.h" 14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/pref_names.h" 15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_registrar.h" 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_service.h" 1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "grit/generated_resources.h" 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h" 19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/accelerator.h" 20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/view.h" 21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 22731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace chromeos { 23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenscoped_ptr<views::Accelerator> WizardAccessibilityHelper::accelerator_; 25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// static 27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenviews::Accelerator WizardAccessibilityHelper::GetAccelerator() { 28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!WizardAccessibilityHelper::accelerator_.get()) 29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen WizardAccessibilityHelper::accelerator_.reset( 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new views::Accelerator(ui::VKEY_Z, false, true, true)); 31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return *(WizardAccessibilityHelper::accelerator_.get()); 32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// static 35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenWizardAccessibilityHelper* WizardAccessibilityHelper::GetInstance() { 36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return Singleton<WizardAccessibilityHelper>::get(); 37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenWizardAccessibilityHelper::WizardAccessibilityHelper() { 40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen accessibility_handler_.reset(new WizardAccessibilityHandler()); 41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen profile_ = ProfileManager::GetDefaultProfile(); 42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick registered_notifications_ = false; 43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WizardAccessibilityHelper::Init() { 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (IsAccessibilityEnabled()) { 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!registered_notifications_) 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RegisterNotifications(); 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // SetAccessibilityEnabled(true) fully enables accessibility. Init() is 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // necessary during startup when the global accessibility pref is set but 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // the notifications are not registered. 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetAccessibilityEnabled(true); 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid WizardAccessibilityHelper::RegisterNotifications() { 57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(accessibility_handler_.get(), 58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationType::ACCESSIBILITY_CONTROL_FOCUSED, 59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(accessibility_handler_.get(), 61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationType::ACCESSIBILITY_CONTROL_ACTION, 62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(accessibility_handler_.get(), 64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationType::ACCESSIBILITY_TEXT_CHANGED, 65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(accessibility_handler_.get(), 67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationType::ACCESSIBILITY_MENU_OPENED, 68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen registrar_.Add(accessibility_handler_.get(), 70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationType::ACCESSIBILITY_MENU_CLOSED, 71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NotificationService::AllSources()); 72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick registered_notifications_ = true; 73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid WizardAccessibilityHelper::UnregisterNotifications() { 76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!registered_notifications_) 77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick registrar_.RemoveAll(); 79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick registered_notifications_ = false; 80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 8221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool WizardAccessibilityHelper::IsAccessibilityEnabled() { 8321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return g_browser_process && 8421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen g_browser_process->local_state()->GetBoolean( 8521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen prefs::kAccessibilityEnabled); 8621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 8721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid WizardAccessibilityHelper::MaybeSpeak(const char* str, bool queue, 89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool interruptible) { 9021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (IsAccessibilityEnabled()) { 91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen accessibility_handler_->Speak(str, queue, interruptible); 92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid WizardAccessibilityHelper::ToggleAccessibility() { 9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!IsAccessibilityEnabled()) { 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen VLOG(1) << "Enabling accessibility."; 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!registered_notifications_) 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RegisterNotifications(); 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetAccessibilityEnabled(true); 10121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } else { 10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen SetAccessibilityEnabled(false); 10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (registered_notifications_) 10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen UnregisterNotifications(); 10521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 10721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 10821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid WizardAccessibilityHelper::SetAccessibilityEnabled(bool enabled) { 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool doSpeak = (IsAccessibilityEnabled() != enabled); 110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (g_browser_process) { 111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen PrefService* prefService = g_browser_process->local_state(); 11221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen prefService->SetBoolean(prefs::kAccessibilityEnabled, enabled); 11321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen prefService->ScheduleSavePersistentPrefs(); 114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionAccessibilityEventRouter::GetInstance()-> 11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen SetAccessibilityEnabled(enabled); 11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (doSpeak) { 11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen accessibility_handler_->Speak(enabled ? 11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen l10n_util::GetStringUTF8(IDS_CHROMEOS_ACC_ACCESS_ENABLED).c_str() : 12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen l10n_util::GetStringUTF8(IDS_CHROMEOS_ACC_ACCESS_DISABLED).c_str(), 12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen false, true); 122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} // namespace chromeos 126