| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ash/display/projecting_observer.h" |
| |
| #include "ash/shell.h" |
| #include "base/logging.h" |
| #include "chromeos/dbus/dbus_thread_manager.h" |
| #include "chromeos/dbus/power_manager_client.h" |
| #include "ui/display/types/display_snapshot.h" |
| |
| namespace ash { |
| |
| ProjectingObserver::ProjectingObserver( |
| display::DisplayConfigurator* display_configurator) |
| : display_configurator_(display_configurator) { |
| if (Shell::HasInstance()) |
| Shell::Get()->AddShellObserver(this); |
| if (display_configurator_) |
| display_configurator_->AddObserver(this); |
| } |
| |
| ProjectingObserver::~ProjectingObserver() { |
| if (Shell::HasInstance()) |
| Shell::Get()->RemoveShellObserver(this); |
| if (display_configurator_) |
| display_configurator_->RemoveObserver(this); |
| } |
| |
| void ProjectingObserver::OnDisplayModeChanged( |
| const display::DisplayConfigurator::DisplayStateList& display_states) { |
| has_internal_output_ = false; |
| output_count_ = display_states.size(); |
| |
| for (size_t i = 0; i < display_states.size(); ++i) { |
| if (display_states[i]->type() == |
| display::DISPLAY_CONNECTION_TYPE_INTERNAL) { |
| has_internal_output_ = true; |
| break; |
| } |
| } |
| |
| SetIsProjecting(); |
| } |
| |
| void ProjectingObserver::OnCastingSessionStartedOrStopped(bool started) { |
| if (started) { |
| ++casting_session_count_; |
| } else { |
| DCHECK_GT(casting_session_count_, 0); |
| --casting_session_count_; |
| if (casting_session_count_ < 0) |
| casting_session_count_ = 0; |
| } |
| |
| SetIsProjecting(); |
| } |
| |
| void ProjectingObserver::SetIsProjecting() { |
| // "Projecting" is defined as having more than 1 output connected while at |
| // least one of them is an internal output. |
| bool projecting = |
| has_internal_output_ && (output_count_ + casting_session_count_ > 1); |
| |
| chromeos::PowerManagerClient* power_manager_client = |
| power_manager_client_for_test_ |
| ? power_manager_client_for_test_ |
| : chromeos::DBusThreadManager::Get()->GetPowerManagerClient(); |
| if (power_manager_client) |
| power_manager_client->SetIsProjecting(projecting); |
| } |
| |
| } // namespace ash |