blob: 0260b512be9b1152ae9d1be6ee84dec500eef4e5 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_AUTOFILL_PAYMENTS_IBAN_BUBBLE_CONTROLLER_IMPL_H_
#define CHROME_BROWSER_UI_AUTOFILL_PAYMENTS_IBAN_BUBBLE_CONTROLLER_IMPL_H_
#include <string_view>
#include "base/memory/raw_ptr.h"
#include "base/timer/timer.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/autofill/autofill_bubble_controller_base.h"
#include "chrome/browser/ui/autofill/payments/iban_bubble_controller.h"
#include "chrome/browser/ui/autofill/payments/save_iban_ui.h"
#include "chrome/browser/ui/autofill/payments/save_payment_icon_controller.h"
#include "components/autofill/core/browser/data_model/payments/iban.h"
#include "components/autofill/core/browser/foundations/autofill_client.h"
#include "components/autofill/core/browser/payments/payments_autofill_client.h"
#include "components/autofill/core/browser/ui/payments/payments_ui_closed_reasons.h"
#include "content/public/browser/web_contents_user_data.h"
namespace autofill {
enum class IbanBubbleType;
// Implementation of per-tab class to control the IBAN save bubble, manage saved
// IBAN bubble, and Omnibox icon.
class IbanBubbleControllerImpl
: public AutofillBubbleControllerBase,
public IbanBubbleController,
public SavePaymentIconController,
public content::WebContentsUserData<IbanBubbleControllerImpl> {
public:
// An observer class used by browsertests that gets notified whenever
// particular actions occur.
class ObserverForTest {
public:
virtual void OnBubbleShown() = 0;
virtual void OnIconShown() = 0;
};
IbanBubbleControllerImpl(const IbanBubbleControllerImpl&) = delete;
IbanBubbleControllerImpl& operator=(const IbanBubbleControllerImpl&) = delete;
~IbanBubbleControllerImpl() override;
// Time to wait before auto-closing confirmation bubble.
static constexpr base::TimeDelta kAutoCloseConfirmationBubbleWaitSec =
base::Seconds(3);
// Sets up the controller and offers to save the `iban` locally.
// `save_iban_prompt_callback` will be invoked once the user makes a decision
// with respect to the offer-to-save prompt.
void OfferLocalSave(const Iban& iban,
bool should_show_prompt,
payments::PaymentsAutofillClient::SaveIbanPromptCallback
save_iban_prompt_callback);
// Sets up the controller and offers to save the `iban` to the GPay server.
// `save_iban_prompt_callback` will be invoked once the user makes a decision
// with respect to the offer-to-upload save prompt.
void OfferUploadSave(const Iban& iban,
LegalMessageLines legal_message_lines,
bool should_show_prompt,
payments::PaymentsAutofillClient::SaveIbanPromptCallback
save_iban_prompt_callback);
// No-op if the bubble is already shown, otherwise, shows the bubble.
void ReshowBubble();
// Shows upload result to users. `iban_saved` indicates if the IBAN is
// successfully saved. `hit_max_strikes` indicates whether the upload save
// offer for this IBAN has reached the max strike. If successfully saved, a
// timer is started to auto-close the confirmation bubble if the user doesn't
// close the bubble before `kAutoCloseConfirmationBubbleWaitSec`.
void ShowConfirmationBubbleView(bool iban_saved, bool hit_max_strikes);
// IbanBubbleController:
std::u16string GetWindowTitle() const override;
std::u16string GetExplanatoryMessage() const override;
std::u16string GetAcceptButtonText() const override;
std::u16string GetDeclineButtonText() const override;
AccountInfo GetAccountInfo() override;
const Iban& GetIban() const override;
base::OnceCallback<void(PaymentsUiClosedReason)> GetOnBubbleClosedCallback()
override;
void OnAcceptButton(std::u16string_view nickname) override;
void OnLegalMessageLinkClicked(const GURL& url) override;
void OnManageSavedIbanExtraButtonClicked() override;
void OnBubbleClosed(PaymentsUiClosedReason closed_reason) override;
IbanBubbleType GetIbanBubbleType() const override;
// SavePaymentIconController:
std::u16string GetSavePaymentIconTooltipText() const override;
bool ShouldShowSavingPaymentAnimation() const override;
bool ShouldShowPaymentSavedLabelAnimation() const override;
void OnAnimationEnded() override;
bool IsIconVisible() const override;
AutofillBubbleBase* GetPaymentBubbleView() const override;
int GetSaveSuccessAnimationStringId() const override;
const SavePaymentMethodAndVirtualCardEnrollConfirmationUiParams&
GetConfirmationUiParams() const override;
// BubbleControllerBase:
void OnBubbleDiscarded() override;
bool CanBeReshown() const override;
BubbleType GetBubbleType() const override;
base::WeakPtr<BubbleControllerBase> GetBubbleControllerBaseWeakPtr() override;
// For testing.
void SetEventObserverForTesting(ObserverForTest* observer) {
observer_for_testing_ = observer;
}
protected:
explicit IbanBubbleControllerImpl(content::WebContents* web_contents);
// AutofillBubbleControllerBase:
std::optional<PageActionIconType> GetPageActionIconType() override;
void DoShowBubble() override;
using AutofillBubbleControllerBase::HideBubble;
private:
friend class content::WebContentsUserData<IbanBubbleControllerImpl>;
Profile* GetProfile();
// Sets up the controller's state for a local IBAN save prompt.
void SetupLocalSave(Iban iban,
payments::PaymentsAutofillClient::SaveIbanPromptCallback
save_iban_prompt_callback);
// Sets up the controller's state for an upload-to-server IBAN save prompt.
void SetupUploadSave(Iban iban,
LegalMessageLines legal_message_lines,
payments::PaymentsAutofillClient::SaveIbanPromptCallback
save_iban_prompt_callback);
// Displays omnibox icon only.
void ShowIconOnly();
// Returns true iff the bubble for upload save is showing or has been shown.
bool IsUploadSave() const override;
// Returns empty vector if no legal message should be shown.
const LegalMessageLines& GetLegalMessageLines() const override;
// Logs metrics when the bubble is closed.
void LogBubbleCloseMetrics(PaymentsUiClosedReason reason);
// Observer for when a bubble is created. Initialized only during tests.
raw_ptr<ObserverForTest> observer_for_testing_ = nullptr;
// Note: Below fields are set when IBAN save is offered.
//
// Is true only if the [IBAN saved] label animation should be shown.
bool should_show_iban_saved_label_animation_ = false;
// The type of bubble that is either currently being shown or would
// be shown when the IBAN save icon is clicked.
IbanBubbleType current_bubble_type_ = IbanBubbleType::kInactive;
// Callback to run once the user makes a decision with respect to the local
// or GPay server IBAN offer-to-save prompt.
payments::PaymentsAutofillClient::SaveIbanPromptCallback
save_iban_prompt_callback_;
// Whether the bubble is shown after user interacted with the omnibox icon.
bool is_reshow_ = false;
// Contains the details of the IBAN that will be saved if the user accepts.
Iban iban_;
// Governs whether the upload or local save version of the UI should be shown.
bool is_upload_save_ = false;
// If no legal message should be shown, then this variable is an empty vector.
LegalMessageLines legal_message_lines_;
// UI parameters needed to display the save IBAN confirmation view.
std::optional<SavePaymentMethodAndVirtualCardEnrollConfirmationUiParams>
confirmation_ui_params_;
// Timer that controls auto closure of confirmation bubble.
base::OneShotTimer auto_close_confirmation_timer_;
// Weak pointer factory for this save IBAN bubble controller.
base::WeakPtrFactory<IbanBubbleControllerImpl> weak_ptr_factory_{this};
WEB_CONTENTS_USER_DATA_KEY_DECL();
};
} // namespace autofill
#endif // CHROME_BROWSER_UI_AUTOFILL_PAYMENTS_IBAN_BUBBLE_CONTROLLER_IMPL_H_