Commit b2c103f5 authored by Li Lin's avatar Li Lin Committed by Commit Bot

Clear AssistantState reference if it is freed.

AssistantState might be freed when QuickAnswersClient destructor is
called (for example, in unit tests).

Bug: b/144314551
Test: Unit tests
Change-Id: Ib088e3eb2f1e1d3797a698bd10bbef16b1f3bd13
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2012910Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Reviewed-by: default avatarTao Wu <wutao@chromium.org>
Reviewed-by: default avatarXiaohui Chen <xiaohuic@chromium.org>
Commit-Queue: Li Lin <llin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#733794}
parent 242f083a
......@@ -30,7 +30,10 @@ void PrintValue(std::stringstream* result,
AssistantStateBase::AssistantStateBase() = default;
AssistantStateBase::~AssistantStateBase() = default;
AssistantStateBase::~AssistantStateBase() {
for (auto& observer : observers_)
observer.OnAssistantStateDestroyed();
}
std::string AssistantStateBase::ToString() const {
std::stringstream result;
......
......@@ -35,6 +35,7 @@ class ASH_PUBLIC_EXPORT AssistantStateObserver
virtual void OnAssistantHotwordEnabled(bool enabled) {}
virtual void OnAssistantLaunchWithMicOpen(bool launch_with_mic_open) {}
virtual void OnAssistantNotificationEnabled(bool notification_enabled) {}
virtual void OnAssistantStateDestroyed() {}
// mojom::AssistantStateObserver:
void OnAssistantStatusChanged(mojom::AssistantState state) override {}
......
......@@ -46,13 +46,16 @@ QuickAnswersClient::QuickAnswersClient(URLLoaderFactory* url_loader_factory,
: url_loader_factory_(url_loader_factory),
assistant_state_(assistant_state),
delegate_(delegate) {
// We observe Assistant state to detect enabling/disabling of Assistant in
// settings as well as enabling/disabling of screen context.
assistant_state_->AddObserver(this);
if (assistant_state_) {
// We observe Assistant state to detect enabling/disabling of Assistant in
// settings as well as enabling/disabling of screen context.
assistant_state_->AddObserver(this);
}
}
QuickAnswersClient::~QuickAnswersClient() {
assistant_state_->RemoveObserver(this);
if (assistant_state_)
assistant_state_->RemoveObserver(this);
}
void QuickAnswersClient::OnAssistantFeatureAllowedChanged(
......@@ -79,6 +82,10 @@ void QuickAnswersClient::OnLocaleChanged(const std::string& locale) {
NotifyEligibilityChanged();
}
void QuickAnswersClient::OnAssistantStateDestroyed() {
assistant_state_ = nullptr;
}
void QuickAnswersClient::SendRequest(
const QuickAnswersRequest& quick_answers_request) {
// Preprocess the request.
......@@ -96,8 +103,8 @@ void QuickAnswersClient::SendRequest(
void QuickAnswersClient::NotifyEligibilityChanged() {
DCHECK(delegate_);
bool is_eligible =
(chromeos::features::IsQuickAnswersEnabled() && assistant_enabled_ &&
locale_supported_ && assistant_context_enabled_ &&
(chromeos::features::IsQuickAnswersEnabled() && assistant_state_ &&
assistant_enabled_ && locale_supported_ && assistant_context_enabled_ &&
assistant_allowed_state_ == ash::mojom::AssistantAllowedState::ALLOWED);
if (is_eligible_ != is_eligible) {
......
......@@ -64,6 +64,7 @@ class QuickAnswersClient : public ash::AssistantStateObserver {
void OnAssistantSettingsEnabled(bool enabled) override;
void OnAssistantContextEnabled(bool enabled) override;
void OnLocaleChanged(const std::string& locale) override;
void OnAssistantStateDestroyed() override;
// Send a quick answer request.
void SendRequest(const QuickAnswersRequest& quick_answers_request);
......
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