1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "ash/assistant/assistant_setup_controller.h"
6 
7 #include "ash/assistant/assistant_controller_impl.h"
8 #include "ash/assistant/util/deep_link_util.h"
9 #include "ash/assistant/util/i18n_util.h"
10 #include "ash/public/cpp/assistant/controller/assistant_ui_controller.h"
11 #include "base/bind.h"
12 #include "base/callback_helpers.h"
13 #include "chromeos/services/assistant/public/cpp/assistant_prefs.h"
14 #include "chromeos/services/assistant/public/cpp/features.h"
15 
16 namespace {
17 
18 constexpr char kGSuiteAdministratorInstructionsUrl[] =
19     "https://support.google.com/a/answer/6304876";
20 
21 }  // namespace
22 
23 namespace ash {
24 
AssistantSetupController(AssistantControllerImpl * assistant_controller)25 AssistantSetupController::AssistantSetupController(
26     AssistantControllerImpl* assistant_controller)
27     : assistant_controller_(assistant_controller) {
28   assistant_controller_observer_.Add(AssistantController::Get());
29 }
30 
31 AssistantSetupController::~AssistantSetupController() = default;
32 
OnAssistantControllerConstructed()33 void AssistantSetupController::OnAssistantControllerConstructed() {
34   assistant_controller_->view_delegate()->AddObserver(this);
35 }
36 
OnAssistantControllerDestroying()37 void AssistantSetupController::OnAssistantControllerDestroying() {
38   assistant_controller_->view_delegate()->RemoveObserver(this);
39 }
40 
OnDeepLinkReceived(assistant::util::DeepLinkType type,const std::map<std::string,std::string> & params)41 void AssistantSetupController::OnDeepLinkReceived(
42     assistant::util::DeepLinkType type,
43     const std::map<std::string, std::string>& params) {
44   if (type != assistant::util::DeepLinkType::kOnboarding)
45     return;
46 
47   base::Optional<bool> relaunch = assistant::util::GetDeepLinkParamAsBool(
48       params, assistant::util::DeepLinkParam::kRelaunch);
49 
50   StartOnboarding(relaunch.value_or(false));
51 }
52 
OnOptInButtonPressed()53 void AssistantSetupController::OnOptInButtonPressed() {
54   using chromeos::assistant::prefs::ConsentStatus;
55   if (AssistantState::Get()->consent_status().value_or(
56           ConsentStatus::kUnknown) == ConsentStatus::kUnauthorized) {
57     AssistantController::Get()->OpenUrl(assistant::util::CreateLocalizedGURL(
58         kGSuiteAdministratorInstructionsUrl));
59   } else {
60     StartOnboarding(/*relaunch=*/true);
61   }
62 }
63 
StartOnboarding(bool relaunch,FlowType type)64 void AssistantSetupController::StartOnboarding(bool relaunch, FlowType type) {
65   auto* assistant_setup = AssistantSetup::GetInstance();
66   if (!assistant_setup)
67     return;
68 
69   AssistantUiController::Get()->CloseUi(
70       chromeos::assistant::AssistantExitPoint::kSetup);
71 
72   assistant_setup->StartAssistantOptInFlow(
73       type, base::BindOnce(&AssistantSetupController::OnOptInFlowFinished,
74                            weak_ptr_factory_.GetWeakPtr(), relaunch));
75 }
76 
OnOptInFlowFinished(bool relaunch,bool completed)77 void AssistantSetupController::OnOptInFlowFinished(bool relaunch,
78                                                    bool completed) {
79   if (relaunch && completed) {
80     AssistantUiController::Get()->ShowUi(
81         chromeos::assistant::AssistantEntryPoint::kSetup);
82   }
83 }
84 
85 }  // namespace ash
86