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

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

Issue 13331007: Multi-account AccountChooser for interactive autocomplete. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 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 <string> 8 #include <string>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 return REQUIRES_PASSIVE_SIGN_IN; 455 return REQUIRES_PASSIVE_SIGN_IN;
456 456
457 return SIGNED_IN; 457 return SIGNED_IN;
458 } 458 }
459 459
460 bool AutofillDialogControllerImpl::ShouldShowSpinner() const { 460 bool AutofillDialogControllerImpl::ShouldShowSpinner() const {
461 return IsPayingWithWallet() && SignedInState() == REQUIRES_RESPONSE; 461 return IsPayingWithWallet() && SignedInState() == REQUIRES_RESPONSE;
462 } 462 }
463 463
464 string16 AutofillDialogControllerImpl::AccountChooserText() const { 464 string16 AutofillDialogControllerImpl::AccountChooserText() const {
465 // TODO(aruslan): this should be l10n "Not using Google Wallet".
465 if (!IsPayingWithWallet()) 466 if (!IsPayingWithWallet())
466 return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PAY_WITHOUT_WALLET); 467 return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PAY_WITHOUT_WALLET);
467 468
468 // TODO(dbeam): real strings and l10n.
469 if (SignedInState() == SIGNED_IN) 469 if (SignedInState() == SIGNED_IN)
470 return ASCIIToUTF16(current_username_); 470 return ASCIIToUTF16(account_chooser_model_.GetCurrentlySignedInAccount());
471 471
472 // In this case, the account chooser should be showing the signin link. 472 // In this case, the account chooser should be showing the signin link.
473 return string16(); 473 return string16();
474 } 474 }
475 475
476 string16 AutofillDialogControllerImpl::SignInLinkText() const { 476 string16 AutofillDialogControllerImpl::SignInLinkText() const {
477 // TODO(estade): real strings and l10n. 477 // TODO(estade): real strings and l10n.
478 return ASCIIToUTF16("Sign in to use Google Wallet"); 478 return ASCIIToUTF16("Sign in to use Google Wallet");
479 } 479 }
480 480
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 std::vector<wallet::WalletClient::RiskCapability>()); 522 std::vector<wallet::WalletClient::RiskCapability>());
523 } 523 }
524 524
525 void AutofillDialogControllerImpl::OnWalletOrSigninUpdate() { 525 void AutofillDialogControllerImpl::OnWalletOrSigninUpdate() {
526 if (wallet_items_.get()) { 526 if (wallet_items_.get()) {
527 DCHECK(IsPayingWithWallet()); 527 DCHECK(IsPayingWithWallet());
528 DCHECK(!signin_helper_.get()); 528 DCHECK(!signin_helper_.get());
529 switch (SignedInState()) { 529 switch (SignedInState()) {
530 case SIGNED_IN: 530 case SIGNED_IN:
531 // Start fetching the user name if we don't know it yet. 531 // Start fetching the user name if we don't know it yet.
532 if (current_username_.empty()) { 532 if (account_chooser_model_.GetCurrentlySignedInAccount().empty()) {
533 signin_helper_.reset(new wallet::WalletSigninHelper( 533 signin_helper_.reset(new wallet::WalletSigninHelper(
534 this, 534 this,
535 profile_->GetRequestContext())); 535 profile_->GetRequestContext()));
536 signin_helper_->StartUserNameFetch(); 536 signin_helper_->StartUserNameFetch();
537 } 537 }
538 break; 538 break;
539 539
540 case REQUIRES_SIGN_IN: 540 case REQUIRES_SIGN_IN:
541 // TODO(aruslan): automatic sign-in? 541 // Switch to the local account and refresh the dialog.
542 OnWalletSigninError();
542 break; 543 break;
543 544
544 case REQUIRES_PASSIVE_SIGN_IN: 545 case REQUIRES_PASSIVE_SIGN_IN:
545 // Attempt to passively sign in the user. 546 // Attempt to passively sign in the user.
546 current_username_.clear(); 547 account_chooser_model_.ResetCurrentlySignedInAccount();
547 signin_helper_.reset(new wallet::WalletSigninHelper( 548 signin_helper_.reset(new wallet::WalletSigninHelper(
548 this, 549 this,
549 profile_->GetRequestContext())); 550 profile_->GetRequestContext()));
550 signin_helper_->StartPassiveSignin(); 551 signin_helper_->StartPassiveSignin();
551 break; 552 break;
552 553
553 case REQUIRES_RESPONSE: 554 case REQUIRES_RESPONSE:
554 NOTREACHED(); 555 NOTREACHED();
555 } 556 }
556 } 557 }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
600 return NULL; 601 return NULL;
601 } 602 }
602 } 603 }
603 604
604 ui::MenuModel* AutofillDialogControllerImpl::MenuModelForSection( 605 ui::MenuModel* AutofillDialogControllerImpl::MenuModelForSection(
605 DialogSection section) { 606 DialogSection section) {
606 return SuggestionsMenuModelForSection(section); 607 return SuggestionsMenuModelForSection(section);
607 } 608 }
608 609
609 ui::MenuModel* AutofillDialogControllerImpl::MenuModelForAccountChooser() { 610 ui::MenuModel* AutofillDialogControllerImpl::MenuModelForAccountChooser() {
610 // When paying with wallet, but not signed in, there is no menu, just a 611 // If there is no accounts to choose from except the autofill data,
611 // sign in link. 612 // there is no menu, just a sign in link.
Evan Stade 2013/03/29 23:08:45 comment is hard to follow. "Autofill data" is not
aruslan 2013/03/30 00:07:47 Done.
612 if (IsPayingWithWallet() && SignedInState() != SIGNED_IN) 613 if (!account_chooser_model_.HasAccountsToChoose())
613 return NULL; 614 return NULL;
614 615
615 return &account_chooser_model_; 616 return &account_chooser_model_;
616 } 617 }
617 618
618 gfx::Image AutofillDialogControllerImpl::AccountChooserImage() { 619 gfx::Image AutofillDialogControllerImpl::AccountChooserImage() {
619 if (!MenuModelForAccountChooser()) { 620 if (!MenuModelForAccountChooser()) {
620 return ui::ResourceBundle::GetSharedInstance().GetImageNamed( 621 return ui::ResourceBundle::GetSharedInstance().GetImageNamed(
621 IDR_WALLET_ICON); 622 IDR_WALLET_ICON);
622 } 623 }
623 624
624 gfx::Image icon; 625 gfx::Image icon;
625 account_chooser_model_.GetIconAt(account_chooser_model_.checked_item(), 626 account_chooser_model_.GetIconAt(
626 &icon); 627 account_chooser_model_.GetIndexOfCommandId(
628 account_chooser_model_.checked_item()),
Evan Stade 2013/03/29 23:08:45 isn't the checked item already an index? aren't in
aruslan 2013/03/30 00:07:47 Not anymore; do you suggest it should be? Command-
629 &icon);
627 return icon; 630 return icon;
628 } 631 }
629 632
630 string16 AutofillDialogControllerImpl::LabelForSection(DialogSection section) 633 string16 AutofillDialogControllerImpl::LabelForSection(DialogSection section)
631 const { 634 const {
632 switch (section) { 635 switch (section) {
633 case SECTION_EMAIL: 636 case SECTION_EMAIL:
634 return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_EMAIL); 637 return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_EMAIL);
635 case SECTION_CC: 638 case SECTION_CC:
636 return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_CC); 639 return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_CC);
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after
1033 DialogNotification::WALLET_ERROR, 1036 DialogNotification::WALLET_ERROR,
1034 l10n_util::GetStringFUTF16( 1037 l10n_util::GetStringFUTF16(
1035 IDS_AUTOFILL_DIALOG_COMPLETE_WITHOUT_WALLET, 1038 IDS_AUTOFILL_DIALOG_COMPLETE_WITHOUT_WALLET,
1036 ASCIIToUTF16("Oops, [Wallet-Error].")))); 1039 ASCIIToUTF16("Oops, [Wallet-Error]."))));
1037 } 1040 }
1038 1041
1039 return notifications; 1042 return notifications;
1040 } 1043 }
1041 1044
1042 void AutofillDialogControllerImpl::StartSignInFlow() { 1045 void AutofillDialogControllerImpl::StartSignInFlow() {
1046 DCHECK(!IsPayingWithWallet());
1043 DCHECK(registrar_.IsEmpty()); 1047 DCHECK(registrar_.IsEmpty());
1044 1048
1045 content::Source<content::NavigationController> source(view_->ShowSignIn()); 1049 content::Source<content::NavigationController> source(view_->ShowSignIn());
1046 registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, source); 1050 registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, source);
1047 } 1051 }
1048 1052
1049 void AutofillDialogControllerImpl::EndSignInFlow() { 1053 void AutofillDialogControllerImpl::EndSignInFlow() {
1050 DCHECK(!registrar_.IsEmpty()); 1054 DCHECK(!registrar_.IsEmpty());
1051 registrar_.RemoveAll(); 1055 registrar_.RemoveAll();
1052 view_->HideSignIn(); 1056 view_->HideSignIn();
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1151 1155
1152 void AutofillDialogControllerImpl::Observe( 1156 void AutofillDialogControllerImpl::Observe(
1153 int type, 1157 int type,
1154 const content::NotificationSource& source, 1158 const content::NotificationSource& source,
1155 const content::NotificationDetails& details) { 1159 const content::NotificationDetails& details) {
1156 DCHECK_EQ(type, content::NOTIFICATION_NAV_ENTRY_COMMITTED); 1160 DCHECK_EQ(type, content::NOTIFICATION_NAV_ENTRY_COMMITTED);
1157 content::LoadCommittedDetails* load_details = 1161 content::LoadCommittedDetails* load_details =
1158 content::Details<content::LoadCommittedDetails>(details).ptr(); 1162 content::Details<content::LoadCommittedDetails>(details).ptr();
1159 if (wallet::IsSignInContinueUrl(load_details->entry->GetVirtualURL())) { 1163 if (wallet::IsSignInContinueUrl(load_details->entry->GetVirtualURL())) {
1160 EndSignInFlow(); 1164 EndSignInFlow();
1161 if (IsPayingWithWallet()) 1165 // The sign-in flow means that the user implicitly switched the account
1162 StartFetchingWalletItems(); 1166 // to the Wallet. This will trigger AccountChoiceChanged.
1167 DCHECK(!IsPayingWithWallet());
1168 account_chooser_model_.ForceWalletAccountSelected();
1163 } 1169 }
1164 } 1170 }
1165 1171
1166 //////////////////////////////////////////////////////////////////////////////// 1172 ////////////////////////////////////////////////////////////////////////////////
1167 // SuggestionsMenuModelDelegate implementation. 1173 // SuggestionsMenuModelDelegate implementation.
1168 1174
1169 void AutofillDialogControllerImpl::SuggestionItemSelected( 1175 void AutofillDialogControllerImpl::SuggestionItemSelected(
1170 const SuggestionsMenuModel& model) { 1176 const SuggestionsMenuModel& model) {
1171 DialogSection section = SectionForSuggestionsMenuModel(model); 1177 DialogSection section = SectionForSuggestionsMenuModel(model);
1172 section_editing_state_[section] = false; 1178 section_editing_state_[section] = false;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1209 1215
1210 if (full_wallet_->HasRequiredAction(wallet::VERIFY_CVV)) 1216 if (full_wallet_->HasRequiredAction(wallet::VERIFY_CVV))
1211 DisableWallet(); 1217 DisableWallet();
1212 else 1218 else
1213 FinishSubmit(); 1219 FinishSubmit();
1214 } 1220 }
1215 1221
1216 void AutofillDialogControllerImpl::OnPassiveSigninSuccess( 1222 void AutofillDialogControllerImpl::OnPassiveSigninSuccess(
1217 const std::string& username) { 1223 const std::string& username) {
1218 DCHECK(IsPayingWithWallet()); 1224 DCHECK(IsPayingWithWallet());
1219 current_username_ = username; 1225 account_chooser_model_.SetCurrentlySignedInAccount(username);
1220 signin_helper_.reset(); 1226 signin_helper_.reset();
1221 wallet_items_.reset(); 1227 wallet_items_.reset();
1222 StartFetchingWalletItems(); 1228 StartFetchingWalletItems();
1223 } 1229 }
1224 1230
1225 void AutofillDialogControllerImpl::OnUserNameFetchSuccess( 1231 void AutofillDialogControllerImpl::OnUserNameFetchSuccess(
1226 const std::string& username) { 1232 const std::string& username) {
1227 DCHECK(IsPayingWithWallet()); 1233 DCHECK(IsPayingWithWallet());
1228 current_username_ = username; 1234 account_chooser_model_.SetCurrentlySignedInAccount(username);
1229 signin_helper_.reset(); 1235 signin_helper_.reset();
1230 OnWalletOrSigninUpdate(); 1236 OnWalletOrSigninUpdate();
1231 } 1237 }
1232 1238
1233 void AutofillDialogControllerImpl::OnAutomaticSigninSuccess( 1239 void AutofillDialogControllerImpl::OnAutomaticSigninSuccess(
1234 const std::string& username) { 1240 const std::string& username) {
1235 // TODO(aruslan): automatic sign-in. 1241 // TODO(aruslan): automatic sign-in.
1236 NOTIMPLEMENTED(); 1242 NOTIMPLEMENTED();
1237 } 1243 }
1238 1244
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1326 void AutofillDialogControllerImpl::OnPersonalDataChanged() { 1332 void AutofillDialogControllerImpl::OnPersonalDataChanged() {
1327 HidePopup(); 1333 HidePopup();
1328 GenerateSuggestionsModels(); 1334 GenerateSuggestionsModels();
1329 view_->ModelChanged(); 1335 view_->ModelChanged();
1330 } 1336 }
1331 1337
1332 void AutofillDialogControllerImpl::AccountChoiceChanged() { 1338 void AutofillDialogControllerImpl::AccountChoiceChanged() {
1333 if (!view_) 1339 if (!view_)
1334 return; 1340 return;
1335 1341
1336 // Whenever the user changes the current account, the Wallet data should be 1342 // The Wallet data should be cleared when the user switches accounts.
1337 // cleared. If the user has chosen a Wallet account, an attempt to fetch
1338 // the Wallet data is made to see if the user is still signed in.
1339 // This will trigger a passive sign-in if required.
1340 // TODO(aruslan): integrate an automatic sign-in.
1341 wallet_items_.reset(); 1343 wallet_items_.reset();
1342 if (IsPayingWithWallet()) 1344 if (IsPayingWithWallet()) {
1343 StartFetchingWalletItems(); 1345 if (account_chooser_model_.IsCurrentlySignedInAccountSelected()) {
1346 // If the user has chosen a content-area Wallet account, an attempt to
1347 // fetch the Wallet data is made to see if the user is still signed in.
1348 // This will trigger a passive sign-in if required.
1349 StartFetchingWalletItems();
1350 } else {
1351 // TODO(aruslan): integrate an automatic sign-in.
1352 OnWalletSigninError();
1353 }
1354 }
1344 1355
1345 GenerateSuggestionsModels(); 1356 GenerateSuggestionsModels();
1346 view_->ModelChanged(); 1357 view_->ModelChanged();
1347 view_->UpdateAccountChooser(); 1358 view_->UpdateAccountChooser();
1348 view_->UpdateNotificationArea(); 1359 view_->UpdateNotificationArea();
1349 } 1360 }
1350 1361
1351 //////////////////////////////////////////////////////////////////////////////// 1362 ////////////////////////////////////////////////////////////////////////////////
1352 1363
1353 bool AutofillDialogControllerImpl::HandleKeyPressEventInInput( 1364 bool AutofillDialogControllerImpl::HandleKeyPressEventInInput(
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1386 wallet::WalletClient* AutofillDialogControllerImpl::GetWalletClient() { 1397 wallet::WalletClient* AutofillDialogControllerImpl::GetWalletClient() {
1387 return &wallet_client_; 1398 return &wallet_client_;
1388 } 1399 }
1389 1400
1390 bool AutofillDialogControllerImpl::IsPayingWithWallet() const { 1401 bool AutofillDialogControllerImpl::IsPayingWithWallet() const {
1391 return account_chooser_model_.WalletIsSelected(); 1402 return account_chooser_model_.WalletIsSelected();
1392 } 1403 }
1393 1404
1394 void AutofillDialogControllerImpl::DisableWallet() { 1405 void AutofillDialogControllerImpl::DisableWallet() {
1395 signin_helper_.reset(); 1406 signin_helper_.reset();
1396 current_username_.clear();
1397 account_chooser_model_.SetHadWalletError(); 1407 account_chooser_model_.SetHadWalletError();
1398 GetWalletClient()->CancelPendingRequests(); 1408 GetWalletClient()->CancelPendingRequests();
1399 } 1409 }
1400 1410
1401 void AutofillDialogControllerImpl::OnWalletSigninError() { 1411 void AutofillDialogControllerImpl::OnWalletSigninError() {
1402 signin_helper_.reset(); 1412 signin_helper_.reset();
1403 current_username_.clear();
1404 account_chooser_model_.SetHadWalletSigninError(); 1413 account_chooser_model_.SetHadWalletSigninError();
1405 GetWalletClient()->CancelPendingRequests(); 1414 GetWalletClient()->CancelPendingRequests();
1406 } 1415 }
1407 1416
1408 bool AutofillDialogControllerImpl::IsFirstRun() const { 1417 bool AutofillDialogControllerImpl::IsFirstRun() const {
1409 PrefService* prefs = profile_->GetPrefs(); 1418 PrefService* prefs = profile_->GetPrefs();
1410 return !prefs->HasPrefPath(prefs::kAutofillDialogPayWithoutWallet); 1419 return !prefs->HasPrefPath(prefs::kAutofillDialogPayWithoutWallet);
1411 } 1420 }
1412 1421
1413 void AutofillDialogControllerImpl::GenerateSuggestionsModels() { 1422 void AutofillDialogControllerImpl::GenerateSuggestionsModels() {
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
1842 AutofillMetrics::DIALOG_USER_SIGNED_IN_NO_WALLET_NO_AUTOFILL; 1851 AutofillMetrics::DIALOG_USER_SIGNED_IN_NO_WALLET_NO_AUTOFILL;
1843 } 1852 }
1844 1853
1845 // Has Wallet items. 1854 // Has Wallet items.
1846 return has_autofill_profiles ? 1855 return has_autofill_profiles ?
1847 AutofillMetrics::DIALOG_USER_SIGNED_IN_HAS_WALLET_HAS_AUTOFILL : 1856 AutofillMetrics::DIALOG_USER_SIGNED_IN_HAS_WALLET_HAS_AUTOFILL :
1848 AutofillMetrics::DIALOG_USER_SIGNED_IN_HAS_WALLET_NO_AUTOFILL; 1857 AutofillMetrics::DIALOG_USER_SIGNED_IN_HAS_WALLET_NO_AUTOFILL;
1849 } 1858 }
1850 1859
1851 } // namespace autofill 1860 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698