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