| Index: chrome/browser/ui/views/autofill/card_unmask_prompt_views.cc
|
| diff --git a/chrome/browser/ui/views/autofill/card_unmask_prompt_views.cc b/chrome/browser/ui/views/autofill/card_unmask_prompt_views.cc
|
| index 9473f82a42d6de018e8dbccd808de8f146a23dde..83223c626fefd13fdb5f8bcba82c365cc2107c6a 100644
|
| --- a/chrome/browser/ui/views/autofill/card_unmask_prompt_views.cc
|
| +++ b/chrome/browser/ui/views/autofill/card_unmask_prompt_views.cc
|
| @@ -5,14 +5,17 @@
|
| #include "base/basictypes.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "chrome/browser/ui/autofill/autofill_dialog_models.h"
|
| +#include "chrome/browser/ui/autofill/autofill_dialog_types.h"
|
| #include "chrome/browser/ui/autofill/card_unmask_prompt_controller.h"
|
| #include "chrome/browser/ui/autofill/card_unmask_prompt_view.h"
|
| #include "chrome/browser/ui/views/autofill/decorated_textfield.h"
|
| #include "chrome/grit/generated_resources.h"
|
| #include "components/constrained_window/constrained_window_views.h"
|
| #include "grit/theme_resources.h"
|
| +#include "third_party/skia/include/core/SkColor.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
| #include "ui/base/resource/resource_bundle.h"
|
| +#include "ui/views/background.h"
|
| #include "ui/views/controls/button/checkbox.h"
|
| #include "ui/views/controls/combobox/combobox.h"
|
| #include "ui/views/controls/combobox/combobox_listener.h"
|
| @@ -35,11 +38,14 @@ class CardUnmaskPromptViews : public CardUnmaskPromptView,
|
| public:
|
| explicit CardUnmaskPromptViews(CardUnmaskPromptController* controller)
|
| : controller_(controller),
|
| + controls_container_(nullptr),
|
| cvc_input_(nullptr),
|
| month_input_(nullptr),
|
| year_input_(nullptr),
|
| - message_label_(nullptr),
|
| - storage_checkbox_(nullptr) {}
|
| + error_label_(nullptr),
|
| + storage_checkbox_(nullptr),
|
| + progress_overlay_(nullptr),
|
| + progress_label_(nullptr) {}
|
|
|
| ~CardUnmaskPromptViews() override {
|
| if (controller_)
|
| @@ -59,23 +65,27 @@ class CardUnmaskPromptViews : public CardUnmaskPromptView,
|
|
|
| void DisableAndWaitForVerification() override {
|
| SetInputsEnabled(false);
|
| - message_label_->SetText(base::ASCIIToUTF16("Verifying..."));
|
| - message_label_->SetVisible(true);
|
| + progress_overlay_->SetVisible(true);
|
| GetDialogClientView()->UpdateDialogButtons();
|
| Layout();
|
| }
|
|
|
| void GotVerificationResult(bool success) override {
|
| if (success) {
|
| - message_label_->SetText(base::ASCIIToUTF16("Success!"));
|
| + progress_label_->SetText(base::ASCIIToUTF16("Success!"));
|
| base::MessageLoop::current()->PostDelayedTask(
|
| FROM_HERE, base::Bind(&CardUnmaskPromptViews::ClosePrompt,
|
| base::Unretained(this)),
|
| base::TimeDelta::FromSeconds(1));
|
| } else {
|
| SetInputsEnabled(true);
|
| - cvc_input_->SetInvalid(true);
|
| - message_label_->SetText(base::ASCIIToUTF16("Verification error."));
|
| + SetInputsInvalid(true);
|
| + // TODO(estade): it's somewhat jarring when the error comes back too
|
| + // quickly.
|
| + progress_overlay_->SetVisible(false);
|
| + // TODO(estade): When do we hide |error_label_|?
|
| + error_label_->SetText(
|
| + base::ASCIIToUTF16("Verification error. Please try again."));
|
| GetDialogClientView()->UpdateDialogButtons();
|
| }
|
| Layout();
|
| @@ -90,6 +100,15 @@ class CardUnmaskPromptViews : public CardUnmaskPromptView,
|
| year_input_->SetEnabled(enabled);
|
| }
|
|
|
| + void SetInputsInvalid(bool invalid) {
|
| + cvc_input_->SetInvalid(invalid);
|
| +
|
| + if (month_input_)
|
| + month_input_->SetInvalid(invalid);
|
| + if (year_input_)
|
| + year_input_->SetInvalid(invalid);
|
| + }
|
| +
|
| // views::DialogDelegateView
|
| View* GetContentsView() override {
|
| InitIfNecessary();
|
| @@ -105,6 +124,28 @@ class CardUnmaskPromptViews : public CardUnmaskPromptView,
|
| return gfx::Size(kWidth, GetHeightForWidth(kWidth));
|
| }
|
|
|
| + void Layout() override {
|
| + for (int i = 0; i < child_count(); ++i) {
|
| + child_at(i)->SetBoundsRect(GetContentsBounds());
|
| + }
|
| + }
|
| +
|
| + int GetHeightForWidth(int width) const override {
|
| + if (!has_children())
|
| + return 0;
|
| + const gfx::Insets insets = GetInsets();
|
| + return controls_container_->GetHeightForWidth(width - insets.width()) +
|
| + insets.height();
|
| + }
|
| +
|
| + void OnNativeThemeChanged(const ui::NativeTheme* theme) override {
|
| + SkColor bg_color =
|
| + theme->GetSystemColor(ui::NativeTheme::kColorId_DialogBackground);
|
| + bg_color = SkColorSetA(bg_color, 0xDD);
|
| + progress_overlay_->set_background(
|
| + views::Background::CreateSolidBackground(bg_color));
|
| + }
|
| +
|
| ui::ModalType GetModalType() const override { return ui::MODAL_TYPE_CHILD; }
|
|
|
| base::string16 GetWindowTitle() const override {
|
| @@ -168,11 +209,17 @@ class CardUnmaskPromptViews : public CardUnmaskPromptView,
|
| // views::TextfieldController
|
| void ContentsChanged(views::Textfield* sender,
|
| const base::string16& new_contents) override {
|
| + // Sets all inputs back to valid since we don't know which one was
|
| + // actually invalid to begin with.
|
| + SetInputsInvalid(false);
|
| GetDialogClientView()->UpdateDialogButtons();
|
| }
|
|
|
| // views::ComboboxListener
|
| void OnPerformAction(views::Combobox* combobox) override {
|
| + // Sets all inputs back to valid since we don't know which one was
|
| + // actually invalid to begin with.
|
| + SetInputsInvalid(false);
|
| GetDialogClientView()->UpdateDialogButtons();
|
| }
|
|
|
| @@ -181,19 +228,22 @@ class CardUnmaskPromptViews : public CardUnmaskPromptView,
|
| if (has_children())
|
| return;
|
|
|
| - SetLayoutManager(
|
| + controls_container_ = new views::View();
|
| + controls_container_->SetLayoutManager(
|
| new views::BoxLayout(views::BoxLayout::kVertical, 19, 0, 5));
|
| + AddChildView(controls_container_);
|
| +
|
| views::Label* instructions =
|
| new views::Label(controller_->GetInstructionsMessage());
|
|
|
| instructions->SetMultiLine(true);
|
| instructions->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
| - AddChildView(instructions);
|
| + controls_container_->AddChildView(instructions);
|
|
|
| views::View* input_row = new views::View();
|
| input_row->SetLayoutManager(
|
| new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 5));
|
| - AddChildView(input_row);
|
| + controls_container_->AddChildView(input_row);
|
|
|
| if (controller_->ShouldRequestExpirationDate()) {
|
| month_input_ = new views::Combobox(&month_combobox_model_);
|
| @@ -218,20 +268,39 @@ class CardUnmaskPromptViews : public CardUnmaskPromptView,
|
|
|
| input_row->AddChildView(cvc_image);
|
|
|
| - message_label_ = new views::Label();
|
| - input_row->AddChildView(message_label_);
|
| - message_label_->SetVisible(false);
|
| + // Reserve vertical space.
|
| + error_label_ = new views::Label(base::ASCIIToUTF16(" "));
|
| + error_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
| + error_label_->SetEnabledColor(kWarningColor);
|
| + controls_container_->AddChildView(error_label_);
|
|
|
| storage_checkbox_ = new views::Checkbox(l10n_util::GetStringUTF16(
|
| IDS_AUTOFILL_CARD_UNMASK_PROMPT_STORAGE_CHECKBOX));
|
| storage_checkbox_->SetChecked(controller_->GetStoreLocallyStartState());
|
| - AddChildView(storage_checkbox_);
|
| + controls_container_->AddChildView(storage_checkbox_);
|
| +
|
| + progress_overlay_ = new views::View();
|
| + views::BoxLayout* progress_layout =
|
| + new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0);
|
| + progress_layout->set_main_axis_alignment(
|
| + views::BoxLayout::MAIN_AXIS_ALIGNMENT_CENTER);
|
| + progress_layout->set_cross_axis_alignment(
|
| + views::BoxLayout::CROSS_AXIS_ALIGNMENT_CENTER);
|
| + progress_overlay_->SetLayoutManager(progress_layout);
|
| +
|
| + progress_overlay_->SetVisible(false);
|
| + AddChildView(progress_overlay_);
|
| +
|
| + progress_label_ = new views::Label(base::ASCIIToUTF16("Verifying..."));
|
| + progress_overlay_->AddChildView(progress_label_);
|
| }
|
|
|
| void ClosePrompt() { GetWidget()->Close(); }
|
|
|
| CardUnmaskPromptController* controller_;
|
|
|
| + views::View* controls_container_;
|
| +
|
| DecoratedTextfield* cvc_input_;
|
|
|
| // These will be null when expiration date is not required.
|
| @@ -241,12 +310,13 @@ class CardUnmaskPromptViews : public CardUnmaskPromptView,
|
| MonthComboboxModel month_combobox_model_;
|
| YearComboboxModel year_combobox_model_;
|
|
|
| - // TODO(estade): this is a temporary standin in place of some spinner UI
|
| - // as well as a better error message.
|
| - views::Label* message_label_;
|
| + views::Label* error_label_;
|
|
|
| views::Checkbox* storage_checkbox_;
|
|
|
| + views::View* progress_overlay_;
|
| + views::Label* progress_label_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(CardUnmaskPromptViews);
|
| };
|
|
|
|
|