blob: da86146128026ed5738a41f04edbe31e9978960e [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/quick_answers/quick_answers_controller_impl.h"
#include "ash/public/cpp/new_window_delegate.h"
#include "ash/quick_answers/quick_answers_ui_controller.h"
#include "ash/session/session_controller_impl.h"
#include "ash/shell.h"
#include "ash/strings/grit/ash_strings.h"
#include "chromeos/components/quick_answers/quick_answers_consents.h"
#include "chromeos/components/quick_answers/quick_answers_model.h"
#include "url/gurl.h"
// TODO(yanxiao):Add a unit test for QuickAnswersControllerImpl.
namespace {
using chromeos::quick_answers::QuickAnswer;
using chromeos::quick_answers::QuickAnswersClient;
using chromeos::quick_answers::QuickAnswersRequest;
using chromeos::quick_answers::ResultType;
constexpr char kAssistantRelatedInfoUrl[] =
"chrome://os-settings/googleAssistant";
constexpr char kDogfoodUrl[] = "https://go/quick-answers-dogfood-bugs";
// TODO:(yanxiao) move the string to grd source file.
constexpr char kNoResult[] = "See result in Assistant";
} // namespace
namespace ash {
QuickAnswersControllerImpl::QuickAnswersControllerImpl()
: quick_answers_ui_controller_(
std::make_unique<ash::QuickAnswersUiController>(this)) {}
QuickAnswersControllerImpl::~QuickAnswersControllerImpl() = default;
void QuickAnswersControllerImpl::SetClient(
std::unique_ptr<QuickAnswersClient> client) {
quick_answers_client_ = std::move(client);
consent_controller_ =
std::make_unique<chromeos::quick_answers::QuickAnswersConsent>(
Shell::Get()->session_controller()->GetPrimaryUserPrefService());
}
void QuickAnswersControllerImpl::MaybeShowQuickAnswers(
const gfx::Rect& anchor_bounds,
const std::string& title) {
DCHECK(quick_answers_client_);
DCHECK(quick_answers_ui_controller_);
if (!is_eligible_)
return;
// Cache anchor-bounds and query.
anchor_bounds_ = anchor_bounds;
query_ = title;
// Show user-consent notice informing user about the feature if required.
if (consent_controller_->ShouldShowConsent()) {
if (!quick_answers_ui_controller_->is_showing_user_consent_view()) {
quick_answers_ui_controller_->CreateUserConsentView(anchor_bounds);
consent_controller_->StartConsent();
}
// Quick-Answers will only be displayed after explicit or tacit consent is
// obtained.
return;
}
// Create Quick-Answers view and fetch Quick-Answer.
quick_answers_ui_controller_->CreateQuickAnswersView(anchor_bounds, title);
QuickAnswersRequest request;
request.selected_text = title;
quick_answers_client_->SendRequest(request);
}
void QuickAnswersControllerImpl::DismissQuickAnswers(bool is_active) {
MaybeDismissQuickAnswersConsent();
quick_answers_ui_controller_->CloseQuickAnswersView();
quick_answers_client_->OnQuickAnswersDismissed(
quick_answer_ ? quick_answer_->result_type : ResultType::kNoResult,
is_active);
}
chromeos::quick_answers::QuickAnswersDelegate*
QuickAnswersControllerImpl::GetQuickAnswersDelegate() {
return this;
}
void QuickAnswersControllerImpl::OnQuickAnswerReceived(
std::unique_ptr<QuickAnswer> quick_answer) {
if (quick_answer) {
if (quick_answer->title.empty()) {
quick_answer->title.push_back(
std::make_unique<chromeos::quick_answers::QuickAnswerText>(query_));
}
quick_answers_ui_controller_->RenderQuickAnswersViewWithResult(
anchor_bounds_, *quick_answer);
} else {
chromeos::quick_answers::QuickAnswer quick_answer_with_no_result;
quick_answer_with_no_result.title.push_back(
std::make_unique<chromeos::quick_answers::QuickAnswerText>(query_));
quick_answer_with_no_result.first_answer_row.push_back(
std::make_unique<chromeos::quick_answers::QuickAnswerResultText>(
kNoResult));
quick_answers_ui_controller_->RenderQuickAnswersViewWithResult(
anchor_bounds_, quick_answer_with_no_result);
}
quick_answer_ = std::move(quick_answer);
}
void QuickAnswersControllerImpl::OnEligibilityChanged(bool eligible) {
is_eligible_ = eligible;
}
void QuickAnswersControllerImpl::OnNetworkError() {
// Notify quick_answers_ui_controller_ to show retry UI.
quick_answers_ui_controller_->ShowRetry();
}
void QuickAnswersControllerImpl::OnRetryQuickAnswersRequest() {
QuickAnswersRequest request;
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) {
anchor_bounds_ = anchor_bounds;
quick_answers_ui_controller_->UpdateQuickAnswersBounds(anchor_bounds);
}
void QuickAnswersControllerImpl::OnUserConsentGranted() {
quick_answers_ui_controller_->CloseUserConsentView();
consent_controller_->AcceptConsent(
chromeos::quick_answers::ConsentInteractionType::kAccept);
// Display Quick-Answer for the cached query when user consents.
MaybeShowQuickAnswers(anchor_bounds_, query_);
}
void QuickAnswersControllerImpl::OnConsentSettingsRequestedByUser() {
quick_answers_ui_controller_->CloseUserConsentView();
consent_controller_->AcceptConsent(
chromeos::quick_answers::ConsentInteractionType::kManageSettings);
NewWindowDelegate::GetInstance()->NewTabWithUrl(
GURL(kAssistantRelatedInfoUrl), /*from_user_interaction=*/true);
}
void QuickAnswersControllerImpl::MaybeDismissQuickAnswersConsent() {
if (quick_answers_ui_controller_->is_showing_user_consent_view())
consent_controller_->DismissConsent();
quick_answers_ui_controller_->CloseUserConsentView();
}
void QuickAnswersControllerImpl::OpenQuickAnswersDogfoodLink() {
NewWindowDelegate::GetInstance()->NewTabWithUrl(
GURL(kDogfoodUrl), /*from_user_interaction=*/true);
}
} // namespace ash