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

[Locked Fullscreen] Disable Assistant in locked mode

Locked fullscreen mode is a special fullscreen mode used for administering
quizzes to students on Chrome OS devices (where the user is basically locked
inside of one browser window).

Assistant is breaking the mode since it allows students to lookup answers to
questions.  Fix this by disabling the Assistant inside the mode.

Bug: 952037
Test: locally build and test with lock screen mode on.
Change-Id: I1b9e539374346f247d15ad65e7d11bfe35b4405b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1616942Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Reviewed-by: default avatarIvan Šandrk <isandrk@chromium.org>
Reviewed-by: default avatarSam McNally <sammc@chromium.org>
Commit-Queue: Xiaohui Chen <xiaohuic@chromium.org>
Cr-Commit-Position: refs/heads/master@{#661352}
parent cf9093f7
......@@ -325,6 +325,11 @@ void AssistantController::OnVoiceInteractionStatusChanged(
assistant_ui_controller_.CloseUi(AssistantExitPoint::kUnspecified);
}
void AssistantController::OnLockedFullScreenStateChanged(bool enabled) {
if (enabled)
assistant_ui_controller_.CloseUi(AssistantExitPoint::kUnspecified);
}
base::WeakPtr<AssistantController> AssistantController::GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
......
......@@ -158,6 +158,7 @@ class ASH_EXPORT AssistantController
// mojom::VoiceInteractionObserver:
void OnVoiceInteractionStatusChanged(
mojom::VoiceInteractionState state) override;
void OnLockedFullScreenStateChanged(bool enabled) override;
// The observer list should be initialized early so that sub-controllers may
// register as observers during their construction.
......
......@@ -352,10 +352,12 @@ void AssistantUiController::OnUiVisibilityChanged(
}
void AssistantUiController::ShowUi(AssistantEntryPoint entry_point) {
if (!Shell::Get()
->voice_interaction_controller()
->settings_enabled()
.value_or(false)) {
auto* voice_interaction_controller =
Shell::Get()->voice_interaction_controller();
if (!voice_interaction_controller->settings_enabled().value_or(false) ||
voice_interaction_controller->locked_full_screen_enabled().value_or(
false)) {
return;
}
......
......@@ -57,6 +57,10 @@ class ASH_PUBLIC_EXPORT AssistantStateBase {
return arc_play_store_enabled_;
}
const base::Optional<bool>& locked_full_screen_enabled() const {
return locked_full_screen_enabled_;
}
protected:
base::Optional<mojom::VoiceInteractionState> voice_interaction_state_;
......@@ -87,6 +91,10 @@ class ASH_PUBLIC_EXPORT AssistantStateBase {
// Whether play store is enabled. nullopt if the data is not available yet.
base::Optional<bool> arc_play_store_enabled_;
// Whether locked full screen state is enabled. nullopt if the data is not
// available yet.
base::Optional<bool> locked_full_screen_enabled_;
private:
DISALLOW_COPY_AND_ASSIGN(AssistantStateBase);
};
......
......@@ -111,4 +111,12 @@ void AssistantStateProxy::OnArcPlayStoreEnabledChanged(bool enabled) {
observer.OnArcPlayStoreEnabledChanged(arc_play_store_enabled_.value());
}
void AssistantStateProxy::OnLockedFullScreenStateChanged(bool enabled) {
locked_full_screen_enabled_ = enabled;
for (auto& observer : observers_) {
observer.OnLockedFullScreenStateChanged(
locked_full_screen_enabled_.value());
}
}
} // namespace ash
......@@ -51,6 +51,7 @@ class ASH_PUBLIC_EXPORT AssistantStateProxy
mojom::AssistantAllowedState state) override;
void OnLocaleChanged(const std::string& locale) override;
void OnArcPlayStoreEnabledChanged(bool enabled) override;
void OnLockedFullScreenStateChanged(bool enabled) override;
base::ObserverList<DefaultVoiceInteractionObserver> observers_;
......
......@@ -35,6 +35,7 @@ class ASH_PUBLIC_EXPORT DefaultVoiceInteractionObserver
ash::mojom::AssistantAllowedState state) override {}
void OnLocaleChanged(const std::string& locale) override {}
void OnArcPlayStoreEnabledChanged(bool enabled) override {}
void OnLockedFullScreenStateChanged(bool enabled) override {}
protected:
DefaultVoiceInteractionObserver() = default;
......
......@@ -80,6 +80,9 @@ interface VoiceInteractionObserver {
// "en-US" or simply "en". When locale is not set in pref, it returns empty
// string.
OnLocaleChanged(string locale);
// Called when locked full screen state has changed.
OnLockedFullScreenStateChanged(bool enabled);
};
// Interface for ash client (Chrome) to connect to the voice interaction
......@@ -121,6 +124,9 @@ interface VoiceInteractionController {
// Called when Google Play Store is enabled/disabled.
NotifyArcPlayStoreEnabledChanged(bool enabled);
// Called when locked full screen state is enabled/disabled.
NotifyLockedFullScreenStateChanged(bool enabled);
// Add an observer.
AddObserver(VoiceInteractionObserver observer);
};
......
......@@ -144,6 +144,20 @@ void VoiceInteractionController::NotifyArcPlayStoreEnabledChanged(
observer.OnArcPlayStoreEnabledChanged(enabled);
}
void VoiceInteractionController::NotifyLockedFullScreenStateChanged(
bool enabled) {
if (locked_full_screen_enabled_ == enabled)
return;
locked_full_screen_enabled_ = enabled;
observers_.ForAllPtrs([enabled](auto* observer) {
observer->OnLockedFullScreenStateChanged(enabled);
});
for (auto& observer : local_observers_)
observer.OnLockedFullScreenStateChanged(enabled);
}
void VoiceInteractionController::AddObserver(
mojom::VoiceInteractionObserverPtr observer) {
InitObserver(observer.get());
......
......@@ -38,6 +38,7 @@ class ASH_EXPORT VoiceInteractionController
void NotifyLocaleChanged(const std::string& locale) override;
void NotifyLaunchWithMicOpen(bool launch_with_mic_open) override;
void NotifyArcPlayStoreEnabledChanged(bool enabled) override;
void NotifyLockedFullScreenStateChanged(bool enabled) override;
void AddObserver(mojom::VoiceInteractionObserverPtr observer) override;
// Adding local observers in the same process.
......
......@@ -5,6 +5,7 @@
#include "ash/voice_interaction/voice_interaction_controller.h"
#include <memory>
#include <utility>
#include "ash/public/interfaces/voice_interaction_controller.mojom.h"
#include "ash/shell.h"
......@@ -47,6 +48,7 @@ class TestVoiceInteractionObserver : public mojom::VoiceInteractionObserver {
void OnArcPlayStoreEnabledChanged(bool enabled) override {
arc_play_store_enabled_ = enabled;
}
void OnLockedFullScreenStateChanged(bool enabled) override {}
mojom::VoiceInteractionState voice_interaction_state() const {
return state_;
......
......@@ -68,4 +68,9 @@ void FakeVoiceInteractionController::NotifyArcPlayStoreEnabledChanged(
arc_play_store_enabled_ = enabled;
}
void FakeVoiceInteractionController::NotifyLockedFullScreenStateChanged(
bool enabled) {
locked_full_screen_enabled_ = enabled;
}
} // namespace arc
......@@ -32,6 +32,7 @@ class FakeVoiceInteractionController
void NotifyLocaleChanged(const std::string& locale) override;
void NotifyLaunchWithMicOpen(bool launch_with_mic_open) override;
void NotifyArcPlayStoreEnabledChanged(bool enabled) override;
void NotifyLockedFullScreenStateChanged(bool enabled) override;
void AddObserver(ash::mojom::VoiceInteractionObserverPtr observer) override {}
ash::mojom::VoiceInteractionState voice_interaction_state() const {
......@@ -58,6 +59,9 @@ class FakeVoiceInteractionController
const std::string& locale() const { return locale_; }
bool launch_with_mic_open() const { return launch_with_mic_open_; }
bool arc_play_store_enabled() const { return arc_play_store_enabled_; }
bool locked_full_screen_enabled() const {
return locked_full_screen_enabled_;
}
private:
ash::mojom::VoiceInteractionState voice_interaction_state_ =
......@@ -74,6 +78,7 @@ class FakeVoiceInteractionController
ash::mojom::AssistantAllowedState::DISALLOWED_BY_INCOGNITO;
bool launch_with_mic_open_ = false;
bool arc_play_store_enabled_ = false;
bool locked_full_screen_enabled_ = false;
mojo::Binding<ash::mojom::VoiceInteractionController> binding_;
......
......@@ -83,6 +83,11 @@ void VoiceInteractionControllerClient::NotifyStatusChanged(
observer.OnStateChanged(state);
}
void VoiceInteractionControllerClient::NotifyLockedFullScreenStateChanged(
bool enabled) {
voice_interaction_controller_->NotifyLockedFullScreenStateChanged(enabled);
}
void VoiceInteractionControllerClient::SetControllerForTesting(
ash::mojom::VoiceInteractionControllerPtr controller) {
voice_interaction_controller_ = std::move(controller);
......
......@@ -37,6 +37,8 @@ class VoiceInteractionControllerClient
// Notify the controller about state changes.
void NotifyStatusChanged(ash::mojom::VoiceInteractionState state);
void NotifyLockedFullScreenStateChanged(bool enabled);
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
......
......@@ -9,6 +9,8 @@
#include "base/metrics/histogram_macros.h"
#include "chrome/browser/chromeos/arc/arc_session_manager.h"
#include "chrome/browser/chromeos/arc/arc_util.h"
#include "chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.h"
#include "chrome/browser/chromeos/assistant/assistant_util.h"
#include "chrome/browser/ui/ash/chrome_screenshot_grabber.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_command_controller.h"
......@@ -60,6 +62,12 @@ void SetLockedFullscreenState(Browser* browser, bool locked) {
arc_session_manager->RequestEnable();
}
}
if (assistant::IsAssistantAllowedForProfile(profile) ==
ash::mojom::AssistantAllowedState::ALLOWED) {
arc::VoiceInteractionControllerClient::Get()
->NotifyLockedFullScreenStateChanged(locked);
}
}
} // namespace tabs_util
......
......@@ -187,12 +187,6 @@ void Service::OnSessionActivated(bool activated) {
void Service::OnLockStateChanged(bool locked) {
locked_ = locked;
if (assistant_manager_service_->GetState() !=
AssistantManagerService::State::RUNNING) {
return;
}
UpdateListeningState();
}
......@@ -212,6 +206,10 @@ void Service::OnArcPlayStoreEnabledChanged(bool enabled) {
UpdateAssistantManagerState();
}
void Service::OnLockedFullScreenStateChanged(bool enabled) {
UpdateListeningState();
}
void Service::OnVoiceInteractionHotwordAlwaysOn(bool always_on) {
// No need to update hotword status if power source is connected.
if (power_source_connected_)
......@@ -418,7 +416,15 @@ void Service::AddAshSessionObserver() {
}
void Service::UpdateListeningState() {
bool should_listen = !locked_ && session_active_;
if (assistant_manager_service_->GetState() !=
AssistantManagerService::State::RUNNING) {
return;
}
bool should_listen =
!locked_ &&
!assistant_state_.locked_full_screen_enabled().value_or(false) &&
session_active_;
DVLOG(1) << "Update assistant listening state: " << should_listen;
assistant_manager_service_->EnableListening(should_listen);
}
......
......@@ -136,6 +136,7 @@ class COMPONENT_EXPORT(ASSISTANT_SERVICE) Service
void OnVoiceInteractionHotwordAlwaysOn(bool always_on) override;
void OnLocaleChanged(const std::string& locale) override;
void OnArcPlayStoreEnabledChanged(bool enabled) override;
void OnLockedFullScreenStateChanged(bool enabled) override;
void UpdateAssistantManagerState();
void BindAssistantSettingsManager(
......
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