1 // Copyright 2017 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 
5 #include "chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.h"
6 
7 #include <utility>
8 
9 #include "ash/public/cpp/assistant/assistant_settings.h"
10 #include "ash/public/cpp/assistant/assistant_setup.h"
11 #include "base/bind.h"
12 #include "base/bind_helpers.h"
13 #include "base/values.h"
14 #include "chrome/browser/profiles/profile.h"
15 #include "chrome/browser/ui/ash/assistant/assistant_service_connection.h"
16 #include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.h"
17 #include "chromeos/audio/cras_audio_handler.h"
18 #include "chromeos/constants/chromeos_features.h"
19 #include "components/arc/arc_prefs.h"
20 #include "components/arc/arc_service_manager.h"
21 #include "content/public/browser/browser_context.h"
22 #include "ui/gfx/geometry/rect.h"
23 
24 namespace chromeos {
25 namespace settings {
26 
GoogleAssistantHandler(Profile * profile)27 GoogleAssistantHandler::GoogleAssistantHandler(Profile* profile)
28     : profile_(profile) {
29   chromeos::CrasAudioHandler::Get()->AddAudioObserver(this);
30 }
31 
~GoogleAssistantHandler()32 GoogleAssistantHandler::~GoogleAssistantHandler() {
33   chromeos::CrasAudioHandler::Get()->RemoveAudioObserver(this);
34 }
35 
OnJavascriptAllowed()36 void GoogleAssistantHandler::OnJavascriptAllowed() {
37   if (pending_hotword_update_) {
38     OnAudioNodesChanged();
39   }
40 }
41 
OnJavascriptDisallowed()42 void GoogleAssistantHandler::OnJavascriptDisallowed() {}
43 
OnAudioNodesChanged()44 void GoogleAssistantHandler::OnAudioNodesChanged() {
45   if (!IsJavascriptAllowed()) {
46     pending_hotword_update_ = true;
47     return;
48   }
49 
50   pending_hotword_update_ = false;
51   FireWebUIListener(
52       "hotwordDeviceUpdated",
53       base::Value(chromeos::CrasAudioHandler::Get()->HasHotwordDevice()));
54 }
55 
RegisterMessages()56 void GoogleAssistantHandler::RegisterMessages() {
57   web_ui()->RegisterMessageCallback(
58       "showGoogleAssistantSettings",
59       base::BindRepeating(
60           &GoogleAssistantHandler::HandleShowGoogleAssistantSettings,
61           base::Unretained(this)));
62   web_ui()->RegisterMessageCallback(
63       "retrainAssistantVoiceModel",
64       base::BindRepeating(&GoogleAssistantHandler::HandleRetrainVoiceModel,
65                           base::Unretained(this)));
66   web_ui()->RegisterMessageCallback(
67       "syncVoiceModelStatus",
68       base::BindRepeating(&GoogleAssistantHandler::HandleSyncVoiceModelStatus,
69                           base::Unretained(this)));
70   web_ui()->RegisterMessageCallback(
71       "initializeGoogleAssistantPage",
72       base::BindRepeating(&GoogleAssistantHandler::HandleInitialized,
73                           base::Unretained(this)));
74 }
75 
HandleShowGoogleAssistantSettings(const base::ListValue * args)76 void GoogleAssistantHandler::HandleShowGoogleAssistantSettings(
77     const base::ListValue* args) {
78   CHECK_EQ(0U, args->GetSize());
79   ash::OpenAssistantSettings();
80 }
81 
HandleRetrainVoiceModel(const base::ListValue * args)82 void GoogleAssistantHandler::HandleRetrainVoiceModel(
83     const base::ListValue* args) {
84   CHECK_EQ(0U, args->GetSize());
85   chromeos::AssistantOptInDialog::Show(ash::FlowType::kSpeakerIdRetrain,
86                                        base::DoNothing());
87 }
88 
HandleSyncVoiceModelStatus(const base::ListValue * args)89 void GoogleAssistantHandler::HandleSyncVoiceModelStatus(
90     const base::ListValue* args) {
91   CHECK_EQ(0U, args->GetSize());
92   if (!settings_manager_.is_bound())
93     BindAssistantSettingsManager();
94 
95   settings_manager_->SyncSpeakerIdEnrollmentStatus();
96 }
97 
HandleInitialized(const base::ListValue * args)98 void GoogleAssistantHandler::HandleInitialized(const base::ListValue* args) {
99   CHECK_EQ(0U, args->GetSize());
100   AllowJavascript();
101 }
102 
BindAssistantSettingsManager()103 void GoogleAssistantHandler::BindAssistantSettingsManager() {
104   DCHECK(!settings_manager_.is_bound());
105 
106   // Set up settings mojom.
107   AssistantServiceConnection::GetForProfile(profile_)
108       ->service()
109       ->BindSettingsManager(settings_manager_.BindNewPipeAndPassReceiver());
110 }
111 
112 }  // namespace settings
113 }  // namespace chromeos
114