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