Commit 192b7988 authored by llin@chromium.org's avatar llin@chromium.org Committed by Commit Bot

Add click tracking for QuickAnswers rich UI.

This CL also moved click tracking into QuickAnswersClient to reduce code
duplication and make all logging handled by QuickAnswersClient.

Bug: 1060265
Test: manual test
Change-Id: Ia3ae5d0101a8096aa745c7a797be504bc4093025
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2096927
Commit-Queue: Li Lin <llin@chromium.org>
Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#748910}
parent ee3a8d8a
......@@ -78,6 +78,8 @@ void QuickAnswersControllerImpl::OnQuickAnswerReceived(
quick_answers_ui_controller_->RenderQuickAnswersViewWithResult(
anchor_bounds_, quick_answer_with_no_result);
}
quick_answer_ = std::move(quick_answer);
}
void QuickAnswersControllerImpl::OnEligibilityChanged(bool eligible) {
......@@ -94,6 +96,12 @@ void QuickAnswersControllerImpl::OnRetryQuickAnswersRequest() {
request.selected_text = query_;
quick_answers_client_->SendRequest(request);
}
void QuickAnswersControllerImpl::OnQuickAnswerClick() {
quick_answers_client_->OnQuickAnswerClick(
quick_answer_ ? quick_answer_->result_type : ResultType::kNoResult);
}
void QuickAnswersControllerImpl::UpdateQuickAnswersAnchorBounds(
const gfx::Rect& anchor_bounds) {
quick_answers_ui_controller_->UpdateQuickAnswersBounds(anchor_bounds);
......
......@@ -57,6 +57,9 @@ class ASH_EXPORT QuickAnswersControllerImpl
// Retry sending quick answers request to backend.
void OnRetryQuickAnswersRequest();
// User clicks on the quick answer result.
void OnQuickAnswerClick();
// Update the bounds of the anchor view.
void UpdateQuickAnswersAnchorBounds(const gfx::Rect& anchor_bounds);
......@@ -77,6 +80,9 @@ class ASH_EXPORT QuickAnswersControllerImpl
bool is_eligible_ = false;
std::unique_ptr<QuickAnswersUiController> quick_answers_ui_controller_;
// The last received QuickAnswer from client.
std::unique_ptr<chromeos::quick_answers::QuickAnswer> quick_answer_;
};
} // namespace ash
......
......@@ -50,6 +50,7 @@ void QuickAnswersUiController::OnQuickAnswersViewPressed() {
assistant_controller->StartTextInteraction(
query_, /*allow_tts=*/false,
chromeos::assistant::mojom::AssistantQuerySource::kQuickAnswers);
controller_->OnQuickAnswerClick();
}
void QuickAnswersUiController::Close() {
......
......@@ -173,22 +173,8 @@ void QuickAnswersMenuObserver::ExecuteCommand(int command_id) {
if (command_id == IDC_CONTENT_CONTEXT_QUICK_ANSWERS_INLINE_QUERY) {
SendAssistantQuery(query_);
if (quick_answer_) {
base::TimeDelta duration =
base::TimeTicks::Now() - quick_answer_received_time_;
RecordClick(quick_answer_->result_type, duration);
} else {
// No result is available.
// Use default 0 duration for clicks before fetch finish.
base::TimeDelta duration;
if (!quick_answer_received_time_.is_null()) {
// Fetch finish with no result, set the duration to be between fetch
// finish and user clicks.
duration = base::TimeTicks::Now() - quick_answer_received_time_;
}
RecordClick(ResultType::kNoResult, duration);
}
quick_answers_client_->OnQuickAnswerClick(
quick_answer_ ? quick_answer_->result_type : ResultType::kNoResult);
}
}
......@@ -216,7 +202,6 @@ void QuickAnswersMenuObserver::OnQuickAnswerReceived(
/*hidden=*/false,
/*title=*/TruncateString(kNoResult));
}
quick_answer_received_time_ = base::TimeTicks::Now();
quick_answer_ = std::move(quick_answer);
}
......@@ -225,7 +210,6 @@ void QuickAnswersMenuObserver::OnNetworkError() {
/*enabled=*/false,
/*hidden=*/false,
/*title=*/TruncateString(kNetworkError));
quick_answer_received_time_ = base::TimeTicks::Now();
}
void QuickAnswersMenuObserver::OnEligibilityChanged(bool eligible) {
......
......@@ -16,10 +16,6 @@ namespace ash {
class QuickAnswersController;
}
namespace base {
class TimeTicks;
}
class RenderViewContextMenuProxy;
// A class that implements the quick answers menu.
......@@ -73,9 +69,6 @@ class QuickAnswersMenuObserver
std::unique_ptr<chromeos::quick_answers::QuickAnswer> quick_answer_;
ash::QuickAnswersController* quick_answers_controller_ = nullptr;
// Time when the quick answer is received.
base::TimeTicks quick_answer_received_time_;
};
#endif // CHROME_BROWSER_RENDERER_CONTEXT_MENU_QUICK_ANSWERS_MENU_OBSERVER_H_
......@@ -110,6 +110,17 @@ void QuickAnswersClient::SendRequest(
result_loader_->Fetch(processed_request.selected_text);
}
void QuickAnswersClient::OnQuickAnswerClick(ResultType result_type) {
// Use default 0 duration for clicks before fetch finish.
base::TimeDelta duration;
if (!quick_answer_received_time_.is_null()) {
// Fetch finish with no result, set the duration to be between fetch
// finish and user clicks.
duration = base::TimeTicks::Now() - quick_answer_received_time_;
}
RecordClick(result_type, duration);
}
void QuickAnswersClient::NotifyEligibilityChanged() {
DCHECK(delegate_);
bool is_eligible =
......@@ -138,6 +149,7 @@ void QuickAnswersClient::OnNetworkError() {
void QuickAnswersClient::OnQuickAnswerReceived(
std::unique_ptr<QuickAnswer> quick_answer) {
DCHECK(delegate_);
quick_answer_received_time_ = base::TimeTicks::Now();
delegate_->OnQuickAnswerReceived(std::move(quick_answer));
}
......
......@@ -24,6 +24,7 @@ namespace quick_answers {
struct QuickAnswer;
struct QuickAnswersRequest;
enum class IntentType;
enum class ResultType;
// A delegate interface for the QuickAnswersClient.
class QuickAnswersDelegate {
......@@ -85,6 +86,9 @@ class QuickAnswersClient : public ash::AssistantStateObserver,
// Send a quick answer request. Virtual for testing.
virtual void SendRequest(const QuickAnswersRequest& quick_answers_request);
// User clicks on the Quick Answers result. Virtual for testing.
virtual void OnQuickAnswerClick(ResultType result_type);
static void SetResultLoaderFactoryForTesting(
ResultLoaderFactoryCallback* factory);
......@@ -104,6 +108,8 @@ class QuickAnswersClient : public ash::AssistantStateObserver,
ash::mojom::AssistantAllowedState assistant_allowed_state_ =
ash::mojom::AssistantAllowedState::ALLOWED;
bool is_eligible_ = false;
// Time when the quick answer is received.
base::TimeTicks quick_answer_received_time_;
};
} // namespace quick_answers
......
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