12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/dbus/display_power_service_provider.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "dbus/bus.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "dbus/message.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/display/chromeos/display_configurator.h"
13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/wm/core/user_activity_detector.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DisplayPowerServiceProvider::DisplayPowerServiceProvider()
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : weak_ptr_factory_(this) {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DisplayPowerServiceProvider::~DisplayPowerServiceProvider() {}
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DisplayPowerServiceProvider::Start(
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<dbus::ExportedObject> exported_object) {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  exported_object->ExportMethod(
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kLibCrosServiceInterface,
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kSetDisplayPower,
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&DisplayPowerServiceProvider::SetDisplayPower,
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()),
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&DisplayPowerServiceProvider::OnExported,
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()));
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  exported_object->ExportMethod(
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kLibCrosServiceInterface,
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kSetDisplaySoftwareDimming,
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&DisplayPowerServiceProvider::SetDisplaySoftwareDimming,
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()),
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&DisplayPowerServiceProvider::OnExported,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()));
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DisplayPowerServiceProvider::OnExported(const std::string& interface_name,
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             const std::string& method_name,
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             bool success) {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!success) {
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(ERROR) << "Failed to export " << interface_name << "."
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               << method_name;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DisplayPowerServiceProvider::SetDisplayPower(
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dbus::MethodCall* method_call,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dbus::ExportedObject::ResponseSender response_sender) {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dbus::MessageReader reader(method_call);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int int_state = 0;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (reader.PopInt32(&int_state)) {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Turning displays off when the device becomes idle or on just before
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // we suspend may trigger a mouse move, which would then be incorrectly
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // reported as user activity.  Let the UserActivityDetector
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // know so that it can ignore such events.
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ash::Shell::GetInstance()->user_activity_detector()->
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        OnDisplayPowerChanging();
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DisplayPowerState state = static_cast<DisplayPowerState>(int_state);
64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ash::Shell::GetInstance()->display_configurator()->SetDisplayPower(
65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        state, ui::DisplayConfigurator::kSetDisplayPowerNoFlags);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(ERROR) << "Unable to parse " << kSetDisplayPower << " request";
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  response_sender.Run(dbus::Response::FromMethodCall(method_call));
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DisplayPowerServiceProvider::SetDisplaySoftwareDimming(
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dbus::MethodCall* method_call,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dbus::ExportedObject::ResponseSender response_sender) {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dbus::MessageReader reader(method_call);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool dimmed = false;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (reader.PopBool(&dimmed)) {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ash::Shell::GetInstance()->SetDimming(dimmed);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(ERROR) << "Unable to parse " << kSetDisplaySoftwareDimming
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               << " request";
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  response_sender.Run(dbus::Response::FromMethodCall(method_call));
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
88