privacy_screen_service_provider.cc 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Copyright 2021 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/privacy_screen_service_provider.h"
  5. #include "ash/shell.h"
  6. #include "base/bind.h"
  7. #include "base/logging.h"
  8. #include "dbus/bus.h"
  9. #include "dbus/message.h"
  10. #include "third_party/cros_system_api/dbus/service_constants.h"
  11. namespace ash {
  12. namespace {
  13. privacy_screen::PrivacyScreenSetting_PrivacyScreenState
  14. GetPrivacyScreenState() {
  15. auto* privacy_screen_controller = Shell::Get()->privacy_screen_controller();
  16. DCHECK(privacy_screen_controller);
  17. if (!privacy_screen_controller->IsSupported()) {
  18. return privacy_screen::
  19. PrivacyScreenSetting_PrivacyScreenState_NOT_SUPPORTED;
  20. }
  21. if (privacy_screen_controller->GetEnabled())
  22. return privacy_screen::PrivacyScreenSetting_PrivacyScreenState_ENABLED;
  23. return privacy_screen::PrivacyScreenSetting_PrivacyScreenState_DISABLED;
  24. }
  25. } // namespace
  26. PrivacyScreenServiceProvider::PrivacyScreenServiceProvider() = default;
  27. PrivacyScreenServiceProvider::~PrivacyScreenServiceProvider() {
  28. DCHECK(Shell::Get() && Shell::Get()->privacy_screen_controller());
  29. }
  30. void PrivacyScreenServiceProvider::Start(
  31. scoped_refptr<dbus::ExportedObject> exported_object) {
  32. exported_object_ = exported_object;
  33. exported_object_->ExportMethod(
  34. privacy_screen::kPrivacyScreenServiceInterface,
  35. privacy_screen::kPrivacyScreenServiceGetPrivacyScreenSettingMethod,
  36. base::BindRepeating(
  37. &PrivacyScreenServiceProvider::GetPrivacyScreenSetting,
  38. weak_ptr_factory_.GetWeakPtr()),
  39. base::BindOnce(&PrivacyScreenServiceProvider::OnExported,
  40. weak_ptr_factory_.GetWeakPtr()));
  41. auto* privacy_screen_controller = Shell::Get()->privacy_screen_controller();
  42. DCHECK(privacy_screen_controller);
  43. privacy_screen_observation_.Observe(privacy_screen_controller);
  44. }
  45. void PrivacyScreenServiceProvider::OnExported(const std::string& interface_name,
  46. const std::string& method_name,
  47. bool success) {
  48. if (!success)
  49. LOG(ERROR) << "Failed to export " << interface_name << "." << method_name;
  50. }
  51. void PrivacyScreenServiceProvider::GetPrivacyScreenSetting(
  52. dbus::MethodCall* method_call,
  53. dbus::ExportedObject::ResponseSender response_sender) {
  54. state_ = GetPrivacyScreenState();
  55. privacy_screen::PrivacyScreenSetting setting;
  56. setting.set_state(state_);
  57. std::unique_ptr<dbus::Response> response =
  58. dbus::Response::FromMethodCall(method_call);
  59. dbus::MessageWriter writer(response.get());
  60. writer.AppendProtoAsArrayOfBytes(setting);
  61. std::move(response_sender).Run(std::move(response));
  62. }
  63. void PrivacyScreenServiceProvider::OnPrivacyScreenSettingChanged(
  64. bool enabled,
  65. bool notify_ui) {
  66. DCHECK(exported_object_);
  67. const privacy_screen::PrivacyScreenSetting_PrivacyScreenState new_state =
  68. GetPrivacyScreenState();
  69. if (new_state == state_)
  70. return;
  71. state_ = new_state;
  72. privacy_screen::PrivacyScreenSetting setting;
  73. setting.set_state(state_);
  74. dbus::Signal signal(
  75. privacy_screen::kPrivacyScreenServiceInterface,
  76. privacy_screen::kPrivacyScreenServicePrivacyScreenSettingChangedSignal);
  77. dbus::MessageWriter writer(&signal);
  78. dbus::MessageWriter(&signal).AppendProtoAsArrayOfBytes(setting);
  79. exported_object_->SendSignal(&signal);
  80. }
  81. } // namespace ash