account_chooser_model.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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 3// found in the LICENSE file. 4 5#include "chrome/browser/ui/autofill/account_chooser_model.h" 6 7#include "base/bind.h" 8#include "base/prefs/pref_service.h" 9#include "base/strings/string_number_conversions.h" 10#include "base/strings/stringprintf.h" 11#include "base/strings/utf_string_conversions.h" 12#include "base/time/time.h" 13#include "chrome/common/pref_names.h" 14#include "components/autofill/core/browser/autofill_metrics.h" 15#include "grit/generated_resources.h" 16#include "grit/theme_resources.h" 17#include "ui/base/l10n/l10n_util.h" 18#include "ui/base/resource/resource_bundle.h" 19 20namespace autofill { 21 22const int AccountChooserModel::kActiveWalletItemId = 0; 23const int AccountChooserModel::kAutofillItemId = 1; 24 25AccountChooserModelDelegate::~AccountChooserModelDelegate() {} 26 27AccountChooserModel::AccountChooserModel( 28 AccountChooserModelDelegate* delegate, 29 PrefService* prefs, 30 const AutofillMetrics& metric_logger, 31 DialogType dialog_type) 32 : ui::SimpleMenuModel(this), 33 delegate_(delegate), 34 checked_item_( 35 prefs->GetBoolean(::prefs::kAutofillDialogPayWithoutWallet) ? 36 kAutofillItemId : kActiveWalletItemId), 37 metric_logger_(metric_logger), 38 dialog_type_(dialog_type) { 39 ReconstructMenuItems(); 40} 41 42AccountChooserModel::~AccountChooserModel() { 43} 44 45void AccountChooserModel::SelectActiveWalletAccount() { 46 ExecuteCommand(kActiveWalletItemId, 0); 47} 48 49void AccountChooserModel::SelectUseAutofill() { 50 ExecuteCommand(kAutofillItemId, 0); 51} 52 53bool AccountChooserModel::HasAccountsToChoose() const { 54 return !active_wallet_account_name_.empty(); 55} 56 57void AccountChooserModel::SetActiveWalletAccountName( 58 const string16& account) { 59 active_wallet_account_name_ = account; 60 ReconstructMenuItems(); 61 delegate_->UpdateAccountChooserView(); 62} 63 64void AccountChooserModel::ClearActiveWalletAccountName() { 65 active_wallet_account_name_.clear(); 66 ReconstructMenuItems(); 67 delegate_->UpdateAccountChooserView(); 68} 69 70bool AccountChooserModel::IsCommandIdChecked(int command_id) const { 71 return command_id == checked_item_; 72} 73 74bool AccountChooserModel::IsCommandIdEnabled(int command_id) const { 75 // Currently, _any_ (non-sign-in) error disables _all_ Wallet accounts. 76 if (command_id != kAutofillItemId && HadWalletError()) 77 return false; 78 79 return true; 80} 81 82bool AccountChooserModel::GetAcceleratorForCommandId( 83 int command_id, 84 ui::Accelerator* accelerator) { 85 return false; 86} 87 88void AccountChooserModel::ExecuteCommand(int command_id, int event_flags) { 89 if (checked_item_ == command_id) 90 return; 91 92 // Log metrics. 93 AutofillMetrics::DialogUiEvent chooser_event; 94 if (command_id == kAutofillItemId) { 95 chooser_event = 96 AutofillMetrics::DIALOG_UI_ACCOUNT_CHOOSER_SWITCHED_TO_AUTOFILL; 97 } else if (checked_item_ == kAutofillItemId) { 98 chooser_event = 99 AutofillMetrics::DIALOG_UI_ACCOUNT_CHOOSER_SWITCHED_TO_WALLET; 100 } else { 101 chooser_event = 102 AutofillMetrics::DIALOG_UI_ACCOUNT_CHOOSER_SWITCHED_WALLET_ACCOUNT; 103 } 104 metric_logger_.LogDialogUiEvent(dialog_type_, chooser_event); 105 106 checked_item_ = command_id; 107 ReconstructMenuItems(); 108 delegate_->AccountChoiceChanged(); 109} 110 111void AccountChooserModel::SetHadWalletError(const base::string16& message) { 112 // Any non-sign-in error disables all Wallet accounts. 113 wallet_error_message_ = message; 114 ClearActiveWalletAccountName(); 115 ExecuteCommand(kAutofillItemId, 0); 116} 117 118bool AccountChooserModel::HadWalletError() const { 119 return !wallet_error_message_.empty(); 120} 121 122void AccountChooserModel::SetHadWalletSigninError() { 123 ClearActiveWalletAccountName(); 124 ExecuteCommand(kAutofillItemId, 0); 125} 126 127bool AccountChooserModel::WalletIsSelected() const { 128 return checked_item_ != kAutofillItemId; 129} 130 131bool AccountChooserModel::IsActiveWalletAccountSelected() const { 132 return checked_item_ == kActiveWalletItemId; 133} 134 135void AccountChooserModel::ReconstructMenuItems() { 136 Clear(); 137 const gfx::Image& wallet_icon = 138 ui::ResourceBundle::GetSharedInstance().GetImageNamed(IDR_WALLET_ICON); 139 140 if (!active_wallet_account_name_.empty()) { 141 AddCheckItem(kActiveWalletItemId, active_wallet_account_name_); 142 SetIcon(GetIndexOfCommandId(kActiveWalletItemId), wallet_icon); 143 } else if (checked_item_ == kActiveWalletItemId) { 144 // A selected active Wallet account with an empty account name means 145 // that the sign-in attempt is in progress. 146 // TODO(aruslan): http://crbug.com/230932 147 // A throbber should be shown until the Wallet account name is set. 148 AddCheckItem(kActiveWalletItemId, 149 l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_GOOGLE_WALLET)); 150 } 151 152 AddCheckItemWithStringId(kAutofillItemId, 153 IDS_AUTOFILL_DIALOG_PAY_WITHOUT_WALLET); 154} 155 156} // namespace autofill 157