1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/chromeos/login/wizard_accessibility_helper.h" 6 7#include "base/logging.h" 8#include "base/stl_util-inl.h" 9#include "chrome/browser/browser_process.h" 10#include "chrome/browser/extensions/extension_accessibility_api.h" 11#include "chrome/browser/prefs/pref_service.h" 12#include "chrome/browser/profiles/profile.h" 13#include "chrome/browser/profiles/profile_manager.h" 14#include "chrome/common/pref_names.h" 15#include "content/common/notification_registrar.h" 16#include "content/common/notification_service.h" 17#include "grit/generated_resources.h" 18#include "ui/base/l10n/l10n_util.h" 19#include "views/accelerator.h" 20#include "views/view.h" 21 22namespace chromeos { 23 24scoped_ptr<views::Accelerator> WizardAccessibilityHelper::accelerator_; 25 26// static 27views::Accelerator WizardAccessibilityHelper::GetAccelerator() { 28 if (!WizardAccessibilityHelper::accelerator_.get()) 29 WizardAccessibilityHelper::accelerator_.reset( 30 new views::Accelerator(ui::VKEY_Z, false, true, true)); 31 return *(WizardAccessibilityHelper::accelerator_.get()); 32} 33 34// static 35WizardAccessibilityHelper* WizardAccessibilityHelper::GetInstance() { 36 return Singleton<WizardAccessibilityHelper>::get(); 37} 38 39WizardAccessibilityHelper::WizardAccessibilityHelper() { 40 accessibility_handler_.reset(new WizardAccessibilityHandler()); 41 profile_ = ProfileManager::GetDefaultProfile(); 42 registered_notifications_ = false; 43} 44 45void WizardAccessibilityHelper::Init() { 46 if (IsAccessibilityEnabled()) { 47 if (!registered_notifications_) 48 RegisterNotifications(); 49 // SetAccessibilityEnabled(true) fully enables accessibility. Init() is 50 // necessary during startup when the global accessibility pref is set but 51 // the notifications are not registered. 52 SetAccessibilityEnabled(true); 53 } 54} 55 56void WizardAccessibilityHelper::RegisterNotifications() { 57 registrar_.Add(accessibility_handler_.get(), 58 NotificationType::ACCESSIBILITY_CONTROL_FOCUSED, 59 NotificationService::AllSources()); 60 registrar_.Add(accessibility_handler_.get(), 61 NotificationType::ACCESSIBILITY_CONTROL_ACTION, 62 NotificationService::AllSources()); 63 registrar_.Add(accessibility_handler_.get(), 64 NotificationType::ACCESSIBILITY_TEXT_CHANGED, 65 NotificationService::AllSources()); 66 registrar_.Add(accessibility_handler_.get(), 67 NotificationType::ACCESSIBILITY_MENU_OPENED, 68 NotificationService::AllSources()); 69 registrar_.Add(accessibility_handler_.get(), 70 NotificationType::ACCESSIBILITY_MENU_CLOSED, 71 NotificationService::AllSources()); 72 registered_notifications_ = true; 73} 74 75void WizardAccessibilityHelper::UnregisterNotifications() { 76 if (!registered_notifications_) 77 return; 78 registrar_.RemoveAll(); 79 registered_notifications_ = false; 80} 81 82bool WizardAccessibilityHelper::IsAccessibilityEnabled() { 83 return g_browser_process && 84 g_browser_process->local_state()->GetBoolean( 85 prefs::kAccessibilityEnabled); 86} 87 88void WizardAccessibilityHelper::MaybeSpeak(const char* str, bool queue, 89 bool interruptible) { 90 if (IsAccessibilityEnabled()) { 91 accessibility_handler_->Speak(str, queue, interruptible); 92 } 93} 94 95void WizardAccessibilityHelper::ToggleAccessibility() { 96 if (!IsAccessibilityEnabled()) { 97 VLOG(1) << "Enabling accessibility."; 98 if (!registered_notifications_) 99 RegisterNotifications(); 100 SetAccessibilityEnabled(true); 101 } else { 102 SetAccessibilityEnabled(false); 103 if (registered_notifications_) 104 UnregisterNotifications(); 105 } 106} 107 108void WizardAccessibilityHelper::SetAccessibilityEnabled(bool enabled) { 109 bool doSpeak = (IsAccessibilityEnabled() != enabled); 110 if (g_browser_process) { 111 PrefService* prefService = g_browser_process->local_state(); 112 prefService->SetBoolean(prefs::kAccessibilityEnabled, enabled); 113 prefService->ScheduleSavePersistentPrefs(); 114 } 115 ExtensionAccessibilityEventRouter::GetInstance()-> 116 SetAccessibilityEnabled(enabled); 117 if (doSpeak) { 118 accessibility_handler_->Speak(enabled ? 119 l10n_util::GetStringUTF8(IDS_CHROMEOS_ACC_ACCESS_ENABLED).c_str() : 120 l10n_util::GetStringUTF8(IDS_CHROMEOS_ACC_ACCESS_DISABLED).c_str(), 121 false, true); 122 } 123} 124 125} // namespace chromeos 126