display_service_provider.cc 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/dbus/display_service_provider.h"
  5. #include <utility>
  6. #include "ash/shell.h"
  7. #include "ash/wm/screen_dimmer.h"
  8. #include "base/bind.h"
  9. #include "base/callback.h"
  10. #include "dbus/message.h"
  11. #include "third_party/cros_system_api/dbus/service_constants.h"
  12. #include "ui/base/user_activity/user_activity_detector.h"
  13. #include "ui/display/manager/display_configurator.h"
  14. namespace ash {
  15. namespace {
  16. void OnDisplayOwnershipChanged(
  17. dbus::ExportedObject::ResponseSender response_sender,
  18. std::unique_ptr<dbus::Response> response,
  19. bool status) {
  20. dbus::MessageWriter writer(response.get());
  21. writer.AppendBool(status);
  22. std::move(response_sender).Run(std::move(response));
  23. }
  24. } // namespace
  25. class DisplayServiceProvider::Impl {
  26. public:
  27. Impl() = default;
  28. Impl(const Impl&) = delete;
  29. Impl& operator=(const Impl&) = delete;
  30. ~Impl() = default;
  31. void SetDimming(bool dimmed);
  32. void TakeDisplayOwnership(base::OnceCallback<void(bool)> callback);
  33. void ReleaseDisplayOwnership(base::OnceCallback<void(bool)> callback);
  34. private:
  35. std::unique_ptr<ScreenDimmer> screen_dimmer_;
  36. };
  37. void DisplayServiceProvider::Impl::SetDimming(bool dimmed) {
  38. if (!screen_dimmer_) {
  39. screen_dimmer_ =
  40. std::make_unique<ScreenDimmer>(ScreenDimmer::Container::ROOT);
  41. }
  42. screen_dimmer_->SetDimming(dimmed);
  43. }
  44. void DisplayServiceProvider::Impl::TakeDisplayOwnership(
  45. base::OnceCallback<void(bool)> callback) {
  46. if (!Shell::Get()->display_configurator()) {
  47. LOG(ERROR) << "Display Controller not connected";
  48. std::move(callback).Run(false);
  49. return;
  50. }
  51. Shell::Get()->display_configurator()->TakeControl(std::move(callback));
  52. }
  53. void DisplayServiceProvider::Impl::ReleaseDisplayOwnership(
  54. base::OnceCallback<void(bool)> callback) {
  55. if (!Shell::Get()->display_configurator()) {
  56. LOG(ERROR) << "Display Controller not connected";
  57. std::move(callback).Run(false);
  58. return;
  59. }
  60. Shell::Get()->display_configurator()->RelinquishControl(std::move(callback));
  61. }
  62. DisplayServiceProvider::DisplayServiceProvider()
  63. : impl_(std::make_unique<Impl>()) {}
  64. DisplayServiceProvider::~DisplayServiceProvider() = default;
  65. void DisplayServiceProvider::Start(
  66. scoped_refptr<dbus::ExportedObject> exported_object) {
  67. exported_object->ExportMethod(
  68. chromeos::kDisplayServiceInterface,
  69. chromeos::kDisplayServiceSetPowerMethod,
  70. base::BindRepeating(&DisplayServiceProvider::SetDisplayPower,
  71. weak_ptr_factory_.GetWeakPtr()),
  72. base::BindOnce(&DisplayServiceProvider::OnExported,
  73. weak_ptr_factory_.GetWeakPtr()));
  74. exported_object->ExportMethod(
  75. chromeos::kDisplayServiceInterface,
  76. chromeos::kDisplayServiceSetSoftwareDimmingMethod,
  77. base::BindRepeating(&DisplayServiceProvider::SetDisplaySoftwareDimming,
  78. weak_ptr_factory_.GetWeakPtr()),
  79. base::BindOnce(&DisplayServiceProvider::OnExported,
  80. weak_ptr_factory_.GetWeakPtr()));
  81. exported_object->ExportMethod(
  82. chromeos::kDisplayServiceInterface,
  83. chromeos::kDisplayServiceTakeOwnershipMethod,
  84. base::BindRepeating(&DisplayServiceProvider::TakeDisplayOwnership,
  85. weak_ptr_factory_.GetWeakPtr()),
  86. base::BindOnce(&DisplayServiceProvider::OnExported,
  87. weak_ptr_factory_.GetWeakPtr()));
  88. exported_object->ExportMethod(
  89. chromeos::kDisplayServiceInterface,
  90. chromeos::kDisplayServiceReleaseOwnershipMethod,
  91. base::BindRepeating(&DisplayServiceProvider::ReleaseDisplayOwnership,
  92. weak_ptr_factory_.GetWeakPtr()),
  93. base::BindOnce(&DisplayServiceProvider::OnExported,
  94. weak_ptr_factory_.GetWeakPtr()));
  95. }
  96. void DisplayServiceProvider::SetDisplayPower(
  97. dbus::MethodCall* method_call,
  98. dbus::ExportedObject::ResponseSender response_sender) {
  99. dbus::MessageReader reader(method_call);
  100. int int_state = 0;
  101. if (!reader.PopInt32(&int_state)) {
  102. LOG(ERROR) << "Unable to parse request: "
  103. << chromeos::kDisplayServiceSetPowerMethod;
  104. std::move(response_sender).Run(dbus::Response::FromMethodCall(method_call));
  105. return;
  106. }
  107. // Turning displays off when the device becomes idle or on just before
  108. // we suspend may trigger a mouse move, which would then be incorrectly
  109. // reported as user activity. Let the UserActivityDetector
  110. // know so that it can ignore such events.
  111. ui::UserActivityDetector::Get()->OnDisplayPowerChanging();
  112. Shell::Get()->display_configurator()->SetDisplayPower(
  113. static_cast<chromeos::DisplayPowerState>(int_state),
  114. display::DisplayConfigurator::kSetDisplayPowerNoFlags,
  115. base::BindOnce(
  116. [](dbus::MethodCall* method_call,
  117. dbus::ExportedObject::ResponseSender response_sender,
  118. bool /*status*/) {
  119. std::move(response_sender)
  120. .Run(dbus::Response::FromMethodCall(method_call));
  121. },
  122. method_call, std::move(response_sender)));
  123. }
  124. void DisplayServiceProvider::SetDisplaySoftwareDimming(
  125. dbus::MethodCall* method_call,
  126. dbus::ExportedObject::ResponseSender response_sender) {
  127. dbus::MessageReader reader(method_call);
  128. bool dimmed = false;
  129. if (reader.PopBool(&dimmed)) {
  130. impl_->SetDimming(dimmed);
  131. } else {
  132. LOG(ERROR) << "Unable to parse request: "
  133. << chromeos::kDisplayServiceSetSoftwareDimmingMethod;
  134. }
  135. std::move(response_sender).Run(dbus::Response::FromMethodCall(method_call));
  136. }
  137. void DisplayServiceProvider::TakeDisplayOwnership(
  138. dbus::MethodCall* method_call,
  139. dbus::ExportedObject::ResponseSender response_sender) {
  140. impl_->TakeDisplayOwnership(
  141. base::BindOnce(&OnDisplayOwnershipChanged, std::move(response_sender),
  142. dbus::Response::FromMethodCall(method_call)));
  143. }
  144. void DisplayServiceProvider::ReleaseDisplayOwnership(
  145. dbus::MethodCall* method_call,
  146. dbus::ExportedObject::ResponseSender response_sender) {
  147. impl_->ReleaseDisplayOwnership(
  148. base::BindOnce(&OnDisplayOwnershipChanged, std::move(response_sender),
  149. dbus::Response::FromMethodCall(method_call)));
  150. }
  151. void DisplayServiceProvider::OnExported(const std::string& interface_name,
  152. const std::string& method_name,
  153. bool success) {
  154. if (!success)
  155. LOG(ERROR) << "Failed to export " << interface_name << "." << method_name;
  156. }
  157. } // namespace ash