account_chooser_model.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
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/browser/profiles/profile.h" 14#include "chrome/common/pref_names.h" 15#include "components/autofill/core/browser/autofill_metrics.h" 16#include "grit/generated_resources.h" 17#include "grit/theme_resources.h" 18#include "ui/base/l10n/l10n_util.h" 19#include "ui/base/resource/resource_bundle.h" 20 21namespace autofill { 22 23const int AccountChooserModel::kAutofillItemId = 0; 24const int AccountChooserModel::kWalletAccountsStartId = 1; 25 26AccountChooserModelDelegate::~AccountChooserModelDelegate() {} 27 28AccountChooserModel::AccountChooserModel( 29 AccountChooserModelDelegate* delegate, 30 Profile* profile, 31 const AutofillMetrics& metric_logger) 32 : ui::SimpleMenuModel(this), 33 delegate_(delegate), 34 checked_item_(kWalletAccountsStartId), 35 active_wallet_account_(0U), 36 had_wallet_error_(false), 37 metric_logger_(metric_logger) { 38 if (profile->GetPrefs()->GetBoolean( 39 ::prefs::kAutofillDialogPayWithoutWallet) || 40 profile->IsOffTheRecord()) { 41 checked_item_ = kAutofillItemId; 42 } 43 44 ReconstructMenuItems(); 45} 46 47AccountChooserModel::~AccountChooserModel() { 48} 49 50void AccountChooserModel::MenuWillShow() { 51 ui::SimpleMenuModel::MenuWillShow(); 52} 53 54void AccountChooserModel::SelectActiveWalletAccount() { 55 ExecuteCommand(kWalletAccountsStartId + active_wallet_account_, 0); 56} 57 58void AccountChooserModel::SelectUseAutofill() { 59 ExecuteCommand(kAutofillItemId, 0); 60} 61 62bool AccountChooserModel::HasAccountsToChoose() const { 63 return !wallet_accounts_.empty(); 64} 65 66void AccountChooserModel::SetWalletAccounts( 67 const std::vector<std::string>& accounts) { 68 wallet_accounts_ = accounts; 69 ReconstructMenuItems(); 70 delegate_->UpdateAccountChooserView(); 71} 72 73void AccountChooserModel::ClearWalletAccounts() { 74 wallet_accounts_.clear(); 75 if (WalletIsSelected()) 76 checked_item_ = kWalletAccountsStartId; 77 78 ReconstructMenuItems(); 79 delegate_->UpdateAccountChooserView(); 80} 81 82base::string16 AccountChooserModel::GetActiveWalletAccountName() const { 83 if (wallet_accounts_.empty()) 84 return base::string16(); 85 86 return UTF8ToUTF16(wallet_accounts_[GetActiveWalletAccountIndex()]); 87} 88 89size_t AccountChooserModel::GetActiveWalletAccountIndex() const { 90 return active_wallet_account_; 91} 92 93bool AccountChooserModel::IsCommandIdChecked(int command_id) const { 94 return command_id == checked_item_; 95} 96 97bool AccountChooserModel::IsCommandIdEnabled(int command_id) const { 98 // Currently, _any_ (non-sign-in) error disables _all_ Wallet accounts. 99 if (command_id != kAutofillItemId && had_wallet_error_) 100 return false; 101 102 return true; 103} 104 105bool AccountChooserModel::GetAcceleratorForCommandId( 106 int command_id, 107 ui::Accelerator* accelerator) { 108 return false; 109} 110 111void AccountChooserModel::ExecuteCommand(int command_id, int event_flags) { 112 if (checked_item_ == command_id) 113 return; 114 115 // Log metrics. 116 AutofillMetrics::DialogUiEvent chooser_event; 117 if (command_id == kAutofillItemId) { 118 chooser_event = 119 AutofillMetrics::DIALOG_UI_ACCOUNT_CHOOSER_SWITCHED_TO_AUTOFILL; 120 } else if (checked_item_ == kAutofillItemId) { 121 chooser_event = 122 AutofillMetrics::DIALOG_UI_ACCOUNT_CHOOSER_SWITCHED_TO_WALLET; 123 } else { 124 chooser_event = 125 AutofillMetrics::DIALOG_UI_ACCOUNT_CHOOSER_SWITCHED_WALLET_ACCOUNT; 126 } 127 metric_logger_.LogDialogUiEvent(chooser_event); 128 129 checked_item_ = command_id; 130 if (checked_item_ >= kWalletAccountsStartId) 131 active_wallet_account_ = checked_item_ - kWalletAccountsStartId; 132 133 ReconstructMenuItems(); 134 delegate_->AccountChoiceChanged(); 135} 136 137void AccountChooserModel::MenuWillShow(ui::SimpleMenuModel* source) { 138 delegate_->AccountChooserWillShow(); 139} 140 141void AccountChooserModel::SetHadWalletError() { 142 // Any non-sign-in error disables all Wallet accounts. 143 had_wallet_error_ = true; 144 ClearWalletAccounts(); 145 ExecuteCommand(kAutofillItemId, 0); 146} 147 148void AccountChooserModel::SetHadWalletSigninError() { 149 ClearWalletAccounts(); 150 ExecuteCommand(kAutofillItemId, 0); 151} 152 153bool AccountChooserModel::WalletIsSelected() const { 154 return checked_item_ != kAutofillItemId; 155} 156 157void AccountChooserModel::ReconstructMenuItems() { 158 Clear(); 159 const gfx::Image& wallet_icon = 160 ui::ResourceBundle::GetSharedInstance().GetImageNamed(IDR_WALLET_ICON); 161 162 if (!wallet_accounts_.empty()) { 163 for (size_t i = 0; i < wallet_accounts_.size(); ++i) { 164 int item_id = kWalletAccountsStartId + i; 165 AddCheckItem(item_id, UTF8ToUTF16(wallet_accounts_[i])); 166 SetIcon(GetIndexOfCommandId(item_id), wallet_icon); 167 } 168 } else if (checked_item_ == kWalletAccountsStartId) { 169 // A selected active Wallet account without account names means 170 // that the sign-in attempt is in progress. 171 AddCheckItem(kWalletAccountsStartId, 172 l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_GOOGLE_WALLET)); 173 } 174 175 AddCheckItemWithStringId(kAutofillItemId, 176 IDS_AUTOFILL_DIALOG_PAY_WITHOUT_WALLET); 177} 178 179} // namespace autofill 180