ash_touch_exploration_manager_chromeos.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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::PlayVolumeAdjustSound() {
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!VolumeAdjustSoundEnabled())
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if ((!audio_handler_->IsOutputMuted()) ||
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      !(audio_handler_->GetOutputVolumePercent() == 100))
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PlaySystemSoundIfSpokenFeedback(chromeos::SOUND_VOLUME_ADJUST);
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void AshTouchExplorationManager::SetOutputLevel(int volume) {
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (volume > 0) {
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (audio_handler_->IsOutputMuted()) {
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      audio_handler_->SetOutputMute(false);
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  audio_handler_->SetOutputVolumePercent(volume);
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Avoid negative volume.
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (audio_handler_->IsOutputVolumeBelowDefaultMuteLevel())
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    audio_handler_->SetOutputMute(true);
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void AshTouchExplorationManager::UpdateTouchExplorationState() {
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AccessibilityDelegate* delegate =
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      Shell::GetInstance()->accessibility_delegate();
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool enabled = delegate->IsSpokenFeedbackEnabled();
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (enabled && !touch_exploration_controller_.get()) {
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    touch_exploration_controller_.reset(new ui::TouchExplorationController(
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        root_window_controller_->GetRootWindow(), this));
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  } else if (!enabled) {
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    touch_exploration_controller_.reset();
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool AshTouchExplorationManager::VolumeAdjustSoundEnabled() {
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return !CommandLine::ForCurrentProcess()->HasSwitch(
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      chromeos::switches::kDisableVolumeAdjustSound);
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace ash
79