15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ash/ash_touch_exploration_manager_chromeos.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ash/accessibility_delegate.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ash/audio/sounds.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ash/root_window_controller.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ash/shell.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/command_line.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chromeos/audio/chromeos_sounds.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chromeos/audio/cras_audio_handler.h"
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/chromeos/touch_exploration_controller.h"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace ash {
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)AshTouchExplorationManager::AshTouchExplorationManager(
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    RootWindowController* root_window_controller)
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : root_window_controller_(root_window_controller),
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      audio_handler_(chromeos::CrasAudioHandler::Get()) {
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Shell::GetInstance()->system_tray_notifier()->AddAccessibilityObserver(this);
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  UpdateTouchExplorationState();
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)AshTouchExplorationManager::~AshTouchExplorationManager() {
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SystemTrayNotifier* system_tray_notifier =
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      Shell::GetInstance()->system_tray_notifier();
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (system_tray_notifier)
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    system_tray_notifier->RemoveAccessibilityObserver(this);
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void AshTouchExplorationManager::OnAccessibilityModeChanged(
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    AccessibilityNotificationVisibility notify) {
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  UpdateTouchExplorationState();
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void AshTouchExplorationManager::SetOutputLevel(int volume) {
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (volume > 0) {
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (audio_handler_->IsOutputMuted()) {
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      audio_handler_->SetOutputMute(false);
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  audio_handler_->SetOutputVolumePercent(volume);
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Avoid negative volume.
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (audio_handler_->IsOutputVolumeBelowDefaultMuteLevel())
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    audio_handler_->SetOutputMute(true);
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void AshTouchExplorationManager::SilenceSpokenFeedback() {
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  AccessibilityDelegate* delegate =
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    Shell::GetInstance()->accessibility_delegate();
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!delegate->IsSpokenFeedbackEnabled())
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  delegate->SilenceSpokenFeedback();
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void AshTouchExplorationManager::PlayVolumeAdjustEarcon() {
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!VolumeAdjustSoundEnabled())
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!audio_handler_->IsOutputMuted() &&
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      audio_handler_->GetOutputVolumePercent() != 100)
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    PlaySystemSoundIfSpokenFeedback(chromeos::SOUND_VOLUME_ADJUST);
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void AshTouchExplorationManager::PlayPassthroughEarcon() {
696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Shell::GetInstance()->accessibility_delegate()->PlayEarcon(
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      chromeos::SOUND_PASSTHROUGH);
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void AshTouchExplorationManager::PlayExitScreenEarcon() {
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Shell::GetInstance()->accessibility_delegate()->PlayEarcon(
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      chromeos::SOUND_EXIT_SCREEN);
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void AshTouchExplorationManager::PlayEnterScreenEarcon() {
796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Shell::GetInstance()->accessibility_delegate()->PlayEarcon(
806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      chromeos::SOUND_ENTER_SCREEN);
816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void AshTouchExplorationManager::UpdateTouchExplorationState() {
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AccessibilityDelegate* delegate =
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      Shell::GetInstance()->accessibility_delegate();
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool enabled = delegate->IsSpokenFeedbackEnabled();
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (enabled && !touch_exploration_controller_.get()) {
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    touch_exploration_controller_.reset(new ui::TouchExplorationController(
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        root_window_controller_->GetRootWindow(), this));
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  } else if (!enabled) {
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    touch_exploration_controller_.reset();
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool AshTouchExplorationManager::VolumeAdjustSoundEnabled() {
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return !CommandLine::ForCurrentProcess()->HasSwitch(
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      chromeos::switches::kDisableVolumeAdjustSound);
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace ash
102