Commit 585182f7 authored by Ryan Cui's avatar Ryan Cui Committed by Commit Bot

Device actions interface for enabling WiFi

Interface is implemented by Chrome and a handle is passed to the assistant
service during initialization.

Design doc: go/croissant-device-actions

Bug: b/78189672
Change-Id: I3c5bfe94772d0a6d058e4736d481325318d0b461
Reviewed-on: https://chromium-review.googlesource.com/1110452
Commit-Queue: Ryan Cui <rcui@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarXiaohui Chen <xiaohuic@chromium.org>
Reviewed-by: default avatarSteven Bennetts <stevenjb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#571259}
parent f60c4211
......@@ -3763,6 +3763,8 @@ split_static_library("ui") {
"ash/assistant/assistant_image_downloader.h",
"ash/assistant/assistant_setup.cc",
"ash/assistant/assistant_setup.h",
"ash/assistant/device_actions.cc",
"ash/assistant/device_actions.h",
"ash/assistant/web_contents_manager.cc",
"ash/assistant/web_contents_manager.h",
]
......
......@@ -26,7 +26,8 @@ AssistantClient* AssistantClient::Get() {
return g_instance;
}
AssistantClient::AssistantClient() : client_binding_(this) {
AssistantClient::AssistantClient()
: client_binding_(this), device_actions_binding_(&device_actions_) {
DCHECK_EQ(nullptr, g_instance);
g_instance = this;
}
......@@ -46,7 +47,12 @@ void AssistantClient::MaybeInit(service_manager::Connector* connector) {
chromeos::assistant::mojom::ClientPtr client_ptr;
client_binding_.Bind(mojo::MakeRequest(&client_ptr));
assistant_connection_->Init(std::move(client_ptr));
chromeos::assistant::mojom::DeviceActionsPtr device_actions_ptr;
device_actions_binding_.Bind(mojo::MakeRequest(&device_actions_ptr));
assistant_connection_->Init(std::move(client_ptr),
std::move(device_actions_ptr));
assistant_image_downloader_ =
std::make_unique<AssistantImageDownloader>(connector);
......
......@@ -8,6 +8,7 @@
#include <memory>
#include "base/macros.h"
#include "chrome/browser/ui/ash/assistant/device_actions.h"
#include "chromeos/services/assistant/public/mojom/assistant.mojom.h"
#include "mojo/public/cpp/bindings/binding.h"
......@@ -36,8 +37,12 @@ class AssistantClient : chromeos::assistant::mojom::Client {
private:
mojo::Binding<chromeos::assistant::mojom::Client> client_binding_;
mojo::Binding<chromeos::assistant::mojom::DeviceActions>
device_actions_binding_;
chromeos::assistant::mojom::AssistantPlatformPtr assistant_connection_;
DeviceActions device_actions_;
std::unique_ptr<AssistantImageDownloader> assistant_image_downloader_;
std::unique_ptr<AssistantSetup> assistant_setup_;
......
// Copyright 2018 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 "chrome/browser/ui/ash/assistant/device_actions.h"
#include "chromeos/network/network_state_handler.h"
using chromeos::NetworkHandler;
using chromeos::NetworkStateHandler;
using chromeos::NetworkTypePattern;
DeviceActions::DeviceActions() {}
DeviceActions::~DeviceActions() = default;
void DeviceActions::SetWifiEnabled(bool enabled) {
NetworkHandler::Get()->network_state_handler()->SetTechnologyEnabled(
NetworkTypePattern::WiFi(), enabled,
chromeos::network_handler::ErrorCallback());
}
// Copyright 2018 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.
#ifndef CHROME_BROWSER_UI_ASH_ASSISTANT_DEVICE_ACTIONS_H_
#define CHROME_BROWSER_UI_ASH_ASSISTANT_DEVICE_ACTIONS_H_
#include "chromeos/services/assistant/public/mojom/assistant.mojom.h"
#include "mojo/public/cpp/bindings/binding.h"
class DeviceActions : public chromeos::assistant::mojom::DeviceActions {
public:
DeviceActions();
~DeviceActions() override;
// mojom::DeviceActions overrides:
void SetWifiEnabled(bool enable) override;
private:
DISALLOW_COPY_AND_ASSIGN(DeviceActions);
};
#endif // CHROME_BROWSER_UI_ASH_ASSISTANT_DEVICE_ACTIONS_H_
......@@ -65,6 +65,7 @@ source_set("lib") {
deps += [
"//chromeos/assistant/internal/action",
"//chromeos/assistant/internal/proto/google3",
"//libassistant/contrib/core",
"//libassistant/contrib/platform/audio",
"//libassistant/shared/internal_api/c:api_wrappers_for_caller_no_chromium",
......
......@@ -17,6 +17,7 @@
#include "build/util/webkit_version.h"
#include "chromeos/assistant/internal/internal_constants.h"
#include "chromeos/assistant/internal/internal_util.h"
#include "chromeos/assistant/internal/proto/google3/assistant/api/client_op/device_args.pb.h"
#include "chromeos/services/assistant/public/proto/assistant_device_settings_ui.pb.h"
#include "chromeos/services/assistant/public/proto/settings_ui.pb.h"
#include "chromeos/services/assistant/service.h"
......@@ -29,6 +30,8 @@
using assistant_client::ActionModule;
namespace api = ::assistant::api;
namespace chromeos {
namespace assistant {
......@@ -38,10 +41,12 @@ const char kBluetoothDeviceSettingId[] = "BLUETOOTH";
AssistantManagerServiceImpl::AssistantManagerServiceImpl(
service_manager::Connector* connector,
device::mojom::BatteryMonitorPtr battery_monitor,
mojom::Client* client)
mojom::Client* client,
mojom::DeviceActionsPtr device_actions)
: platform_api_(CreateLibAssistantConfig(),
connector,
std::move(battery_monitor)),
device_actions_(std::move(device_actions)),
action_module_(std::make_unique<action::CrosActionModule>(this)),
display_connection_(std::make_unique<CrosDisplayConnection>(this)),
main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()),
......@@ -277,10 +282,42 @@ void AssistantManagerServiceImpl::OnSpeechLevelUpdated(
weak_factory_.GetWeakPtr(), speech_level));
}
void AssistantManagerServiceImpl::OnModifySettingsAction(
const std::string& modify_setting_args_proto) {
api::client_op::ModifySettingArgs modify_setting_args;
modify_setting_args.ParseFromString(modify_setting_args_proto);
DCHECK(IsSettingSupported(modify_setting_args.setting_id()));
// TODO(rcui): Add support for bluetooth, etc.
if (modify_setting_args.setting_id() == kWiFiDeviceSettingId) {
switch (modify_setting_args.change()) {
case api::client_op::ModifySettingArgs_Change_ON:
device_actions_->SetWifiEnabled(true);
return;
case api::client_op::ModifySettingArgs_Change_OFF:
device_actions_->SetWifiEnabled(false);
return;
case api::client_op::ModifySettingArgs_Change_TOGGLE:
case api::client_op::ModifySettingArgs_Change_INCREASE:
case api::client_op::ModifySettingArgs_Change_DECREASE:
case api::client_op::ModifySettingArgs_Change_SET:
case api::client_op::ModifySettingArgs_Change_UNSPECIFIED:
break;
}
DLOG(ERROR) << "Unsupported change operation: "
<< modify_setting_args.change() << " for setting "
<< modify_setting_args.setting_id();
}
}
ActionModule::Result AssistantManagerServiceImpl::HandleModifySettingClientOp(
const std::string& modify_setting_args_proto) {
DVLOG(2) << "HandleModifySettingClientOp=" << modify_setting_args_proto;
// TODO(b/78184487): Wire up to Chrome API to update device setting.
main_thread_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&AssistantManagerServiceImpl::OnModifySettingsAction,
weak_factory_.GetWeakPtr(), modify_setting_args_proto));
return ActionModule::Result::Ok();
}
......@@ -291,6 +328,10 @@ bool AssistantManagerServiceImpl::IsSettingSupported(
setting_id == kBluetoothDeviceSettingId);
}
bool AssistantManagerServiceImpl::SupportsModifySettings() {
return true;
}
void AssistantManagerServiceImpl::OnVoiceInteractionSettingsEnabled(
bool enabled) {
assistant_enabled_ = enabled;
......
......@@ -57,7 +57,9 @@ class AssistantManagerServiceImpl
public:
AssistantManagerServiceImpl(service_manager::Connector* connector,
device::mojom::BatteryMonitorPtr battery_monitor,
mojom::Client* client);
mojom::Client* client,
mojom::DeviceActionsPtr device_actions);
~AssistantManagerServiceImpl() override;
// assistant::AssistantManagerService overrides
......@@ -109,6 +111,7 @@ class AssistantManagerServiceImpl
assistant_client::ActionModule::Result HandleModifySettingClientOp(
const std::string& modify_setting_args_proto) override;
bool IsSettingSupported(const std::string& setting_id) override;
bool SupportsModifySettings() override;
// ash::mojom::VoiceInteractionObserver:
void OnVoiceInteractionStatusChanged(
......@@ -153,6 +156,7 @@ class AssistantManagerServiceImpl
const assistant_client::ConversationStateListener::RecognitionResult&
recognition_result);
void OnSpeechLevelUpdatedOnMainThread(const float speech_level);
void OnModifySettingsAction(const std::string& modify_setting_args_proto);
void IsVoiceInteractionSetupCompleted(
ash::mojom::VoiceInteractionController::IsSetupCompletedCallback
......@@ -172,6 +176,7 @@ class AssistantManagerServiceImpl
std::unique_ptr<action::CrosActionModule> action_module_;
std::unique_ptr<assistant_client::AssistantManager> assistant_manager_;
std::unique_ptr<AssistantSettingsManagerImpl> assistant_settings_manager_;
mojom::DeviceActionsPtr device_actions_;
assistant_client::AssistantManagerInternal* assistant_manager_internal_;
std::unique_ptr<CrosDisplayConnection> display_connection_;
mojo::InterfacePtrSet<mojom::AssistantEventSubscriber> subscribers_;
......
......@@ -76,7 +76,8 @@ interface AssistantEventSubscriber {
interface AssistantPlatform {
// Initiates assistant and provides interfaces for assistant to call into the
// browser.
Init(Client assistant_client_interface);
Init(Client assistant_client_interface,
DeviceActions device_actions_interface);
};
// Interface for assistant to call into client.
......@@ -110,6 +111,12 @@ interface AudioInputObserver {
OnAudioInputClosed();
};
// Interface for assistant to call into browser to perform device actions.
interface DeviceActions {
// Enables or disables WiFi.
SetWifiEnabled(bool enabled);
};
// Enumeration of possible completions for an Assistant interaction.
enum AssistantInteractionResolution {
// Assistant interaction completed normally.
......
......@@ -159,14 +159,16 @@ void Service::RetryRefreshToken() {
&Service::RequestAccessToken);
}
void Service::Init(mojom::ClientPtr client) {
void Service::Init(mojom::ClientPtr client,
mojom::DeviceActionsPtr device_actions) {
client_ = std::move(client);
#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT)
device::mojom::BatteryMonitorPtr battery_monitor;
context()->connector()->BindInterface(device::mojom::kServiceName,
mojo::MakeRequest(&battery_monitor));
assistant_manager_service_ = std::make_unique<AssistantManagerServiceImpl>(
context()->connector(), std::move(battery_monitor), client_.get());
context()->connector(), std::move(battery_monitor), client_.get(),
std::move(device_actions));
#else
assistant_manager_service_ =
std::make_unique<FakeAssistantManagerServiceImpl>();
......
......@@ -68,7 +68,8 @@ class Service : public service_manager::Service,
void SuspendDone(const base::TimeDelta& sleep_duration) override;
// mojom::AssistantPlatform overrides:
void Init(mojom::ClientPtr client) override;
void Init(mojom::ClientPtr client,
mojom::DeviceActionsPtr device_actions) override;
// ash::mojom::SessionActivationObserver overrides:
void OnSessionActivated(bool activated) override;
......
......@@ -142,6 +142,25 @@ class FakeAudioInput : mojom::AudioInput {
DISALLOW_COPY_AND_ASSIGN(FakeAudioInput);
};
class FakeDeviceActions : mojom::DeviceActions {
public:
FakeDeviceActions() : binding_(this) {}
mojom::DeviceActionsPtr CreateInterfacePtrAndBind() {
mojom::DeviceActionsPtr ptr;
binding_.Bind(mojo::MakeRequest(&ptr));
return ptr;
}
private:
// mojom::DeviceActions:
void SetWifiEnabled(bool enabled) override {}
mojo::Binding<mojom::DeviceActions> binding_;
DISALLOW_COPY_AND_ASSIGN(FakeDeviceActions);
};
class ServiceTestClient : public service_manager::test::ServiceTestClient,
public service_manager::mojom::ServiceFactory {
public:
......@@ -211,7 +230,8 @@ class ServiceTest : public service_manager::test::ServiceTest {
void SetUp() override {
service_manager::test::ServiceTest::SetUp();
GetService()->Init(fake_assistant_client_->CreateInterfacePtrAndBind());
GetService()->Init(fake_assistant_client_->CreateInterfacePtrAndBind(),
fake_device_actions_->CreateInterfacePtrAndBind());
platform_service_.FlushForTesting();
base::RunLoop().RunUntilIdle();
}
......@@ -222,6 +242,7 @@ class ServiceTest : public service_manager::test::ServiceTest {
std::unique_ptr<service_manager::Service> CreateService() override {
fake_identity_manager_ = std::make_unique<FakeIdentityManager>();
fake_assistant_client_ = std::make_unique<FakeAssistantClient>();
fake_device_actions_ = std::make_unique<FakeDeviceActions>();
fake_audio_input_ = std::make_unique<FakeAudioInput>();
fake_assistant_manager_ptr_ = new FakeAssistantManagerServiceImpl();
......@@ -270,7 +291,9 @@ class ServiceTest : public service_manager::test::ServiceTest {
std::unique_ptr<FakeIdentityManager> fake_identity_manager_;
std::unique_ptr<FakeAssistantClient> fake_assistant_client_;
std::unique_ptr<FakeAudioInput> fake_audio_input_;
std::unique_ptr<FakeDeviceActions> fake_device_actions_;
FakeAssistantManagerServiceImpl* fake_assistant_manager_ptr_;
......
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