Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 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 "base/basictypes.h" | |
| 6 #include "base/strings/string_util.h" | |
| 7 #include "base/strings/utf_string_conversions.h" | |
| 8 #include "chrome/browser/ui/autofill/instrument_unmask_prompt_view.h" | |
| 9 #include "chrome/grit/generated_resources.h" | |
| 10 #include "components/constrained_window/constrained_window_views.h" | |
| 11 #include "grit/theme_resources.h" | |
| 12 #include "ui/base/l10n/l10n_util.h" | |
| 13 #include "ui/base/resource/resource_bundle.h" | |
| 14 #include "ui/views/controls/image_view.h" | |
| 15 #include "ui/views/controls/label.h" | |
| 16 #include "ui/views/controls/textfield/textfield.h" | |
| 17 #include "ui/views/controls/textfield/textfield_controller.h" | |
| 18 #include "ui/views/layout/box_layout.h" | |
| 19 #include "ui/views/window/dialog_client_view.h" | |
| 20 #include "ui/views/window/dialog_delegate.h" | |
| 21 | |
| 22 namespace autofill { | |
| 23 | |
| 24 namespace { | |
| 25 | |
| 26 class InstrumentUnmaskPromptViews : public InstrumentUnmaskPromptView, | |
| 27 views::DialogDelegateView, | |
| 28 views::TextfieldController { | |
| 29 public: | |
| 30 InstrumentUnmaskPromptViews(content::WebContents* web_contents, | |
| 31 const UnmaskCallback& finished) | |
| 32 : web_contents_(web_contents), | |
| 33 finished_(finished), | |
| 34 accepted_(false), | |
| 35 cvc_(nullptr) {} | |
| 36 | |
| 37 virtual ~InstrumentUnmaskPromptViews() { | |
|
please use gerrit instead
2014/12/08 23:41:19
The new convention for overriding virtual destruct
Evan Stade
2014/12/11 19:01:20
Done.
| |
| 38 finished_.Run(accepted_ ? cvc_->text() : base::string16()); | |
| 39 } | |
| 40 | |
| 41 void Show() { | |
| 42 constrained_window::ShowWebModalDialogViews(this, web_contents_); | |
| 43 } | |
| 44 | |
| 45 // views::DialogDelegateView | |
| 46 View* GetContentsView() override { | |
| 47 InitIfNecessary(); | |
| 48 return this; | |
| 49 } | |
| 50 | |
| 51 ui::ModalType GetModalType() const override { return ui::MODAL_TYPE_CHILD; } | |
| 52 | |
| 53 base::string16 GetWindowTitle() const override { | |
| 54 // TODO(estade): fix this. | |
| 55 return base::ASCIIToUTF16("Unlocking Visa - 1111"); | |
| 56 } | |
| 57 | |
| 58 void DeleteDelegate() override { | |
| 59 delete this; | |
| 60 } | |
| 61 | |
| 62 int GetDialogButtons() const override { | |
| 63 return ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL; | |
| 64 } | |
| 65 | |
| 66 base::string16 GetDialogButtonLabel(ui::DialogButton button) const override { | |
| 67 // TODO(estade): fix this. | |
| 68 if (button == ui::DIALOG_BUTTON_OK) | |
| 69 return base::ASCIIToUTF16("Verify"); | |
| 70 | |
| 71 return DialogDelegateView::GetDialogButtonLabel(button); | |
| 72 } | |
| 73 | |
| 74 bool ShouldDefaultButtonBeBlue() const override { return true; } | |
| 75 | |
| 76 bool IsDialogButtonEnabled(ui::DialogButton button) const override { | |
| 77 if (button == ui::DIALOG_BUTTON_CANCEL) | |
| 78 return true; | |
| 79 | |
| 80 DCHECK_EQ(ui::DIALOG_BUTTON_OK, button); | |
| 81 | |
| 82 base::string16 input_text; | |
| 83 base::TrimWhitespace(cvc_->text(), base::TRIM_ALL, &input_text); | |
| 84 return input_text.size() == 3 && | |
| 85 base::ContainsOnlyChars(input_text, | |
| 86 base::ASCIIToUTF16("0123456789")); | |
| 87 } | |
| 88 | |
| 89 views::View* GetInitiallyFocusedView() override { return cvc_; } | |
| 90 | |
| 91 bool Cancel() override { | |
| 92 DCHECK_EQ(false, accepted_); | |
| 93 return true; | |
| 94 } | |
| 95 | |
| 96 bool Accept() override { | |
| 97 accepted_ = true; | |
| 98 return true; | |
| 99 } | |
| 100 | |
| 101 // views::TextfieldController | |
| 102 void ContentsChanged(views::Textfield* sender, | |
| 103 const base::string16& new_contents) override { | |
| 104 GetDialogClientView()->UpdateDialogButtons(); | |
| 105 } | |
| 106 | |
| 107 private: | |
| 108 void InitIfNecessary() { | |
| 109 if (has_children()) | |
| 110 return; | |
| 111 | |
| 112 // TODO(estade): for amex, text and CVC image should be different. | |
| 113 SetLayoutManager( | |
| 114 new views::BoxLayout(views::BoxLayout::kVertical, 19, 0, 5)); | |
| 115 AddChildView(new views::Label(base::ASCIIToUTF16( | |
| 116 "Enter the three digit verification code from the back of your credit " | |
| 117 "card"))); | |
| 118 | |
| 119 views::View* cvc_container = new views::View(); | |
| 120 cvc_container->SetLayoutManager( | |
| 121 new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 5)); | |
| 122 AddChildView(cvc_container); | |
| 123 | |
| 124 cvc_ = new views::Textfield(); | |
| 125 cvc_->set_controller(this); | |
| 126 cvc_->set_placeholder_text( | |
| 127 l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_CVC)); | |
| 128 cvc_->set_default_width_in_chars(10); | |
| 129 cvc_container->AddChildView(cvc_); | |
| 130 | |
| 131 views::ImageView* cvc_image = new views::ImageView(); | |
| 132 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | |
| 133 cvc_image->SetImage(rb.GetImageSkiaNamed(IDR_CREDIT_CARD_CVC_HINT)); | |
| 134 cvc_container->AddChildView(cvc_image); | |
| 135 } | |
| 136 | |
| 137 content::WebContents* web_contents_; | |
| 138 | |
| 139 UnmaskCallback finished_; | |
| 140 | |
| 141 // Set to true when the user accepts. | |
| 142 bool accepted_; | |
| 143 | |
| 144 views::Textfield* cvc_; | |
| 145 | |
| 146 DISALLOW_COPY_AND_ASSIGN(InstrumentUnmaskPromptViews); | |
| 147 }; | |
| 148 | |
| 149 } // namespace | |
| 150 | |
| 151 // static | |
| 152 InstrumentUnmaskPromptView* | |
| 153 InstrumentUnmaskPromptView::CreateAndShow(content::WebContents* web_contents, | |
| 154 const UnmaskCallback& finished) { | |
| 155 InstrumentUnmaskPromptViews* view = | |
| 156 new InstrumentUnmaskPromptViews(web_contents, finished); | |
| 157 view->Show(); | |
| 158 return view; | |
| 159 } | |
| 160 | |
| 161 } // namespace autofill | |
| OLD | NEW |