blob: 1498b8cfdb29ded6bb3842e863283cebb9d5beab [file] [log] [blame]
// 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 COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ACTIONS_COLLECT_USER_DATA_ACTION_H_
#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ACTIONS_COLLECT_USER_DATA_ACTION_H_
#include <memory>
#include <string>
#include <vector>
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
#include "components/autofill/core/browser/personal_data_manager.h"
#include "components/autofill/core/browser/personal_data_manager_observer.h"
#include "components/autofill/core/common/password_form.h"
#include "components/autofill_assistant/browser/actions/action.h"
#include "components/autofill_assistant/browser/user_data.h"
#include "components/autofill_assistant/browser/website_login_fetcher.h"
namespace autofill_assistant {
// Shows a UI to collect user data required for subsequent actions.
class CollectUserDataAction : public Action,
public autofill::PersonalDataManagerObserver {
public:
explicit CollectUserDataAction(ActionDelegate* delegate,
const ActionProto& proto);
~CollectUserDataAction() override;
// From autofill::PersonalDataManagerObserver.
void OnPersonalDataChanged() override;
static bool IsUserDataComplete(
const UserData& user_data,
const CollectUserDataOptions& collect_user_data_options);
private:
struct LoginDetails {
LoginDetails(bool choose_automatically_if_no_other_options,
const std::string& payload);
LoginDetails(bool choose_automatically_if_no_other_options,
const std::string& payload,
const WebsiteLoginFetcher::Login& login);
~LoginDetails();
bool choose_automatically_if_no_other_options;
std::string payload;
// Only for Chrome PWM login details.
base::Optional<WebsiteLoginFetcher::Login> login;
};
void InternalProcessAction(ProcessActionCallback callback) override;
void EndAction(const ClientStatus& status);
void OnGetUserData(const CollectUserDataProto& collect_user_data,
UserData* user_data);
void OnAdditionalActionTriggered(int index);
void OnTermsAndConditionsLinkClicked(int link);
void OnGetLogins(
const LoginDetailsProto::LoginOptionProto& login_option,
std::vector<WebsiteLoginFetcher::Login> logins);
void ShowToUser();
void OnShowToUser(UserData* user_data, UserData::FieldChange* field_change);
// Creates a new instance of |CollectUserDataOptions| from |proto_|.
bool CreateOptionsFromProto();
// Will update |initial_card_has_billing_postal_code_|.
bool CheckInitialAutofillDataComplete(
autofill::PersonalDataManager* personal_data_manager);
// Update user data with the new state from personal data manager.
void UpdatePersonalDataManagerProfiles(
UserData* user_data,
UserData::FieldChange* field_change = nullptr);
void UpdatePersonalDataManagerCards(
UserData* user_data,
UserData::FieldChange* field_change = nullptr);
bool shown_to_user_ = false;
bool initially_prefilled = false;
bool personal_data_changed_ = false;
bool action_successful_ = false;
bool initial_card_has_billing_postal_code_ = false;
std::unique_ptr<CollectUserDataOptions> collect_user_data_options_;
ProcessActionCallback callback_;
// Maps login choice identifiers to the corresponding login details.
std::map<std::string, std::unique_ptr<LoginDetails>> login_details_map_;
base::WeakPtrFactory<CollectUserDataAction> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(CollectUserDataAction);
};
} // namespace autofill_assistant
#endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ACTIONS_COLLECT_USER_DATA_ACTION_H_