• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
22 namespace chromeos {
23 
24 scoped_ptr<views::Accelerator> WizardAccessibilityHelper::accelerator_;
25 
26 // static
GetAccelerator()27 views::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
GetInstance()35 WizardAccessibilityHelper* WizardAccessibilityHelper::GetInstance() {
36   return Singleton<WizardAccessibilityHelper>::get();
37 }
38 
WizardAccessibilityHelper()39 WizardAccessibilityHelper::WizardAccessibilityHelper() {
40   accessibility_handler_.reset(new WizardAccessibilityHandler());
41   profile_ = ProfileManager::GetDefaultProfile();
42   registered_notifications_ = false;
43 }
44 
Init()45 void 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 
RegisterNotifications()56 void 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 
UnregisterNotifications()75 void WizardAccessibilityHelper::UnregisterNotifications() {
76   if (!registered_notifications_)
77     return;
78   registrar_.RemoveAll();
79   registered_notifications_ = false;
80 }
81 
IsAccessibilityEnabled()82 bool WizardAccessibilityHelper::IsAccessibilityEnabled() {
83   return g_browser_process &&
84       g_browser_process->local_state()->GetBoolean(
85       prefs::kAccessibilityEnabled);
86 }
87 
MaybeSpeak(const char * str,bool queue,bool interruptible)88 void WizardAccessibilityHelper::MaybeSpeak(const char* str, bool queue,
89     bool interruptible) {
90   if (IsAccessibilityEnabled()) {
91     accessibility_handler_->Speak(str, queue, interruptible);
92   }
93 }
94 
ToggleAccessibility()95 void 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 
SetAccessibilityEnabled(bool enabled)108 void 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