blob: 3c3bcb010596f75eabcf6ffa67fa1d4acdbae093 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/autofill/account_chooser_model.h"
#include "base/bind.h"
#include "base/prefs/pref_service.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
#include "chrome/common/pref_names.h"
#include "components/autofill/core/browser/autofill_metrics.h"
#include "grit/generated_resources.h"
#include "grit/theme_resources.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
namespace autofill {
const int AccountChooserModel::kActiveWalletItemId = 0;
const int AccountChooserModel::kAutofillItemId = 1;
AccountChooserModelDelegate::~AccountChooserModelDelegate() {}
AccountChooserModel::AccountChooserModel(
AccountChooserModelDelegate* delegate,
PrefService* prefs,
const AutofillMetrics& metric_logger,
DialogType dialog_type)
: ui::SimpleMenuModel(this),
delegate_(delegate),
checked_item_(
prefs->GetBoolean(::prefs::kAutofillDialogPayWithoutWallet) ?
kAutofillItemId : kActiveWalletItemId),
metric_logger_(metric_logger),
dialog_type_(dialog_type) {
ReconstructMenuItems();
}
AccountChooserModel::~AccountChooserModel() {
}
void AccountChooserModel::SelectActiveWalletAccount() {
ExecuteCommand(kActiveWalletItemId, 0);
}
void AccountChooserModel::SelectUseAutofill() {
ExecuteCommand(kAutofillItemId, 0);
}
bool AccountChooserModel::HasAccountsToChoose() const {
return !active_wallet_account_name_.empty();
}
void AccountChooserModel::SetActiveWalletAccountName(
const string16& account) {
active_wallet_account_name_ = account;
ReconstructMenuItems();
delegate_->UpdateAccountChooserView();
}
void AccountChooserModel::ClearActiveWalletAccountName() {
active_wallet_account_name_.clear();
ReconstructMenuItems();
delegate_->UpdateAccountChooserView();
}
bool AccountChooserModel::IsCommandIdChecked(int command_id) const {
return command_id == checked_item_;
}
bool AccountChooserModel::IsCommandIdEnabled(int command_id) const {
// Currently, _any_ (non-sign-in) error disables _all_ Wallet accounts.
if (command_id != kAutofillItemId && HadWalletError())
return false;
return true;
}
bool AccountChooserModel::GetAcceleratorForCommandId(
int command_id,
ui::Accelerator* accelerator) {
return false;
}
void AccountChooserModel::ExecuteCommand(int command_id, int event_flags) {
if (checked_item_ == command_id)
return;
// Log metrics.
AutofillMetrics::DialogUiEvent chooser_event;
if (command_id == kAutofillItemId) {
chooser_event =
AutofillMetrics::DIALOG_UI_ACCOUNT_CHOOSER_SWITCHED_TO_AUTOFILL;
} else if (checked_item_ == kAutofillItemId) {
chooser_event =
AutofillMetrics::DIALOG_UI_ACCOUNT_CHOOSER_SWITCHED_TO_WALLET;
} else {
chooser_event =
AutofillMetrics::DIALOG_UI_ACCOUNT_CHOOSER_SWITCHED_WALLET_ACCOUNT;
}
metric_logger_.LogDialogUiEvent(dialog_type_, chooser_event);
checked_item_ = command_id;
ReconstructMenuItems();
delegate_->AccountChoiceChanged();
}
void AccountChooserModel::SetHadWalletError(const base::string16& message) {
// Any non-sign-in error disables all Wallet accounts.
wallet_error_message_ = message;
ClearActiveWalletAccountName();
ExecuteCommand(kAutofillItemId, 0);
}
bool AccountChooserModel::HadWalletError() const {
return !wallet_error_message_.empty();
}
void AccountChooserModel::SetHadWalletSigninError() {
ClearActiveWalletAccountName();
ExecuteCommand(kAutofillItemId, 0);
}
bool AccountChooserModel::WalletIsSelected() const {
return checked_item_ != kAutofillItemId;
}
bool AccountChooserModel::IsActiveWalletAccountSelected() const {
return checked_item_ == kActiveWalletItemId;
}
void AccountChooserModel::ReconstructMenuItems() {
Clear();
const gfx::Image& wallet_icon =
ui::ResourceBundle::GetSharedInstance().GetImageNamed(IDR_WALLET_ICON);
if (!active_wallet_account_name_.empty()) {
AddCheckItem(kActiveWalletItemId, active_wallet_account_name_);
SetIcon(GetIndexOfCommandId(kActiveWalletItemId), wallet_icon);
} else if (checked_item_ == kActiveWalletItemId) {
// A selected active Wallet account with an empty account name means
// that the sign-in attempt is in progress.
// TODO(aruslan): http://crbug.com/230932
// A throbber should be shown until the Wallet account name is set.
AddCheckItem(kActiveWalletItemId,
l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_GOOGLE_WALLET));
}
AddCheckItemWithStringId(kAutofillItemId,
IDS_AUTOFILL_DIALOG_PAY_WITHOUT_WALLET);
}
} // namespace autofill