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