Commit 06767a26 authored by David Black's avatar David Black Committed by Commit Bot

Use OnConversationTurnStartedInternal API in Assistant.

Previously we used the OnConversationTurnStarted API to notify us of
when an interaction was starting in LibAssistant. This API did not give
us any metadata about the interaction, so we couldn't match it with
confidence to one of our requests.

The new API exposes an ID through the |metadata| param. We can use that
ID to match an interaction request with a conversation turn. Once fully
wired up, this will allow us to stop pending a query before a conversation
turn starts and instead only do so within our interaction lifecycle. Once
lifecycle has been fixed, a number of downstream bugs will be resolved.

The CL to fix lifecycle will be a follow up. This CL only exposes the
interaction metadata that we will need in order to do so.

Bug: 941259, 973680
Change-Id: I32edf71251272aa21dc571df40f15b8de12cefba
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1757425
Commit-Queue: David Black <dmblack@google.com>
Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarXiaohui Chen <xiaohuic@chromium.org>
Cr-Commit-Position: refs/heads/master@{#689578}
parent 908d4fac
...@@ -345,8 +345,10 @@ void AssistantInteractionController::OnCommittedQueryChanged( ...@@ -345,8 +345,10 @@ void AssistantInteractionController::OnCommittedQueryChanged(
assistant::util::RecordAssistantQuerySource(assistant_query.source()); assistant::util::RecordAssistantQuerySource(assistant_query.source());
} }
// TODO(dmblack): Set pending query from |metadata| and remove calls to set
// pending query that occur outside of this method.
void AssistantInteractionController::OnInteractionStarted( void AssistantInteractionController::OnInteractionStarted(
bool is_voice_interaction) { AssistantInteractionMetadataPtr metadata) {
// Stop the interaction if the opt-in window is active. // Stop the interaction if the opt-in window is active.
auto* assistant_setup = AssistantSetup::GetInstance(); auto* assistant_setup = AssistantSetup::GetInstance();
if (assistant_setup && assistant_setup->BounceOptInWindowIfActive()) { if (assistant_setup && assistant_setup->BounceOptInWindowIfActive()) {
...@@ -354,6 +356,10 @@ void AssistantInteractionController::OnInteractionStarted( ...@@ -354,6 +356,10 @@ void AssistantInteractionController::OnInteractionStarted(
return; return;
} }
const bool is_voice_interaction =
chromeos::assistant::mojom::AssistantInteractionType::kVoice ==
metadata->type;
if (is_voice_interaction) { if (is_voice_interaction) {
// If the Assistant UI is not visible yet, and |is_voice_interaction| is // If the Assistant UI is not visible yet, and |is_voice_interaction| is
// true, then it will be sure that Assistant is fired via OKG. ShowUi will // true, then it will be sure that Assistant is fired via OKG. ShowUi will
......
...@@ -36,11 +36,13 @@ class AssistantInteractionController ...@@ -36,11 +36,13 @@ class AssistantInteractionController
public AssistantViewDelegateObserver, public AssistantViewDelegateObserver,
public HighlighterController::Observer { public HighlighterController::Observer {
public: public:
using AssistantInteractionMetadataPtr =
chromeos::assistant::mojom::AssistantInteractionMetadataPtr;
using AssistantInteractionResolution =
chromeos::assistant::mojom::AssistantInteractionResolution;
using AssistantSuggestion = chromeos::assistant::mojom::AssistantSuggestion; using AssistantSuggestion = chromeos::assistant::mojom::AssistantSuggestion;
using AssistantSuggestionPtr = using AssistantSuggestionPtr =
chromeos::assistant::mojom::AssistantSuggestionPtr; chromeos::assistant::mojom::AssistantSuggestionPtr;
using AssistantInteractionResolution =
chromeos::assistant::mojom::AssistantInteractionResolution;
explicit AssistantInteractionController( explicit AssistantInteractionController(
AssistantController* assistant_controller); AssistantController* assistant_controller);
...@@ -83,7 +85,7 @@ class AssistantInteractionController ...@@ -83,7 +85,7 @@ class AssistantInteractionController
void OnHighlighterSelectionRecognized(const gfx::Rect& rect) override; void OnHighlighterSelectionRecognized(const gfx::Rect& rect) override;
// chromeos::assistant::mojom::AssistantInteractionSubscriber: // chromeos::assistant::mojom::AssistantInteractionSubscriber:
void OnInteractionStarted(bool is_voice_interaction) override; void OnInteractionStarted(AssistantInteractionMetadataPtr metadata) override;
void OnInteractionFinished( void OnInteractionFinished(
AssistantInteractionResolution resolution) override; AssistantInteractionResolution resolution) override;
void OnHtmlResponse(const std::string& response, void OnHtmlResponse(const std::string& response,
......
...@@ -61,13 +61,16 @@ const app_list::AssistantPageView* AssistantAshTestBase::page_view() const { ...@@ -61,13 +61,16 @@ const app_list::AssistantPageView* AssistantAshTestBase::page_view() const {
void AssistantAshTestBase::MockAssistantInteractionWithResponse( void AssistantAshTestBase::MockAssistantInteractionWithResponse(
const std::string& response_text) { const std::string& response_text) {
const std::string query = std::string("input text");
// |controller_| will blackhole any server response if it hasn't sent // |controller_| will blackhole any server response if it hasn't sent
// a request first, so we need to start by sending a request. // a request first, so we need to start by sending a request.
controller_->interaction_controller()->OnDialogPlateContentsCommitted( controller_->interaction_controller()->OnDialogPlateContentsCommitted(query);
"input text");
// Then the server can start an interaction and return the response. // Then the server can start an interaction and return the response.
controller_->interaction_controller()->OnInteractionStarted( controller_->interaction_controller()->OnInteractionStarted(
/*is_voice_interaction=*/false); chromeos::assistant::mojom::AssistantInteractionMetadata::New(
/*type=*/chromeos::assistant::mojom::AssistantInteractionType::kText,
/*query=*/query));
controller_->interaction_controller()->OnTextResponse(response_text); controller_->interaction_controller()->OnTextResponse(response_text);
controller_->interaction_controller()->OnInteractionFinished( controller_->interaction_controller()->OnInteractionFinished(
AssistantInteractionController::AssistantInteractionResolution::kNormal); AssistantInteractionController::AssistantInteractionResolution::kNormal);
......
...@@ -498,10 +498,12 @@ class AutotestPrivateSendAssistantTextQueryFunction ...@@ -498,10 +498,12 @@ class AutotestPrivateSendAssistantTextQueryFunction
~AutotestPrivateSendAssistantTextQueryFunction() override; ~AutotestPrivateSendAssistantTextQueryFunction() override;
ResponseAction Run() override; ResponseAction Run() override;
using AssistantSuggestionPtr = using AssistantInteractionMetadataPtr =
chromeos::assistant::mojom::AssistantSuggestionPtr; chromeos::assistant::mojom::AssistantInteractionMetadataPtr;
using AssistantInteractionResolution = using AssistantInteractionResolution =
chromeos::assistant::mojom::AssistantInteractionResolution; chromeos::assistant::mojom::AssistantInteractionResolution;
using AssistantSuggestionPtr =
chromeos::assistant::mojom::AssistantSuggestionPtr;
// chromeos::assistant::mojom::AssistantInteractionSubscriber: // chromeos::assistant::mojom::AssistantInteractionSubscriber:
void OnHtmlResponse(const std::string& response, void OnHtmlResponse(const std::string& response,
...@@ -509,7 +511,8 @@ class AutotestPrivateSendAssistantTextQueryFunction ...@@ -509,7 +511,8 @@ class AutotestPrivateSendAssistantTextQueryFunction
void OnTextResponse(const std::string& response) override; void OnTextResponse(const std::string& response) override;
void OnInteractionFinished( void OnInteractionFinished(
AssistantInteractionResolution resolution) override; AssistantInteractionResolution resolution) override;
void OnInteractionStarted(bool is_voice_interaction) override {} void OnInteractionStarted(AssistantInteractionMetadataPtr metadata) override {
}
void OnSuggestionsResponse( void OnSuggestionsResponse(
std::vector<AssistantSuggestionPtr> response) override {} std::vector<AssistantSuggestionPtr> response) override {}
void OnOpenUrlResponse(const GURL& url, bool in_background) override {} void OnOpenUrlResponse(const GURL& url, bool in_background) override {}
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "base/i18n/rtl.h" #include "base/i18n/rtl.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/task/post_task.h" #include "base/task/post_task.h"
#include "base/unguessable_token.h" #include "base/unguessable_token.h"
...@@ -404,6 +405,13 @@ void AssistantManagerServiceImpl::StartTextInteraction(const std::string& query, ...@@ -404,6 +405,13 @@ void AssistantManagerServiceImpl::StartTextInteraction(const std::string& query,
assistant_client::VoicelessOptions::Modality::TYPING_MODALITY; assistant_client::VoicelessOptions::Modality::TYPING_MODALITY;
} }
// Cache metadata about this interaction that can be resolved when the
// associated conversation turn starts in LibAssistant.
options.conversation_turn_id = base::NumberToString(next_interaction_id_++);
pending_interactions_[options.conversation_turn_id] =
mojom::AssistantInteractionMetadata::New(
/*type=*/mojom::AssistantInteractionType::kText, /*query=*/query);
if (base::FeatureList::IsEnabled( if (base::FeatureList::IsEnabled(
assistant::features::kEnableTextQueriesWithClientDiscourseContext) && assistant::features::kEnableTextQueriesWithClientDiscourseContext) &&
assistant_extra_ && assistant_tree_) { assistant_extra_ && assistant_tree_) {
...@@ -464,12 +472,13 @@ void AssistantManagerServiceImpl::DismissNotification( ...@@ -464,12 +472,13 @@ void AssistantManagerServiceImpl::DismissNotification(
dismissed_interaction, "DismissNotification", options, [](auto) {}); dismissed_interaction, "DismissNotification", options, [](auto) {});
} }
void AssistantManagerServiceImpl::OnConversationTurnStarted(bool is_mic_open) { void AssistantManagerServiceImpl::OnConversationTurnStartedInternal(
const assistant_client::ConversationTurnMetadata& metadata) {
service_->main_task_runner()->PostTask( service_->main_task_runner()->PostTask(
FROM_HERE, FROM_HERE,
base::BindOnce( base::BindOnce(
&AssistantManagerServiceImpl::OnConversationTurnStartedOnMainThread, &AssistantManagerServiceImpl::OnConversationTurnStartedOnMainThread,
weak_factory_.GetWeakPtr(), is_mic_open)); weak_factory_.GetWeakPtr(), metadata));
} }
void AssistantManagerServiceImpl::OnConversationTurnFinished( void AssistantManagerServiceImpl::OnConversationTurnFinished(
...@@ -1198,13 +1207,27 @@ void AssistantManagerServiceImpl::MediaSessionMetadataChanged( ...@@ -1198,13 +1207,27 @@ void AssistantManagerServiceImpl::MediaSessionMetadataChanged(
} }
void AssistantManagerServiceImpl::OnConversationTurnStartedOnMainThread( void AssistantManagerServiceImpl::OnConversationTurnStartedOnMainThread(
bool is_mic_open) { const assistant_client::ConversationTurnMetadata& metadata) {
platform_api_->GetAudioInputProvider() platform_api_->GetAudioInputProvider()
.GetAudioInput() .GetAudioInput()
.OnConversationTurnStarted(); .OnConversationTurnStarted();
interaction_subscribers_.ForAllPtrs([is_mic_open](auto* ptr) { // Retrieve the cached interaction metadata associated with this conversation
ptr->OnInteractionStarted(/*is_voice_interaction=*/is_mic_open); // turn or construct a new instance if there's no match in the cache.
mojom::AssistantInteractionMetadataPtr metadata_ptr;
auto it = pending_interactions_.find(metadata.id);
if (it != pending_interactions_.end()) {
metadata_ptr = std::move(it->second);
pending_interactions_.erase(it);
} else {
metadata_ptr = mojom::AssistantInteractionMetadata::New();
metadata_ptr->type = metadata.is_mic_open
? mojom::AssistantInteractionType::kVoice
: mojom::AssistantInteractionType::kText;
}
interaction_subscribers_.ForAllPtrs([&metadata_ptr](auto* ptr) {
ptr->OnInteractionStarted(metadata_ptr->Clone());
}); });
} }
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#ifndef CHROMEOS_SERVICES_ASSISTANT_ASSISTANT_MANAGER_SERVICE_IMPL_H_ #ifndef CHROMEOS_SERVICES_ASSISTANT_ASSISTANT_MANAGER_SERVICE_IMPL_H_
#define CHROMEOS_SERVICES_ASSISTANT_ASSISTANT_MANAGER_SERVICE_IMPL_H_ #define CHROMEOS_SERVICES_ASSISTANT_ASSISTANT_MANAGER_SERVICE_IMPL_H_
#include <map>
#include <memory> #include <memory>
#include <string> #include <string>
#include <vector> #include <vector>
...@@ -153,7 +154,6 @@ class AssistantManagerServiceImpl ...@@ -153,7 +154,6 @@ class AssistantManagerServiceImpl
void OnSpeechLevelUpdated(float speech_level) override; void OnSpeechLevelUpdated(float speech_level) override;
// assistant_client::ConversationStateListener overrides: // assistant_client::ConversationStateListener overrides:
void OnConversationTurnStarted(bool is_mic_open) override;
void OnConversationTurnFinished( void OnConversationTurnFinished(
assistant_client::ConversationStateListener::Resolution resolution) assistant_client::ConversationStateListener::Resolution resolution)
override; override;
...@@ -168,6 +168,8 @@ class AssistantManagerServiceImpl ...@@ -168,6 +168,8 @@ class AssistantManagerServiceImpl
const std::string& modify_setting_args_proto) override; const std::string& modify_setting_args_proto) override;
bool IsSettingSupported(const std::string& setting_id) override; bool IsSettingSupported(const std::string& setting_id) override;
bool SupportsModifySettings() override; bool SupportsModifySettings() override;
void OnConversationTurnStartedInternal(
const assistant_client::ConversationTurnMetadata& metadata) override;
void OnNotificationRemoved(const std::string& grouping_key) override; void OnNotificationRemoved(const std::string& grouping_key) override;
void OnCommunicationError(int error_code) override; void OnCommunicationError(int error_code) override;
// Last search source will be cleared after it is retrieved. // Last search source will be cleared after it is retrieved.
...@@ -226,7 +228,8 @@ class AssistantManagerServiceImpl ...@@ -226,7 +228,8 @@ class AssistantManagerServiceImpl
void HandleLaunchMediaIntentResponse(bool app_opened); void HandleLaunchMediaIntentResponse(bool app_opened);
void OnConversationTurnStartedOnMainThread(bool is_mic_open); void OnConversationTurnStartedOnMainThread(
const assistant_client::ConversationTurnMetadata& metadata);
void OnConversationTurnFinishedOnMainThread( void OnConversationTurnFinishedOnMainThread(
assistant_client::ConversationStateListener::Resolution resolution); assistant_client::ConversationStateListener::Resolution resolution);
void OnShowHtmlOnMainThread(const std::string& html, void OnShowHtmlOnMainThread(const std::string& html,
...@@ -320,6 +323,10 @@ class AssistantManagerServiceImpl ...@@ -320,6 +323,10 @@ class AssistantManagerServiceImpl
base::Thread background_thread_; base::Thread background_thread_;
int next_interaction_id_ = 1;
std::map<std::string, mojom::AssistantInteractionMetadataPtr>
pending_interactions_;
bool receive_modify_settings_proto_response_ = false; bool receive_modify_settings_proto_response_ = false;
bool receive_inline_response_ = false; bool receive_inline_response_ = false;
std::string receive_url_response_; std::string receive_url_response_;
......
...@@ -137,14 +137,25 @@ interface Assistant { ...@@ -137,14 +137,25 @@ interface Assistant {
CreateTimer(mojo_base.mojom.TimeDelta duration); CreateTimer(mojo_base.mojom.TimeDelta duration);
}; };
// Describes an Assistant interaction.
struct AssistantInteractionMetadata {
AssistantInteractionType type;
string query;
};
// Enumeration of possible Assistant interaction types.
enum AssistantInteractionType {
kText,
kVoice,
};
// Subscribes to Assistant's interaction event. These events are server driven // Subscribes to Assistant's interaction event. These events are server driven
// in response to the user's direct interaction with the assistant. Responses // in response to the user's direct interaction with the assistant. Responses
// from the assistant may contain untrusted third-party content. Subscriber // from the assistant may contain untrusted third-party content. Subscriber
// implementations must be sure to handle the response data appropriately. // implementations must be sure to handle the response data appropriately.
interface AssistantInteractionSubscriber { interface AssistantInteractionSubscriber {
// Assistant interaction has started. In the event of a voice interaction, // Assistant interaction has started.
// |is_voice_interaction| will be true. This implies that the mic is open. OnInteractionStarted(AssistantInteractionMetadata metadata);
OnInteractionStarted(bool is_voice_interaction);
// Assistant interaction has ended with the specified |resolution|. // Assistant interaction has ended with the specified |resolution|.
OnInteractionFinished(AssistantInteractionResolution resolution); OnInteractionFinished(AssistantInteractionResolution resolution);
......
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