Commit 814448e9 authored by Yue Li's avatar Yue Li Committed by Commit Bot

Migrate methods from AssitantOptInUI into Handler

- migrate many methods into the handler
- update loading/error screen specs

Bug: b/78190629
Test: Manual
Cq-Include-Trybots: luci.chromium.try:closure_compilation
Change-Id: I7a590f547cc85309f982c58421f0984721a4f04b
Reviewed-on: https://chromium-review.googlesource.com/1112716Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Commit-Queue: Yue Li <updowndota@chromium.org>
Cr-Commit-Position: refs/heads/master@{#570113}
parent 87de9d51
...@@ -31,12 +31,12 @@ ...@@ -31,12 +31,12 @@
.title { .title {
font-size: 18px; font-size: 18px;
padding-bottom: 10px; padding: 32px 0 18px 0;
} }
.sub-title { .sub-title {
font-size: 12px; font-size: 12px;
padding: 8px 0 8px 0; padding-bottom: 8px;
} }
#loading-message { #loading-message {
......
...@@ -12,10 +12,10 @@ ...@@ -12,10 +12,10 @@
no-footer-padding no-header android> no-footer-padding no-header android>
<div slot="footer"> <div slot="footer">
<div id="error-container"> <div id="error-container">
<div class="title" <iron-icon src="assistant_logo.png">
i18n-content="assistantOptinLoadErrorTitle"></div> </iron-icon>
<div class="sub-title"> <div class="title" i18n-content="assistantOptinLoadErrorTitle"></div>
<div i18n-content="assistantOptinLoadErrorMessage"></div> <div class="sub-title" i18n-content="assistantOptinLoadErrorMessage">
</div> </div>
</div> </div>
<div id="loading-container"> <div id="loading-container">
......
...@@ -88,7 +88,7 @@ Polymer({ ...@@ -88,7 +88,7 @@ Polymer({
}.bind(this), 500); }.bind(this), 500);
this.loadingTimeout_ = window.setTimeout(function() { this.loadingTimeout_ = window.setTimeout(function() {
this.onErrorOccurred(); this.onErrorOccurred();
}.bind(this), 5000); }.bind(this), 3000);
}, },
/** /**
......
...@@ -95,6 +95,10 @@ cr.define('assistantOptin', function() { ...@@ -95,6 +95,10 @@ cr.define('assistantOptin', function() {
} }
}, },
closeDialog: function() {
chrome.send('dialogClose');
},
/** /**
* Show the given screen. * Show the given screen.
* *
......
...@@ -5,25 +5,214 @@ ...@@ -5,25 +5,214 @@
#include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_handler.h" #include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_handler.h"
#include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/grit/browser_resources.h"
#include "chrome/grit/generated_resources.h" #include "chrome/grit/generated_resources.h"
#include "chromeos/services/assistant/public/mojom/constants.mojom.h"
#include "chromeos/services/assistant/public/proto/settings_ui.pb.h"
#include "components/arc/arc_prefs.h"
#include "components/login/localized_values_builder.h" #include "components/login/localized_values_builder.h"
#include "components/prefs/pref_service.h"
#include "services/service_manager/public/cpp/connector.h"
#include "ui/base/l10n/l10n_util.h"
namespace chromeos {
namespace { namespace {
constexpr char kJsScreenPath[] = "assistantOptin"; constexpr char kJsScreenPath[] = "assistantOptin";
} // namespace // Construct SettingsUiSelector for the ConsentFlow UI.
assistant::SettingsUiSelector GetSettingsUiSelector() {
assistant::SettingsUiSelector selector;
assistant::ConsentFlowUiSelector* consent_flow_ui =
selector.mutable_consent_flow_ui_selector();
consent_flow_ui->set_flow_id(assistant::ActivityControlSettingsUiSelector::
ASSISTANT_SUW_ONBOARDING_ON_CHROME_OS);
selector.set_email_opt_in(true);
return selector;
}
namespace chromeos { // Construct SettingsUiUpdate for user opt-in.
assistant::SettingsUiUpdate GetSettingsUiUpdate(
const std::string& consent_token) {
assistant::SettingsUiUpdate update;
assistant::ConsentFlowUiUpdate* consent_flow_update =
update.mutable_consent_flow_ui_update();
consent_flow_update->set_flow_id(
assistant::ActivityControlSettingsUiSelector::
ASSISTANT_SUW_ONBOARDING_ON_CHROME_OS);
consent_flow_update->set_consent_token(consent_token);
return update;
}
// Construct SettingsUiUpdate for email opt-in.
assistant::SettingsUiUpdate GetEmailOptInUpdate(bool opted_in) {
assistant::SettingsUiUpdate update;
assistant::EmailOptInUpdate* email_optin_update =
update.mutable_email_opt_in_update();
email_optin_update->set_email_opt_in_update_state(
opted_in ? assistant::EmailOptInUpdate::OPT_IN
: assistant::EmailOptInUpdate::OPT_OUT);
return update;
}
using SettingZippyList = google::protobuf::RepeatedPtrField<
assistant::ClassicActivityControlUiTexts::SettingZippy>;
// Helper method to create zippy data.
base::ListValue CreateZippyData(const SettingZippyList& zippy_list) {
base::ListValue zippy_data;
for (auto& setting_zippy : zippy_list) {
base::DictionaryValue data;
data.SetString("title", setting_zippy.title());
if (setting_zippy.description_paragraph_size()) {
data.SetString("description", setting_zippy.description_paragraph(0));
}
if (setting_zippy.additional_info_paragraph_size()) {
data.SetString("additionalInfo",
setting_zippy.additional_info_paragraph(0));
}
data.SetString("iconUri", setting_zippy.icon_uri());
zippy_data.GetList().push_back(std::move(data));
}
return zippy_data;
}
// Helper method to create disclosure data.
base::ListValue CreateDisclosureData(const SettingZippyList& disclosure_list) {
base::ListValue disclosure_data;
for (auto& disclosure : disclosure_list) {
base::DictionaryValue data;
data.SetString("title", disclosure.title());
if (disclosure.description_paragraph_size()) {
data.SetString("description", disclosure.description_paragraph(0));
}
if (disclosure.additional_info_paragraph_size()) {
data.SetString("additionalInfo", disclosure.additional_info_paragraph(0));
}
data.SetString("iconUri", disclosure.icon_uri());
disclosure_data.GetList().push_back(std::move(data));
}
return disclosure_data;
}
// Helper method to create get more screen data.
base::ListValue CreateGetMoreData(
bool email_optin_needed,
const assistant::EmailOptInUi& email_optin_ui) {
base::ListValue get_more_data;
// Process screen context data.
base::DictionaryValue context_data;
context_data.SetString(
"title", l10n_util::GetStringUTF16(IDS_ASSISTANT_SCREEN_CONTEXT_TITLE));
context_data.SetString("description", l10n_util::GetStringUTF16(
IDS_ASSISTANT_SCREEN_CONTEXT_DESC));
context_data.SetBoolean("defaultEnabled", true);
context_data.SetString("iconUri",
"https://www.gstatic.com/images/icons/material/system/"
"2x/laptop_chromebook_grey600_24dp.png");
get_more_data.GetList().push_back(std::move(context_data));
// Process email optin data.
if (email_optin_needed) {
base::DictionaryValue data;
data.SetString("title", email_optin_ui.title());
data.SetString("description", email_optin_ui.description());
data.SetBoolean("defaultEnabled", email_optin_ui.default_enabled());
data.SetString("iconUri", email_optin_ui.icon_uri());
get_more_data.GetList().push_back(std::move(data));
}
return get_more_data;
}
// Get string constants for settings ui.
base::DictionaryValue GetSettingsUiStrings(
const assistant::SettingsUi& settings_ui,
bool activity_control_needed) {
auto consent_ui = settings_ui.consent_flow_ui().consent_ui();
auto confirm_reject_ui = consent_ui.activity_control_confirm_reject_ui();
auto activity_control_ui = consent_ui.activity_control_ui();
auto third_party_disclosure_ui = consent_ui.third_party_disclosure_ui();
base::DictionaryValue dictionary;
// Add activity controll string constants.
if (activity_control_needed) {
dictionary.SetString("valuePropIdentity", activity_control_ui.identity());
if (activity_control_ui.intro_text_paragraph_size()) {
dictionary.SetString("valuePropIntro",
activity_control_ui.intro_text_paragraph(0));
}
if (activity_control_ui.footer_paragraph_size()) {
dictionary.SetString("valuePropFooter",
activity_control_ui.footer_paragraph(0));
}
dictionary.SetString("valuePropNextButton",
consent_ui.accept_button_text());
dictionary.SetString("valuePropSkipButton",
consent_ui.reject_button_text());
}
// Add confirm reject screen string constants.
// TODO(updowndota) Use remote strings after server bug fixed.
dictionary.SetString(
"confirmRejectTitle",
l10n_util::GetStringUTF16(IDS_ASSISTANT_CONFIRM_SCREEN_TITLE));
dictionary.SetString(
"confirmRejectAcceptTitle",
l10n_util::GetStringUTF16(IDS_ASSISTANT_CONFIRM_SCREEN_ACCEPT_TITLE));
dictionary.SetString(
"confirmRejectAcceptMessage",
l10n_util::GetStringUTF16(IDS_ASSISTANT_CONFIRM_SCREEN_ACCEPT_MESSAGE));
dictionary.SetString(
"confirmRejectAcceptMessageExpanded",
l10n_util::GetStringUTF16(
IDS_ASSISTANT_CONFIRM_SCREEN_ACCEPT_MESSAGE_EXPANDED));
dictionary.SetString(
"confirmRejectRejectTitle",
l10n_util::GetStringUTF16(IDS_ASSISTANT_CONFIRM_SCREEN_REJECT_TITLE));
dictionary.SetString(
"confirmRejectRejectMessage",
l10n_util::GetStringUTF16(IDS_ASSISTANT_CONFIRM_SCREEN_REJECT_MESSAGE));
dictionary.SetString(
"confirmRejectContinueButton",
l10n_util::GetStringUTF16(IDS_ASSISTANT_CONTINUE_BUTTON));
// Add third party string constants.
dictionary.SetString(
"thirdPartyTitle",
l10n_util::GetStringUTF16(IDS_ASSISTANT_THIRD_PARTY_SCREEN_TITLE));
dictionary.SetString(
"thirdPartyContinueButton",
l10n_util::GetStringUTF16(IDS_ASSISTANT_CONTINUE_BUTTON));
dictionary.SetString("thirdPartyFooter", consent_ui.tos_pp_links());
// Add get more screen string constants.
dictionary.SetString(
"getMoreTitle",
l10n_util::GetStringUTF16(IDS_ASSISTANT_GET_MORE_SCREEN_TITLE));
dictionary.SetString(
"getMoreContinueButton",
l10n_util::GetStringUTF16(IDS_ASSISTANT_CONTINUE_BUTTON));
return dictionary;
}
} // namespace
AssistantOptInHandler::AssistantOptInHandler( AssistantOptInHandler::AssistantOptInHandler(
JSCallsContainer* js_calls_container) JSCallsContainer* js_calls_container)
: BaseWebUIHandler(js_calls_container) { : BaseWebUIHandler(js_calls_container), weak_factory_(this) {
DCHECK(js_calls_container); DCHECK(js_calls_container);
set_call_js_prefix(kJsScreenPath); set_call_js_prefix(kJsScreenPath);
} }
AssistantOptInHandler::~AssistantOptInHandler() = default; AssistantOptInHandler::~AssistantOptInHandler() {
arc::VoiceInteractionControllerClient::Get()->RemoveObserver(this);
}
void AssistantOptInHandler::DeclareLocalizedValues( void AssistantOptInHandler::DeclareLocalizedValues(
::login::LocalizedValuesBuilder* builder) {} ::login::LocalizedValuesBuilder* builder) {}
...@@ -32,7 +221,72 @@ void AssistantOptInHandler::RegisterMessages() { ...@@ -32,7 +221,72 @@ void AssistantOptInHandler::RegisterMessages() {
AddCallback("initialized", &AssistantOptInHandler::HandleInitialized); AddCallback("initialized", &AssistantOptInHandler::HandleInitialized);
} }
void AssistantOptInHandler::Initialize() {} void AssistantOptInHandler::Initialize() {
if (arc::VoiceInteractionControllerClient::Get()->voice_interaction_state() !=
ash::mojom::VoiceInteractionState::RUNNING) {
arc::VoiceInteractionControllerClient::Get()->AddObserver(this);
} else {
BindAssistantSettingsManager();
}
}
void AssistantOptInHandler::ShowNextScreen() {
CallJSOrDefer("showNextScreen");
}
void AssistantOptInHandler::OnActivityControlOptInResult(bool opted_in) {
if (opted_in) {
settings_manager_->UpdateSettings(
GetSettingsUiUpdate(consent_token_).SerializeAsString(),
base::BindOnce(&AssistantOptInHandler::OnUpdateSettingsResponse,
weak_factory_.GetWeakPtr()));
} else {
PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs();
prefs->SetBoolean(arc::prefs::kArcVoiceInteractionValuePropAccepted, false);
prefs->SetBoolean(arc::prefs::kVoiceInteractionEnabled, false);
CallJSOrDefer("closeDialog");
}
}
void AssistantOptInHandler::OnEmailOptInResult(bool opted_in) {
if (!email_optin_needed_) {
DCHECK(!opted_in);
ShowNextScreen();
return;
}
settings_manager_->UpdateSettings(
GetEmailOptInUpdate(opted_in).SerializeAsString(),
base::BindOnce(&AssistantOptInHandler::OnUpdateSettingsResponse,
weak_factory_.GetWeakPtr()));
}
void AssistantOptInHandler::OnStateChanged(
ash::mojom::VoiceInteractionState state) {
if (state == ash::mojom::VoiceInteractionState::RUNNING)
BindAssistantSettingsManager();
}
void AssistantOptInHandler::BindAssistantSettingsManager() {
if (settings_manager_.is_bound())
return;
// Set up settings mojom.
service_manager::Connector* connector =
content::BrowserContext::GetConnectorFor(Profile::FromWebUI(web_ui()));
connector->BindInterface(assistant::mojom::kServiceName,
mojo::MakeRequest(&settings_manager_));
SendGetSettingsRequest();
}
void AssistantOptInHandler::SendGetSettingsRequest() {
assistant::SettingsUiSelector selector = GetSettingsUiSelector();
settings_manager_->GetSettings(
selector.SerializeAsString(),
base::BindOnce(&AssistantOptInHandler::OnGetSettingsResponse,
weak_factory_.GetWeakPtr()));
}
void AssistantOptInHandler::ReloadContent(const base::DictionaryValue& dict) { void AssistantOptInHandler::ReloadContent(const base::DictionaryValue& dict) {
CallJSOrDefer("reloadContent", dict); CallJSOrDefer("reloadContent", dict);
...@@ -43,8 +297,73 @@ void AssistantOptInHandler::AddSettingZippy(const std::string& type, ...@@ -43,8 +297,73 @@ void AssistantOptInHandler::AddSettingZippy(const std::string& type,
CallJSOrDefer("addSettingZippy", type, data); CallJSOrDefer("addSettingZippy", type, data);
} }
void AssistantOptInHandler::ShowNextScreen() { void AssistantOptInHandler::OnGetSettingsResponse(const std::string& settings) {
CallJSOrDefer("showNextScreen"); assistant::SettingsUi settings_ui;
settings_ui.ParseFromString(settings);
DCHECK(settings_ui.has_consent_flow_ui());
auto consent_ui = settings_ui.consent_flow_ui().consent_ui();
auto activity_control_ui = consent_ui.activity_control_ui();
auto confirm_reject_ui = consent_ui.activity_control_confirm_reject_ui();
auto third_party_disclosure_ui = consent_ui.third_party_disclosure_ui();
consent_token_ = activity_control_ui.consent_token();
// Process activity control data.
if (!activity_control_ui.setting_zippy().size()) {
// No need to consent. Move to the next screen.
activity_control_needed_ = false;
PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs();
prefs->SetBoolean(arc::prefs::kArcVoiceInteractionValuePropAccepted, true);
prefs->SetBoolean(arc::prefs::kVoiceInteractionEnabled, true);
ShowNextScreen();
} else {
AddSettingZippy("settings",
CreateZippyData(activity_control_ui.setting_zippy()));
}
// Process third party disclosure data.
AddSettingZippy("disclosure", CreateDisclosureData(
third_party_disclosure_ui.disclosures()));
// Process get more data.
email_optin_needed_ = settings_ui.has_email_opt_in_ui() &&
settings_ui.email_opt_in_ui().has_title();
AddSettingZippy("get-more", CreateGetMoreData(email_optin_needed_,
settings_ui.email_opt_in_ui()));
// Pass string constants dictionary.
ReloadContent(GetSettingsUiStrings(settings_ui, activity_control_needed_));
}
void AssistantOptInHandler::OnUpdateSettingsResponse(
const std::string& result) {
assistant::SettingsUiUpdateResult ui_result;
ui_result.ParseFromString(result);
if (ui_result.has_consent_flow_update_result()) {
if (ui_result.consent_flow_update_result().update_status() !=
assistant::ConsentFlowUiUpdateResult::SUCCESS) {
// TODO(updowndta): Handle consent update failure.
LOG(ERROR) << "Consent udpate error.";
} else if (activity_control_needed_) {
activity_control_needed_ = false;
PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs();
prefs->SetBoolean(arc::prefs::kArcVoiceInteractionValuePropAccepted,
true);
prefs->SetBoolean(arc::prefs::kVoiceInteractionEnabled, true);
}
}
if (ui_result.has_email_opt_in_update_result()) {
if (ui_result.email_opt_in_update_result().update_status() !=
assistant::EmailOptInUpdateResult::SUCCESS) {
// TODO(updowndta): Handle email optin update failure.
LOG(ERROR) << "Email OptIn udpate error.";
}
}
ShowNextScreen();
} }
void AssistantOptInHandler::HandleInitialized() { void AssistantOptInHandler::HandleInitialized() {
......
...@@ -9,11 +9,15 @@ ...@@ -9,11 +9,15 @@
#include <string> #include <string>
#include "base/macros.h" #include "base/macros.h"
#include "chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.h"
#include "chrome/browser/ui/webui/chromeos/login/base_webui_handler.h" #include "chrome/browser/ui/webui/chromeos/login/base_webui_handler.h"
#include "chromeos/services/assistant/public/mojom/settings.mojom.h"
namespace chromeos { namespace chromeos {
class AssistantOptInHandler : public BaseWebUIHandler { class AssistantOptInHandler
: public BaseWebUIHandler,
public arc::VoiceInteractionControllerClient::Observer {
public: public:
explicit AssistantOptInHandler(JSCallsContainer* js_calls_container); explicit AssistantOptInHandler(JSCallsContainer* js_calls_container);
~AssistantOptInHandler() override; ~AssistantOptInHandler() override;
...@@ -24,15 +28,46 @@ class AssistantOptInHandler : public BaseWebUIHandler { ...@@ -24,15 +28,46 @@ class AssistantOptInHandler : public BaseWebUIHandler {
void RegisterMessages() override; void RegisterMessages() override;
void Initialize() override; void Initialize() override;
// Send messages to the page.
void ShowNextScreen();
// Handle user opt-in result.
void OnActivityControlOptInResult(bool opted_in);
void OnEmailOptInResult(bool opted_in);
private:
// arc::VoiceInteractionControllerClient::Observer overrides
void OnStateChanged(ash::mojom::VoiceInteractionState state) override;
// Connect to assistant settings manager.
void BindAssistantSettingsManager();
// Send GetSettings request for the opt-in UI.
void SendGetSettingsRequest();
// Send message and consent data to the page. // Send message and consent data to the page.
void ReloadContent(const base::DictionaryValue& dict); void ReloadContent(const base::DictionaryValue& dict);
void AddSettingZippy(const std::string& type, const base::ListValue& data); void AddSettingZippy(const std::string& type, const base::ListValue& data);
void ShowNextScreen();
private: // Handle response from the settings manager.
void OnGetSettingsResponse(const std::string& settings);
void OnUpdateSettingsResponse(const std::string& settings);
// Handler for JS WebUI message. // Handler for JS WebUI message.
void HandleInitialized(); void HandleInitialized();
// Consent token used to complete the opt-in.
std::string consent_token_;
// Whether activity control is needed for user.
bool activity_control_needed_ = true;
// Whether email optin is needed for user.
bool email_optin_needed_ = false;
assistant::mojom::AssistantSettingsManagerPtr settings_manager_;
base::WeakPtrFactory<AssistantOptInHandler> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(AssistantOptInHandler); DISALLOW_COPY_AND_ASSIGN(AssistantOptInHandler);
}; };
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/macros.h" #include "base/macros.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/webui/chromeos/assistant_optin/confirm_reject_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/assistant_optin/confirm_reject_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/assistant_optin/get_more_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/assistant_optin/get_more_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/assistant_optin/ready_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/assistant_optin/ready_screen_handler.h"
...@@ -18,15 +17,8 @@ ...@@ -18,15 +17,8 @@
#include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
#include "chrome/common/url_constants.h" #include "chrome/common/url_constants.h"
#include "chrome/grit/browser_resources.h" #include "chrome/grit/browser_resources.h"
#include "chrome/grit/generated_resources.h"
#include "chromeos/services/assistant/public/mojom/constants.mojom.h"
#include "chromeos/services/assistant/public/proto/settings_ui.pb.h"
#include "components/arc/arc_prefs.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h" #include "content/public/browser/web_ui_data_source.h"
#include "services/service_manager/public/cpp/connector.h"
#include "ui/base/l10n/l10n_util.h"
namespace chromeos { namespace chromeos {
...@@ -37,185 +29,6 @@ bool is_active = false; ...@@ -37,185 +29,6 @@ bool is_active = false;
constexpr int kAssistantOptInDialogWidth = 576; constexpr int kAssistantOptInDialogWidth = 576;
constexpr int kAssistantOptInDialogHeight = 480; constexpr int kAssistantOptInDialogHeight = 480;
// Construct SettingsUiSelector for the ConsentFlow UI.
assistant::SettingsUiSelector GetSettingsUiSelector() {
assistant::SettingsUiSelector selector;
assistant::ConsentFlowUiSelector* consent_flow_ui =
selector.mutable_consent_flow_ui_selector();
consent_flow_ui->set_flow_id(assistant::ActivityControlSettingsUiSelector::
ASSISTANT_SUW_ONBOARDING_ON_CHROME_OS);
selector.set_email_opt_in(true);
return selector;
}
// Construct SettingsUiUpdate for user opt-in.
assistant::SettingsUiUpdate GetSettingsUiUpdate(
const std::string& consent_token) {
assistant::SettingsUiUpdate update;
assistant::ConsentFlowUiUpdate* consent_flow_update =
update.mutable_consent_flow_ui_update();
consent_flow_update->set_flow_id(
assistant::ActivityControlSettingsUiSelector::
ASSISTANT_SUW_ONBOARDING_ON_CHROME_OS);
consent_flow_update->set_consent_token(consent_token);
return update;
}
// Construct SettingsUiUpdate for email opt-in.
assistant::SettingsUiUpdate GetEmailOptInUpdate(bool opted_in) {
assistant::SettingsUiUpdate update;
assistant::EmailOptInUpdate* email_optin_update =
update.mutable_email_opt_in_update();
email_optin_update->set_email_opt_in_update_state(
opted_in ? assistant::EmailOptInUpdate::OPT_IN
: assistant::EmailOptInUpdate::OPT_OUT);
return update;
}
using SettingZippyList = google::protobuf::RepeatedPtrField<
assistant::ClassicActivityControlUiTexts::SettingZippy>;
// Helper method to create zippy data.
base::ListValue CreateZippyData(const SettingZippyList& zippy_list) {
base::ListValue zippy_data;
for (auto& setting_zippy : zippy_list) {
base::DictionaryValue data;
data.SetString("title", setting_zippy.title());
if (setting_zippy.description_paragraph_size()) {
data.SetString("description", setting_zippy.description_paragraph(0));
}
if (setting_zippy.additional_info_paragraph_size()) {
data.SetString("additionalInfo",
setting_zippy.additional_info_paragraph(0));
}
data.SetString("iconUri", setting_zippy.icon_uri());
zippy_data.GetList().push_back(std::move(data));
}
return zippy_data;
}
// Helper method to create disclosure data.
base::ListValue CreateDisclosureData(const SettingZippyList& disclosure_list) {
base::ListValue disclosure_data;
for (auto& disclosure : disclosure_list) {
base::DictionaryValue data;
data.SetString("title", disclosure.title());
if (disclosure.description_paragraph_size()) {
data.SetString("description", disclosure.description_paragraph(0));
}
if (disclosure.additional_info_paragraph_size()) {
data.SetString("additionalInfo", disclosure.additional_info_paragraph(0));
}
data.SetString("iconUri", disclosure.icon_uri());
disclosure_data.GetList().push_back(std::move(data));
}
return disclosure_data;
}
// Helper method to create get more screen data.
base::ListValue CreateGetMoreData(
bool email_optin_needed,
const assistant::EmailOptInUi& email_optin_ui) {
base::ListValue get_more_data;
// Process screen context data.
base::DictionaryValue context_data;
context_data.SetString(
"title", l10n_util::GetStringUTF16(IDS_ASSISTANT_SCREEN_CONTEXT_TITLE));
context_data.SetString("description", l10n_util::GetStringUTF16(
IDS_ASSISTANT_SCREEN_CONTEXT_DESC));
context_data.SetBoolean("defaultEnabled", true);
context_data.SetString("iconUri",
"https://www.gstatic.com/images/icons/material/system/"
"2x/laptop_chromebook_grey600_24dp.png");
get_more_data.GetList().push_back(std::move(context_data));
// Process email optin data.
if (email_optin_needed) {
base::DictionaryValue data;
data.SetString("title", email_optin_ui.title());
data.SetString("description", email_optin_ui.description());
data.SetBoolean("defaultEnabled", email_optin_ui.default_enabled());
data.SetString("iconUri", email_optin_ui.icon_uri());
get_more_data.GetList().push_back(std::move(data));
}
return get_more_data;
}
// Get string constants for settings ui.
base::DictionaryValue GetSettingsUiStrings(
const assistant::SettingsUi& settings_ui,
bool activity_control_needed) {
auto consent_ui = settings_ui.consent_flow_ui().consent_ui();
auto confirm_reject_ui = consent_ui.activity_control_confirm_reject_ui();
auto activity_control_ui = consent_ui.activity_control_ui();
auto third_party_disclosure_ui = consent_ui.third_party_disclosure_ui();
base::DictionaryValue dictionary;
// Add activity controll string constants.
if (activity_control_needed) {
dictionary.SetString("valuePropIdentity", activity_control_ui.identity());
if (activity_control_ui.intro_text_paragraph_size()) {
dictionary.SetString("valuePropIntro",
activity_control_ui.intro_text_paragraph(0));
}
if (activity_control_ui.footer_paragraph_size()) {
dictionary.SetString("valuePropFooter",
activity_control_ui.footer_paragraph(0));
}
dictionary.SetString("valuePropNextButton",
consent_ui.accept_button_text());
dictionary.SetString("valuePropSkipButton",
consent_ui.reject_button_text());
}
// Add confirm reject screen string constants.
// TODO(updowndota) Use remote strings after server bug fixed.
dictionary.SetString(
"confirmRejectTitle",
l10n_util::GetStringUTF16(IDS_ASSISTANT_CONFIRM_SCREEN_TITLE));
dictionary.SetString(
"confirmRejectAcceptTitle",
l10n_util::GetStringUTF16(IDS_ASSISTANT_CONFIRM_SCREEN_ACCEPT_TITLE));
dictionary.SetString(
"confirmRejectAcceptMessage",
l10n_util::GetStringUTF16(IDS_ASSISTANT_CONFIRM_SCREEN_ACCEPT_MESSAGE));
dictionary.SetString(
"confirmRejectAcceptMessageExpanded",
l10n_util::GetStringUTF16(
IDS_ASSISTANT_CONFIRM_SCREEN_ACCEPT_MESSAGE_EXPANDED));
dictionary.SetString(
"confirmRejectRejectTitle",
l10n_util::GetStringUTF16(IDS_ASSISTANT_CONFIRM_SCREEN_REJECT_TITLE));
dictionary.SetString(
"confirmRejectRejectMessage",
l10n_util::GetStringUTF16(IDS_ASSISTANT_CONFIRM_SCREEN_REJECT_MESSAGE));
dictionary.SetString(
"confirmRejectContinueButton",
l10n_util::GetStringUTF16(IDS_ASSISTANT_CONTINUE_BUTTON));
// Add third party string constants.
dictionary.SetString(
"thirdPartyTitle",
l10n_util::GetStringUTF16(IDS_ASSISTANT_THIRD_PARTY_SCREEN_TITLE));
dictionary.SetString(
"thirdPartyContinueButton",
l10n_util::GetStringUTF16(IDS_ASSISTANT_CONTINUE_BUTTON));
dictionary.SetString("thirdPartyFooter", consent_ui.tos_pp_links());
// Add get more screen string constants.
dictionary.SetString(
"getMoreTitle",
l10n_util::GetStringUTF16(IDS_ASSISTANT_GET_MORE_SCREEN_TITLE));
dictionary.SetString(
"getMoreContinueButton",
l10n_util::GetStringUTF16(IDS_ASSISTANT_CONTINUE_BUTTON));
return dictionary;
}
} // namespace } // namespace
AssistantOptInUI::AssistantOptInUI(content::WebUI* web_ui) AssistantOptInUI::AssistantOptInUI(content::WebUI* web_ui)
...@@ -226,10 +39,11 @@ AssistantOptInUI::AssistantOptInUI(content::WebUI* web_ui) ...@@ -226,10 +39,11 @@ AssistantOptInUI::AssistantOptInUI(content::WebUI* web_ui)
js_calls_container_ = std::make_unique<JSCallsContainer>(); js_calls_container_ = std::make_unique<JSCallsContainer>();
auto base_handler = auto assistant_handler =
std::make_unique<AssistantOptInHandler>(js_calls_container_.get()); std::make_unique<AssistantOptInHandler>(js_calls_container_.get());
assistant_handler_ = base_handler.get(); assistant_handler_ = assistant_handler.get();
AddScreenHandler(std::move(base_handler)); AddScreenHandler(std::move(assistant_handler));
assistant_handler_->Initialize();
AddScreenHandler(std::make_unique<ValuePropScreenHandler>( AddScreenHandler(std::make_unique<ValuePropScreenHandler>(
base::BindOnce(&AssistantOptInUI::OnExit, weak_factory_.GetWeakPtr()))); base::BindOnce(&AssistantOptInUI::OnExit, weak_factory_.GetWeakPtr())));
...@@ -251,42 +65,9 @@ AssistantOptInUI::AssistantOptInUI(content::WebUI* web_ui) ...@@ -251,42 +65,9 @@ AssistantOptInUI::AssistantOptInUI(content::WebUI* web_ui)
source->AddResourcePath("assistant_logo.png", IDR_ASSISTANT_LOGO_PNG); source->AddResourcePath("assistant_logo.png", IDR_ASSISTANT_LOGO_PNG);
source->SetDefaultResource(IDR_ASSISTANT_OPTIN_HTML); source->SetDefaultResource(IDR_ASSISTANT_OPTIN_HTML);
content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source); content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source);
if (arc::VoiceInteractionControllerClient::Get()->voice_interaction_state() !=
ash::mojom::VoiceInteractionState::RUNNING) {
arc::VoiceInteractionControllerClient::Get()->AddObserver(this);
} else {
Initialize();
}
}
AssistantOptInUI::~AssistantOptInUI() {
arc::VoiceInteractionControllerClient::Get()->RemoveObserver(this);
}
void AssistantOptInUI::OnStateChanged(ash::mojom::VoiceInteractionState state) {
if (state == ash::mojom::VoiceInteractionState::RUNNING)
Initialize();
} }
void AssistantOptInUI::Initialize() { AssistantOptInUI::~AssistantOptInUI() = default;
if (settings_manager_.is_bound())
return;
// Set up settings mojom.
Profile* const profile = Profile::FromWebUI(web_ui());
service_manager::Connector* connector =
content::BrowserContext::GetConnectorFor(profile);
connector->BindInterface(assistant::mojom::kServiceName,
mojo::MakeRequest(&settings_manager_));
// Send GetSettings request for the ConsentFlow UI.
assistant::SettingsUiSelector selector = GetSettingsUiSelector();
settings_manager_->GetSettings(
selector.SerializeAsString(),
base::BindOnce(&AssistantOptInUI::OnGetSettingsResponse,
weak_factory_.GetWeakPtr()));
}
void AssistantOptInUI::AddScreenHandler( void AssistantOptInUI::AddScreenHandler(
std::unique_ptr<BaseWebUIHandler> handler) { std::unique_ptr<BaseWebUIHandler> handler) {
...@@ -300,124 +81,28 @@ void AssistantOptInUI::OnExit(AssistantOptInScreenExitCode exit_code) { ...@@ -300,124 +81,28 @@ void AssistantOptInUI::OnExit(AssistantOptInScreenExitCode exit_code) {
assistant_handler_->ShowNextScreen(); assistant_handler_->ShowNextScreen();
break; break;
case AssistantOptInScreenExitCode::VALUE_PROP_ACCEPTED: case AssistantOptInScreenExitCode::VALUE_PROP_ACCEPTED:
OnActivityControlOptInResult(true); assistant_handler_->OnActivityControlOptInResult(true);
break; break;
case AssistantOptInScreenExitCode::CONFIRM_ACCEPTED: case AssistantOptInScreenExitCode::CONFIRM_ACCEPTED:
OnActivityControlOptInResult(true); assistant_handler_->OnActivityControlOptInResult(true);
break; break;
case AssistantOptInScreenExitCode::CONFIRM_REJECTED: case AssistantOptInScreenExitCode::CONFIRM_REJECTED:
OnActivityControlOptInResult(false); assistant_handler_->OnActivityControlOptInResult(false);
break; break;
case AssistantOptInScreenExitCode::THIRD_PARTY_CONTINUED: case AssistantOptInScreenExitCode::THIRD_PARTY_CONTINUED:
assistant_handler_->ShowNextScreen(); assistant_handler_->ShowNextScreen();
break; break;
case AssistantOptInScreenExitCode::EMAIL_OPTED_IN: case AssistantOptInScreenExitCode::EMAIL_OPTED_IN:
DCHECK(email_optin_needed_); assistant_handler_->OnEmailOptInResult(true);
OnEmailOptInResult(true);
break; break;
case AssistantOptInScreenExitCode::EMAIL_OPTED_OUT: case AssistantOptInScreenExitCode::EMAIL_OPTED_OUT:
if (email_optin_needed_) assistant_handler_->OnEmailOptInResult(false);
OnEmailOptInResult(false);
else
assistant_handler_->ShowNextScreen();
break; break;
default: default:
NOTREACHED(); NOTREACHED();
} }
} }
void AssistantOptInUI::OnActivityControlOptInResult(bool opted_in) {
if (opted_in) {
settings_manager_->UpdateSettings(
GetSettingsUiUpdate(consent_token_).SerializeAsString(),
base::BindOnce(&AssistantOptInUI::OnUpdateSettingsResponse,
weak_factory_.GetWeakPtr()));
} else {
PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs();
prefs->SetBoolean(arc::prefs::kArcVoiceInteractionValuePropAccepted, false);
prefs->SetBoolean(arc::prefs::kVoiceInteractionEnabled, false);
CloseDialog(nullptr);
}
}
void AssistantOptInUI::OnEmailOptInResult(bool opted_in) {
settings_manager_->UpdateSettings(
GetEmailOptInUpdate(opted_in).SerializeAsString(),
base::BindOnce(&AssistantOptInUI::OnUpdateSettingsResponse,
weak_factory_.GetWeakPtr()));
}
void AssistantOptInUI::OnGetSettingsResponse(const std::string& settings) {
assistant::SettingsUi settings_ui;
settings_ui.ParseFromString(settings);
DCHECK(settings_ui.has_consent_flow_ui());
auto consent_ui = settings_ui.consent_flow_ui().consent_ui();
auto activity_control_ui = consent_ui.activity_control_ui();
auto confirm_reject_ui = consent_ui.activity_control_confirm_reject_ui();
auto third_party_disclosure_ui = consent_ui.third_party_disclosure_ui();
consent_token_ = activity_control_ui.consent_token();
// Process activity control data.
if (!activity_control_ui.setting_zippy().size()) {
// No need to consent. Move to the next screen.
activity_control_needed_ = false;
PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs();
prefs->SetBoolean(arc::prefs::kArcVoiceInteractionValuePropAccepted, true);
prefs->SetBoolean(arc::prefs::kVoiceInteractionEnabled, true);
assistant_handler_->ShowNextScreen();
} else {
assistant_handler_->AddSettingZippy(
"settings", CreateZippyData(activity_control_ui.setting_zippy()));
}
// Process third party disclosure data.
assistant_handler_->AddSettingZippy(
"disclosure",
CreateDisclosureData(third_party_disclosure_ui.disclosures()));
// Process get more data.
email_optin_needed_ = settings_ui.has_email_opt_in_ui() &&
settings_ui.email_opt_in_ui().has_title();
assistant_handler_->AddSettingZippy(
"get-more",
CreateGetMoreData(email_optin_needed_, settings_ui.email_opt_in_ui()));
// Pass string constants dictionary.
assistant_handler_->ReloadContent(
GetSettingsUiStrings(settings_ui, activity_control_needed_));
}
void AssistantOptInUI::OnUpdateSettingsResponse(const std::string& result) {
assistant::SettingsUiUpdateResult ui_result;
ui_result.ParseFromString(result);
if (ui_result.has_consent_flow_update_result()) {
if (ui_result.consent_flow_update_result().update_status() !=
assistant::ConsentFlowUiUpdateResult::SUCCESS) {
// TODO(updowndta): Handle consent update failure.
LOG(ERROR) << "Consent udpate error.";
} else if (activity_control_needed_) {
activity_control_needed_ = false;
PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs();
prefs->SetBoolean(arc::prefs::kArcVoiceInteractionValuePropAccepted,
true);
prefs->SetBoolean(arc::prefs::kVoiceInteractionEnabled, true);
}
}
if (ui_result.has_email_opt_in_update_result()) {
if (ui_result.email_opt_in_update_result().update_status() !=
assistant::EmailOptInUpdateResult::SUCCESS) {
// TODO(updowndta): Handle email optin update failure.
LOG(ERROR) << "Email OptIn udpate error.";
}
}
assistant_handler_->ShowNextScreen();
}
// AssistantOptInDialog // AssistantOptInDialog
// static // static
......
...@@ -9,60 +9,30 @@ ...@@ -9,60 +9,30 @@
#include "base/callback.h" #include "base/callback.h"
#include "base/macros.h" #include "base/macros.h"
#include "chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.h"
#include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_handler.h" #include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_handler.h"
#include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_screen_exit_code.h" #include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_screen_exit_code.h"
#include "chrome/browser/ui/webui/chromeos/login/base_webui_handler.h" #include "chrome/browser/ui/webui/chromeos/login/base_webui_handler.h"
#include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h" #include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h"
#include "chromeos/services/assistant/public/mojom/settings.mojom.h"
#include "content/public/browser/web_ui_controller.h" #include "content/public/browser/web_ui_controller.h"
#include "ui/web_dialogs/web_dialog_ui.h" #include "ui/web_dialogs/web_dialog_ui.h"
namespace chromeos { namespace chromeos {
// Controller for chrome://assistant-optin/ page. // Controller for chrome://assistant-optin/ page.
class AssistantOptInUI class AssistantOptInUI : public ui::WebDialogUI {
: public ui::WebDialogUI,
public arc::VoiceInteractionControllerClient::Observer {
public: public:
explicit AssistantOptInUI(content::WebUI* web_ui); explicit AssistantOptInUI(content::WebUI* web_ui);
~AssistantOptInUI() override; ~AssistantOptInUI() override;
// arc::VoiceInteractionControllerClient::Observer overrides
void OnStateChanged(ash::mojom::VoiceInteractionState state) override;
private: private:
// Initilize connection to settings manager.
void Initialize();
// Add message handler for optin screens. // Add message handler for optin screens.
void AddScreenHandler(std::unique_ptr<BaseWebUIHandler> handler); void AddScreenHandler(std::unique_ptr<BaseWebUIHandler> handler);
// Called by a screen when user's done with it. // Called by a screen when user's done with it.
void OnExit(AssistantOptInScreenExitCode exit_code); void OnExit(AssistantOptInScreenExitCode exit_code);
void OnActivityControlOptInResult(bool opted_in);
void OnEmailOptInResult(bool opted_in);
// Handle response from the settings manager.
void OnGetSettingsResponse(const std::string& settings);
void OnUpdateSettingsResponse(const std::string& settings);
// Show next screen in the optin flow.
void Next();
// Consent token used to complete the opt-in.
std::string consent_token_;
// Whether activity control is needed for user.
bool activity_control_needed_ = true;
// Whether email optin is needed for user.
bool email_optin_needed_ = false;
AssistantOptInHandler* assistant_handler_ = nullptr; AssistantOptInHandler* assistant_handler_ = nullptr;
std::unique_ptr<JSCallsContainer> js_calls_container_; std::unique_ptr<JSCallsContainer> js_calls_container_;
assistant::mojom::AssistantSettingsManagerPtr settings_manager_;
std::vector<BaseWebUIHandler*> screen_handlers_; std::vector<BaseWebUIHandler*> screen_handlers_;
base::WeakPtrFactory<AssistantOptInUI> weak_factory_; base::WeakPtrFactory<AssistantOptInUI> weak_factory_;
......
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