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