Commit b3bb875d authored by Xiaohui Chen's avatar Xiaohui Chen Committed by Commit Bot

assistant: fix race condition on showing hotword options

Hotword device detection may take some time for cras. Assistant
settings page maybe showing before cras has fully discovered all
audio devices.  This change makes sure we handle cras audio
device node changes to update with latest information.

Bug: b/135137356
Test: locally build and test on device.
Change-Id: Iea84cd3a9e7e25b324014242799ac88f372a099e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1687363Reviewed-by: default avatarYue Li <updowndota@chromium.org>
Reviewed-by: default avatarSteven Bennetts <stevenjb@chromium.org>
Commit-Queue: Xiaohui Chen <xiaohuic@chromium.org>
Cr-Commit-Position: refs/heads/master@{#675922}
parent 11f3c19c
......@@ -41,7 +41,7 @@ const ConsentStatus = {
Polymer({
is: 'settings-google-assistant-page',
behaviors: [I18nBehavior, PrefsBehavior],
behaviors: [I18nBehavior, PrefsBehavior, WebUIListenerBehavior],
properties: {
/** @private */
......@@ -124,6 +124,15 @@ Polymer({
this.browserProxy_ = settings.GoogleAssistantBrowserProxyImpl.getInstance();
},
/** @override */
ready: function() {
this.addWebUIListener('hotwordDeviceUpdated', (hasHotword) => {
this.hotwordDspAvailable_ = hasHotword;
});
chrome.send('initializeGoogleAssistantPage');
},
/**
* @param {boolean} toggleValue
* @return {string}
......
......@@ -203,7 +203,7 @@ void AssistantOptInFlowScreenHandler::OnSpeakerIdEnrollmentFailure() {
RecordAssistantOptInStatus(VOICE_MATCH_ENROLLMENT_ERROR);
CallJS("login.AssistantOptInFlowScreen.onVoiceMatchUpdate",
base::Value("failure"));
LOG(ERROR) << "Speaker ID enrollmend failure.";
LOG(ERROR) << "Speaker ID enrollment failure.";
}
void AssistantOptInFlowScreenHandler::SetupAssistantConnection() {
......
......@@ -13,6 +13,7 @@
#include "base/values.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.h"
#include "chromeos/audio/cras_audio_handler.h"
#include "chromeos/constants/chromeos_switches.h"
#include "chromeos/services/assistant/public/mojom/constants.mojom.h"
#include "components/arc/arc_prefs.h"
......@@ -25,13 +26,34 @@ namespace chromeos {
namespace settings {
GoogleAssistantHandler::GoogleAssistantHandler(Profile* profile)
: profile_(profile), weak_factory_(this) {}
: profile_(profile), weak_factory_(this) {
chromeos::CrasAudioHandler::Get()->AddAudioObserver(this);
}
GoogleAssistantHandler::~GoogleAssistantHandler() {
chromeos::CrasAudioHandler::Get()->RemoveAudioObserver(this);
}
GoogleAssistantHandler::~GoogleAssistantHandler() {}
void GoogleAssistantHandler::OnJavascriptAllowed() {
if (pending_hotword_update_) {
OnAudioNodesChanged();
}
}
void GoogleAssistantHandler::OnJavascriptAllowed() {}
void GoogleAssistantHandler::OnJavascriptDisallowed() {}
void GoogleAssistantHandler::OnAudioNodesChanged() {
if (!IsJavascriptAllowed()) {
pending_hotword_update_ = true;
return;
}
pending_hotword_update_ = false;
FireWebUIListener(
"hotwordDeviceUpdated",
base::Value(chromeos::CrasAudioHandler::Get()->HasHotwordDevice()));
}
void GoogleAssistantHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(
"showGoogleAssistantSettings",
......@@ -46,6 +68,10 @@ void GoogleAssistantHandler::RegisterMessages() {
"syncVoiceModelStatus",
base::BindRepeating(&GoogleAssistantHandler::HandleSyncVoiceModelStatus,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"initializeGoogleAssistantPage",
base::BindRepeating(&GoogleAssistantHandler::HandleInitialized,
base::Unretained(this)));
}
void GoogleAssistantHandler::HandleShowGoogleAssistantSettings(
......@@ -71,6 +97,11 @@ void GoogleAssistantHandler::HandleSyncVoiceModelStatus(
settings_manager_->SyncSpeakerIdEnrollmentStatus();
}
void GoogleAssistantHandler::HandleInitialized(const base::ListValue* args) {
CHECK_EQ(0U, args->GetSize());
AllowJavascript();
}
void GoogleAssistantHandler::BindAssistantSettingsManager() {
DCHECK(!settings_manager_.is_bound());
......
......@@ -6,7 +6,9 @@
#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_GOOGLE_ASSISTANT_HANDLER_H_
#include "base/macros.h"
#include "base/optional.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
#include "chromeos/audio/cras_audio_handler.h"
#include "chromeos/services/assistant/public/mojom/settings.mojom.h"
#include "mojo/public/cpp/bindings/binding.h"
......@@ -15,7 +17,8 @@ class Profile;
namespace chromeos {
namespace settings {
class GoogleAssistantHandler : public ::settings::SettingsPageUIHandler {
class GoogleAssistantHandler : public ::settings::SettingsPageUIHandler,
chromeos::CrasAudioHandler::AudioObserver {
public:
explicit GoogleAssistantHandler(Profile* profile);
~GoogleAssistantHandler() override;
......@@ -24,6 +27,9 @@ class GoogleAssistantHandler : public ::settings::SettingsPageUIHandler {
void OnJavascriptAllowed() override;
void OnJavascriptDisallowed() override;
// chromeos::CrasAudioHandler::AudioObserver overrides
void OnAudioNodesChanged() override;
private:
// WebUI call to launch into the Google Assistant app settings.
void HandleShowGoogleAssistantSettings(const base::ListValue* args);
......@@ -31,6 +37,8 @@ class GoogleAssistantHandler : public ::settings::SettingsPageUIHandler {
void HandleRetrainVoiceModel(const base::ListValue* args);
// WebUI call to sync Assistant voice model status.
void HandleSyncVoiceModelStatus(const base::ListValue* args);
// WebUI call to signal js side is ready.
void HandleInitialized(const base::ListValue* args);
// Bind to assistant settings manager.
void BindAssistantSettingsManager();
......@@ -39,6 +47,8 @@ class GoogleAssistantHandler : public ::settings::SettingsPageUIHandler {
assistant::mojom::AssistantSettingsManagerPtr settings_manager_;
bool pending_hotword_update_ = false;
base::WeakPtrFactory<GoogleAssistantHandler> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(GoogleAssistantHandler);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment