Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(26)

Side by Side Diff: chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc

Issue 23512003: new animation for rAc card generation (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove second string on final interstitial Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/autofill/autofill_dialog_controller_impl.h" 5 #include "chrome/browser/ui/autofill/autofill_dialog_controller_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 #include <string> 9 #include <string>
10 10
11 #include "apps/native_app_window.h" 11 #include "apps/native_app_window.h"
12 #include "apps/shell_window.h" 12 #include "apps/shell_window.h"
13 #include "apps/shell_window_registry.h" 13 #include "apps/shell_window_registry.h"
14 #include "base/base64.h" 14 #include "base/base64.h"
15 #include "base/bind.h" 15 #include "base/bind.h"
16 #include "base/i18n/case_conversion.h"
16 #include "base/i18n/rtl.h" 17 #include "base/i18n/rtl.h"
17 #include "base/logging.h" 18 #include "base/logging.h"
18 #include "base/prefs/pref_service.h" 19 #include "base/prefs/pref_service.h"
20 #include "base/rand_util.h"
19 #include "base/strings/string_number_conversions.h" 21 #include "base/strings/string_number_conversions.h"
20 #include "base/strings/string_split.h" 22 #include "base/strings/string_split.h"
21 #include "base/strings/string_util.h" 23 #include "base/strings/string_util.h"
22 #include "base/strings/utf_string_conversions.h" 24 #include "base/strings/utf_string_conversions.h"
23 #include "base/time/time.h" 25 #include "base/time/time.h"
24 #include "chrome/browser/autofill/personal_data_manager_factory.h" 26 #include "chrome/browser/autofill/personal_data_manager_factory.h"
25 #include "chrome/browser/browser_process.h" 27 #include "chrome/browser/browser_process.h"
26 #include "chrome/browser/prefs/scoped_user_pref_update.h" 28 #include "chrome/browser/prefs/scoped_user_pref_update.h"
27 #include "chrome/browser/profiles/profile.h" 29 #include "chrome/browser/profiles/profile.h"
28 #include "chrome/browser/ui/autofill/autofill_dialog_common.h" 30 #include "chrome/browser/ui/autofill/autofill_dialog_common.h"
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 405
404 case wallet::WalletClient::UNKNOWN_ERROR: 406 case wallet::WalletClient::UNKNOWN_ERROR:
405 return l10n_util::GetStringFUTF16(IDS_AUTOFILL_WALLET_UNKNOWN_ERROR, 407 return l10n_util::GetStringFUTF16(IDS_AUTOFILL_WALLET_UNKNOWN_ERROR,
406 ASCIIToUTF16("74")); 408 ASCIIToUTF16("74"));
407 } 409 }
408 410
409 NOTREACHED(); 411 NOTREACHED();
410 return base::string16(); 412 return base::string16();
411 } 413 }
412 414
413 gfx::Image GetGeneratedCardImage(const string16& card_number) { 415 gfx::Image GetGeneratedCardImage(const base::string16& card_number,
416 const base::string16& name) {
414 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 417 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
415 const gfx::ImageSkia* card = 418 const gfx::ImageSkia* card =
416 rb.GetImageSkiaNamed(IDR_AUTOFILL_GENERATED_CARD); 419 rb.GetImageSkiaNamed(IDR_AUTOFILL_GENERATED_CARD);
417 gfx::Canvas canvas(card->size(), ui::SCALE_FACTOR_100P, false); 420 gfx::Canvas canvas(card->size(), ui::SCALE_FACTOR_100P, false);
418 canvas.DrawImageInt(*card, 0, 0); 421 canvas.DrawImageInt(*card, 0, 0);
419 422
423 // TODO(estade): space the text out a bit better. We might need a larger
424 // card image.
420 gfx::Rect display_rect(gfx::Point(), card->size()); 425 gfx::Rect display_rect(gfx::Point(), card->size());
421 display_rect.Inset(14, 0, 14, 0); 426 display_rect.Inset(8, 0, 14, 0);
422 // TODO(estade): fallback font for systems that don't have Helvetica? 427 gfx::Font monospace("monospace", 12);
423 gfx::Font helvetica("Helvetica", 14);
424 gfx::ShadowValues shadows; 428 gfx::ShadowValues shadows;
425 shadows.push_back(gfx::ShadowValue(gfx::Point(0, 1), 429 shadows.push_back(gfx::ShadowValue(gfx::Point(0, 1),
426 0.0, 430 0.0,
427 SkColorSetARGB(85, 0, 0, 0))); 431 SkColorSetARGB(85, 0, 0, 0)));
428 canvas.DrawStringWithShadows( 432 canvas.DrawStringWithShadows(
429 card_number, 433 card_number,
430 helvetica, 434 monospace,
431 SK_ColorWHITE, 435 SK_ColorWHITE,
432 display_rect, 0, 0, shadows); 436 display_rect, 0, 0, shadows);
433 437
438 base::string16 capitalized_name = base::i18n::ToUpper(name);
439 display_rect.set_y(24);
440 canvas.DrawStringWithShadows(
441 capitalized_name,
442 monospace,
443 SK_ColorWHITE,
444 display_rect, 0, 0, shadows);
445
434 gfx::ImageSkia skia(canvas.ExtractImageRep()); 446 gfx::ImageSkia skia(canvas.ExtractImageRep());
435 return gfx::Image(skia); 447 return gfx::Image(skia);
436 } 448 }
437 449
438 } // namespace 450 } // namespace
439 451
440 AutofillDialogViewDelegate::~AutofillDialogViewDelegate() {} 452 AutofillDialogViewDelegate::~AutofillDialogViewDelegate() {}
441 453
442 AutofillDialogControllerImpl::~AutofillDialogControllerImpl() { 454 AutofillDialogControllerImpl::~AutofillDialogControllerImpl() {
443 if (popup_controller_) 455 if (popup_controller_)
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
797 GetDialogType() == DIALOG_TYPE_REQUEST_AUTOCOMPLETE; 809 GetDialogType() == DIALOG_TYPE_REQUEST_AUTOCOMPLETE;
798 if (!show_wallet_interstitial) 810 if (!show_wallet_interstitial)
799 return DialogOverlayState(); 811 return DialogOverlayState();
800 812
801 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 813 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
802 DialogOverlayState state; 814 DialogOverlayState state;
803 815
804 state.strings.push_back(DialogOverlayString()); 816 state.strings.push_back(DialogOverlayString());
805 DialogOverlayString& string = state.strings.back(); 817 DialogOverlayString& string = state.strings.back();
806 string.font = rb.GetFont(ui::ResourceBundle::BaseFont).DeriveFont(4); 818 string.font = rb.GetFont(ui::ResourceBundle::BaseFont).DeriveFont(4);
819 string.alignment = gfx::ALIGN_CENTER;
820 string.text_color = SK_ColorBLACK;
807 821
808 // First-run, post-submit, Wallet expository page. 822 // First-run, post-submit, Wallet expository page.
809 if (full_wallet_ && full_wallet_->required_actions().empty()) { 823 if (full_wallet_ && full_wallet_->required_actions().empty()) {
810 string16 cc_number = 824 string16 cc_number =
811 full_wallet_->GetInfo(AutofillType(CREDIT_CARD_NUMBER)); 825 full_wallet_->GetInfo(AutofillType(CREDIT_CARD_NUMBER));
812 DCHECK_EQ(16U, cc_number.size()); 826 DCHECK_EQ(16U, cc_number.size());
813 state.image = GetGeneratedCardImage( 827 state.image = GetGeneratedCardImage(
814 ASCIIToUTF16("xxxx xxxx xxxx ") + 828 ASCIIToUTF16("XXXX XXXX XXXX ") +
815 cc_number.substr(cc_number.size() - 4)); 829 cc_number.substr(cc_number.size() - 4),
830 full_wallet_->billing_address()->recipient_name());
831
816 string.text = l10n_util::GetStringUTF16( 832 string.text = l10n_util::GetStringUTF16(
817 IDS_AUTOFILL_DIALOG_CARD_GENERATION_DONE); 833 IDS_AUTOFILL_DIALOG_CARD_GENERATION_DONE);
818 string.text_color = SK_ColorBLACK;
819 string.alignment = gfx::ALIGN_CENTER;
820
821 state.strings.push_back(DialogOverlayString()); 834 state.strings.push_back(DialogOverlayString());
822 DialogOverlayString& subtext = state.strings.back();
823 subtext.font = rb.GetFont(ui::ResourceBundle::BaseFont);
824 subtext.text_color = SkColorSetRGB(102, 102, 102);
825 subtext.text = l10n_util::GetStringUTF16(
826 IDS_AUTOFILL_DIALOG_CARD_GENERATION_EXPLANATION);
827 subtext.alignment = gfx::ALIGN_CENTER;
828
829 state.button_text = l10n_util::GetStringUTF16(
830 IDS_AUTOFILL_DIALOG_CARD_GENERATION_OK_BUTTON);
831 } else { 835 } else {
832 // TODO(estade): fix this (animation?). 836 // Generate a random card number. Tell the view to update it 100ms from now
833 state.image = 837 // (at which point we'll generate another random card number).
834 GetGeneratedCardImage(ASCIIToUTF16("xxxx xxxx xx...")); 838 std::string card_number;
839 for (size_t i = 0; i < 4; ++i) {
840 int part = base::RandInt(0, 10000);
841 base::StringAppendF(&card_number, "%04d ", part);
842 }
843 state.image = GetGeneratedCardImage(
844 ASCIIToUTF16(card_number),
845 ActiveInstrument()->address().recipient_name());
846 state.expiry = base::TimeDelta::FromMilliseconds(100);
groby-ooo-7-16 2013/09/03 18:50:04 Constant?
Evan Stade 2013/09/03 19:05:37 I don't see the purpose of a constant here because
835 847
836 // "Submitting" waiting page. 848 // "Submitting" waiting page.
837 string.text = l10n_util::GetStringUTF16( 849 string.text = l10n_util::GetStringUTF16(
838 IDS_AUTOFILL_DIALOG_CARD_GENERATION_IN_PROGRESS); 850 IDS_AUTOFILL_DIALOG_CARD_GENERATION_IN_PROGRESS);
839 string.text_color = SK_ColorBLACK;
840 string.alignment = gfx::ALIGN_CENTER;
841 } 851 }
842 852
843 return state; 853 return state;
844 } 854 }
845 855
846 const std::vector<ui::Range>& AutofillDialogControllerImpl:: 856 const std::vector<ui::Range>& AutofillDialogControllerImpl::
847 LegalDocumentLinks() { 857 LegalDocumentLinks() {
848 EnsureLegalDocumentsText(); 858 EnsureLegalDocumentsText();
849 return legal_document_link_ranges_; 859 return legal_document_link_ranges_;
850 } 860 }
(...skipping 1082 matching lines...) Expand 10 before | Expand all | Expand 10 after
1933 for (size_t i = 0; i < legal_document_link_ranges_.size(); ++i) { 1943 for (size_t i = 0; i < legal_document_link_ranges_.size(); ++i) {
1934 if (legal_document_link_ranges_[i] == range) { 1944 if (legal_document_link_ranges_[i] == range) {
1935 OpenTabWithUrl(wallet_items_->legal_documents()[i]->url()); 1945 OpenTabWithUrl(wallet_items_->legal_documents()[i]->url());
1936 return; 1946 return;
1937 } 1947 }
1938 } 1948 }
1939 1949
1940 NOTREACHED(); 1950 NOTREACHED();
1941 } 1951 }
1942 1952
1943 void AutofillDialogControllerImpl::OverlayButtonPressed() {
1944 DCHECK(is_submitting_);
1945 DCHECK(full_wallet_);
1946 profile_->GetPrefs()->SetBoolean(::prefs::kAutofillDialogHasPaidWithWallet,
1947 true);
1948 FinishSubmit();
1949 }
1950
1951 bool AutofillDialogControllerImpl::OnCancel() { 1953 bool AutofillDialogControllerImpl::OnCancel() {
1952 HidePopup(); 1954 HidePopup();
1953 if (autocheckout_state_ == AUTOCHECKOUT_NOT_STARTED && !is_submitting_) 1955 if (autocheckout_state_ == AUTOCHECKOUT_NOT_STARTED && !is_submitting_)
1954 LogOnCancelMetrics(); 1956 LogOnCancelMetrics();
1955 if (autocheckout_state_ == AUTOCHECKOUT_IN_PROGRESS) { 1957 if (autocheckout_state_ == AUTOCHECKOUT_IN_PROGRESS) {
1956 GetMetricLogger().LogAutocheckoutDuration( 1958 GetMetricLogger().LogAutocheckoutDuration(
1957 base::Time::Now() - autocheckout_started_timestamp_, 1959 base::Time::Now() - autocheckout_started_timestamp_,
1958 AutofillMetrics::AUTOCHECKOUT_CANCELLED); 1960 AutofillMetrics::AUTOCHECKOUT_CANCELLED);
1959 } 1961 }
1960 callback_.Run(NULL, std::string()); 1962 callback_.Run(NULL, std::string());
(...skipping 1213 matching lines...) Expand 10 before | Expand all | Expand 10 after
3174 if (*iter != wallet::INVALID_FORM_FIELD) { 3176 if (*iter != wallet::INVALID_FORM_FIELD) {
3175 // TODO(dbeam): handle this more gracefully. 3177 // TODO(dbeam): handle this more gracefully.
3176 DisableWallet(wallet::WalletClient::UNKNOWN_ERROR); 3178 DisableWallet(wallet::WalletClient::UNKNOWN_ERROR);
3177 } 3179 }
3178 } 3180 }
3179 SetAutocheckoutState(AUTOCHECKOUT_NOT_STARTED); 3181 SetAutocheckoutState(AUTOCHECKOUT_NOT_STARTED);
3180 SetIsSubmitting(false); 3182 SetIsSubmitting(false);
3181 } 3183 }
3182 3184
3183 void AutofillDialogControllerImpl::FinishSubmit() { 3185 void AutofillDialogControllerImpl::FinishSubmit() {
3184 if (IsPayingWithWallet() &&
3185 !profile_->GetPrefs()->GetBoolean(
3186 ::prefs::kAutofillDialogHasPaidWithWallet)) {
3187 if (GetDialogType() == DIALOG_TYPE_REQUEST_AUTOCOMPLETE) {
3188 // To get past this point, the view must call back OverlayButtonPressed.
3189 #if defined(TOOLKIT_VIEWS) 3186 #if defined(TOOLKIT_VIEWS)
3190 ScopedViewUpdates updates(view_.get()); 3187 // TODO(estade): implement overlays on other platforms.
groby-ooo-7-16 2013/09/03 18:50:04 Is there a particular reason to not implement this
Evan Stade 2013/09/03 19:05:37 I'd rather that enabling this on mac be a separate
3191 view_->UpdateButtonStrip(); 3188 if (IsPayingWithWallet()) {
3192 #else 3189 // To get past this point, the view must call back OverlayButtonPressed.
3193 // TODO(estade): implement overlays on other platforms. 3190 ScopedViewUpdates updates(view_.get());
3194 OverlayButtonPressed(); 3191 view_->UpdateButtonStrip();
3192
3193 base::MessageLoop::current()->PostDelayedTask(
3194 FROM_HERE,
3195 base::Bind(&AutofillDialogControllerImpl::DoFinishSubmit,
3196 weak_ptr_factory_.GetWeakPtr()),
3197 base::TimeDelta::FromMilliseconds(2000));
groby-ooo-7-16 2013/09/03 18:50:04 Declare as constant?
Evan Stade 2013/09/03 19:05:37 ditto
3198 return;
3199 }
3195 #endif 3200 #endif
3196 return; 3201
3197 } else { 3202 DoFinishSubmit();
3198 profile_->GetPrefs()->SetBoolean( 3203 }
3199 ::prefs::kAutofillDialogHasPaidWithWallet, true); 3204
3200 } 3205 void AutofillDialogControllerImpl::DoFinishSubmit() {
3206 if (IsPayingWithWallet()) {
3207 profile_->GetPrefs()->SetBoolean(::prefs::kAutofillDialogHasPaidWithWallet,
3208 true);
3201 } 3209 }
3202 3210
3203 FillOutputForSection(SECTION_EMAIL); 3211 FillOutputForSection(SECTION_EMAIL);
3204 FillOutputForSection(SECTION_CC); 3212 FillOutputForSection(SECTION_CC);
3205 FillOutputForSection(SECTION_BILLING); 3213 FillOutputForSection(SECTION_BILLING);
3206 FillOutputForSection(SECTION_CC_BILLING); 3214 FillOutputForSection(SECTION_CC_BILLING);
3207 3215
3208 if (ShouldUseBillingForShipping()) { 3216 if (ShouldUseBillingForShipping()) {
3209 FillOutputForSectionWithComparator( 3217 FillOutputForSectionWithComparator(
3210 SECTION_BILLING, 3218 SECTION_BILLING,
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
3506 } 3514 }
3507 #if !defined(OS_ANDROID) 3515 #if !defined(OS_ANDROID)
3508 GeneratedCreditCardBubbleController::Show( 3516 GeneratedCreditCardBubbleController::Show(
3509 web_contents(), 3517 web_contents(),
3510 full_wallet_->TypeAndLastFourDigits(), 3518 full_wallet_->TypeAndLastFourDigits(),
3511 backing_last_four); 3519 backing_last_four);
3512 #endif 3520 #endif
3513 } 3521 }
3514 3522
3515 } // namespace autofill 3523 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698