assistant_controller_impl.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. // Copyright 2018 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. #ifndef ASH_ASSISTANT_ASSISTANT_CONTROLLER_IMPL_H_
  5. #define ASH_ASSISTANT_ASSISTANT_CONTROLLER_IMPL_H_
  6. #include <map>
  7. #include <memory>
  8. #include <string>
  9. #include <vector>
  10. #include "ash/accessibility/accessibility_observer.h"
  11. #include "ash/ash_export.h"
  12. #include "ash/assistant/assistant_alarm_timer_controller_impl.h"
  13. #include "ash/assistant/assistant_interaction_controller_impl.h"
  14. #include "ash/assistant/assistant_notification_controller_impl.h"
  15. #include "ash/assistant/assistant_screen_context_controller_impl.h"
  16. #include "ash/assistant/assistant_setup_controller.h"
  17. #include "ash/assistant/assistant_state_controller.h"
  18. #include "ash/assistant/assistant_suggestions_controller_impl.h"
  19. #include "ash/assistant/assistant_ui_controller_impl.h"
  20. #include "ash/assistant/assistant_view_delegate_impl.h"
  21. #include "ash/assistant/assistant_web_ui_controller.h"
  22. #include "ash/assistant/ui/assistant_view_delegate.h"
  23. #include "ash/public/cpp/assistant/assistant_interface_binder.h"
  24. #include "ash/public/cpp/assistant/controller/assistant_controller.h"
  25. #include "ash/public/cpp/assistant/controller/assistant_controller_observer.h"
  26. #include "ash/public/cpp/image_downloader.h"
  27. #include "ash/public/cpp/style/color_mode_observer.h"
  28. #include "ash/public/mojom/assistant_volume_control.mojom.h"
  29. #include "ash/style/dark_light_mode_controller_impl.h"
  30. #include "base/memory/weak_ptr.h"
  31. #include "base/observer_list.h"
  32. #include "base/scoped_observation.h"
  33. #include "chromeos/ash/components/audio/cras_audio_handler.h"
  34. #include "chromeos/ash/services/assistant/public/cpp/assistant_service.h"
  35. #include "components/prefs/pref_service.h"
  36. #include "mojo/public/cpp/bindings/pending_receiver.h"
  37. #include "mojo/public/cpp/bindings/pending_remote.h"
  38. #include "mojo/public/cpp/bindings/receiver.h"
  39. #include "mojo/public/cpp/bindings/receiver_set.h"
  40. #include "mojo/public/cpp/bindings/remote.h"
  41. #include "mojo/public/cpp/bindings/remote_set.h"
  42. class PrefRegistrySimple;
  43. namespace ash {
  44. class ASH_EXPORT AssistantControllerImpl
  45. : public AssistantController,
  46. public AssistantControllerObserver,
  47. public AssistantStateObserver,
  48. public mojom::AssistantVolumeControl,
  49. public CrasAudioHandler::AudioObserver,
  50. public AccessibilityObserver,
  51. public AssistantInterfaceBinder,
  52. public ColorModeObserver {
  53. public:
  54. AssistantControllerImpl();
  55. AssistantControllerImpl(const AssistantControllerImpl&) = delete;
  56. AssistantControllerImpl& operator=(const AssistantControllerImpl&) = delete;
  57. ~AssistantControllerImpl() override;
  58. static void RegisterProfilePrefs(PrefRegistrySimple* registry);
  59. void BindReceiver(
  60. mojo::PendingReceiver<mojom::AssistantVolumeControl> receiver);
  61. // Downloads the image found at the specified |url|. On completion, the
  62. // supplied |callback| will be run with the downloaded image. If the download
  63. // attempt is unsuccessful, a NULL image is returned.
  64. void DownloadImage(const GURL& url,
  65. ImageDownloader::DownloadCallback callback);
  66. // AssistantController:
  67. void AddObserver(AssistantControllerObserver* observer) override;
  68. void RemoveObserver(AssistantControllerObserver* observer) override;
  69. void OpenAssistantSettings() override;
  70. void OpenUrl(const GURL& url, bool in_background, bool from_server) override;
  71. base::WeakPtr<ash::AssistantController> GetWeakPtr() override;
  72. void SetAssistant(assistant::Assistant* assistant) override;
  73. void StartSpeakerIdEnrollmentFlow() override;
  74. void SendAssistantFeedback(bool assistant_debug_info_allowed,
  75. const std::string& feedback_description,
  76. const std::string& screenshot_png) override;
  77. // AssistantControllerObserver:
  78. void OnDeepLinkReceived(
  79. assistant::util::DeepLinkType type,
  80. const std::map<std::string, std::string>& params) override;
  81. // mojom::VolumeControl:
  82. void SetVolume(int volume, bool user_initiated) override;
  83. void SetMuted(bool muted) override;
  84. void AddVolumeObserver(
  85. mojo::PendingRemote<mojom::VolumeObserver> observer) override;
  86. // CrasAudioHandler::AudioObserver:
  87. void OnOutputMuteChanged(bool mute_on) override;
  88. void OnOutputNodeVolumeChanged(uint64_t node, int volume) override;
  89. // AccessibilityObserver:
  90. void OnAccessibilityStatusChanged() override;
  91. // ColorModeObserver:
  92. void OnColorModeChanged(bool dark_mode_enabled) override;
  93. AssistantAlarmTimerControllerImpl* alarm_timer_controller() {
  94. return &assistant_alarm_timer_controller_;
  95. }
  96. AssistantNotificationControllerImpl* notification_controller() {
  97. return &assistant_notification_controller_;
  98. }
  99. AssistantScreenContextControllerImpl* screen_context_controller() {
  100. return &assistant_screen_context_controller_;
  101. }
  102. AssistantSetupController* setup_controller() {
  103. return &assistant_setup_controller_;
  104. }
  105. AssistantWebUiController* web_ui_controller() {
  106. return &assistant_web_ui_controller_;
  107. }
  108. AssistantViewDelegate* view_delegate() { return &view_delegate_; }
  109. bool IsAssistantReady() const;
  110. private:
  111. void NotifyConstructed();
  112. void NotifyDestroying();
  113. void NotifyDeepLinkReceived(const GURL& deep_link);
  114. void NotifyOpeningUrl(const GURL& url, bool in_background, bool from_server);
  115. void NotifyUrlOpened(const GURL& url, bool from_server);
  116. // AssistantStateObserver:
  117. void OnAssistantStatusChanged(assistant::AssistantStatus status) override;
  118. void OnLockedFullScreenStateChanged(bool enabled) override;
  119. // AssistantInterfaceBinder implementation:
  120. void BindVolumeControl(
  121. mojo::PendingReceiver<mojom::AssistantVolumeControl> receiver) override;
  122. // The observer list should be initialized early so that sub-controllers may
  123. // register as observers during their construction.
  124. base::ObserverList<AssistantControllerObserver> observers_;
  125. mojo::Receiver<mojom::AssistantVolumeControl>
  126. assistant_volume_control_receiver_{this};
  127. mojo::RemoteSet<mojom::VolumeObserver> volume_observers_;
  128. // |assistant_| can be nullptr if libassistant creation is not yet completed,
  129. // i.e. it cannot take a request.
  130. assistant::Assistant* assistant_ = nullptr;
  131. // Assistant sub-controllers.
  132. AssistantAlarmTimerControllerImpl assistant_alarm_timer_controller_{this};
  133. AssistantInteractionControllerImpl assistant_interaction_controller_{this};
  134. AssistantNotificationControllerImpl assistant_notification_controller_;
  135. AssistantStateController assistant_state_controller_;
  136. AssistantScreenContextControllerImpl assistant_screen_context_controller_;
  137. AssistantSetupController assistant_setup_controller_{this};
  138. AssistantSuggestionsControllerImpl assistant_suggestions_controller_;
  139. AssistantUiControllerImpl assistant_ui_controller_{this};
  140. AssistantWebUiController assistant_web_ui_controller_;
  141. AssistantViewDelegateImpl view_delegate_{this};
  142. base::ScopedObservation<DarkLightModeControllerImpl, ColorModeObserver>
  143. color_mode_observer_{this};
  144. base::WeakPtrFactory<AssistantControllerImpl> weak_factory_{this};
  145. };
  146. } // namespace ash
  147. #endif // ASH_ASSISTANT_ASSISTANT_CONTROLLER_IMPL_H_