blob: fd3f001803edeb061e304b025d9d7099e07330d0 [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.
#ifndef CHROME_BROWSER_UI_AUTOFILL_ACCOUNT_CHOOSER_MODEL_H_
#define CHROME_BROWSER_UI_AUTOFILL_ACCOUNT_CHOOSER_MODEL_H_
#include <vector>
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/strings/string16.h"
#include "components/autofill/core/browser/autofill_manager_delegate.h"
#include "ui/base/models/simple_menu_model.h"
class AutofillMetrics;
class PrefService;
namespace autofill {
// A delegate interface to allow the AccountChooserModel to inform its owner
// of changes.
class AccountChooserModelDelegate {
public:
virtual ~AccountChooserModelDelegate();
// Called when the active account has changed.
virtual void AccountChoiceChanged() = 0;
// Called when the account chooser UI needs to be updated.
virtual void UpdateAccountChooserView() = 0;
};
// A menu model for the account chooser. This allows users to switch between
// Online Wallet accounts and local Autofill data.
// Terminology:
// - "Active Wallet account": the account used for communications with the
// Online Wallet service. There may be multiple signed-in accounts, but at any
// point of time at most one of is active.
class AccountChooserModel : public ui::SimpleMenuModel,
public ui::SimpleMenuModel::Delegate {
public:
AccountChooserModel(AccountChooserModelDelegate* delegate,
PrefService* prefs,
const AutofillMetrics& metric_logger,
DialogType dialog_type);
virtual ~AccountChooserModel();
// ui::SimpleMenuModel::Delegate implementation.
virtual bool IsCommandIdChecked(int command_id) const OVERRIDE;
virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
virtual bool GetAcceleratorForCommandId(
int command_id,
ui::Accelerator* accelerator) OVERRIDE;
virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
// Sets the selection to the currently active Online Wallet account.
// Should be called if the user attempts to sign into the Online Wallet
// (e.g. when the user clicks the "Sign-in" link).
void SelectActiveWalletAccount();
// Sets the selection to the local Autofill data.
void SelectUseAutofill();
// Returns true if there are any accounts for the user to choose from.
bool HasAccountsToChoose() const;
// Sets the name of the account used to communicate with the Online Wallet.
void SetActiveWalletAccountName(const string16& account);
// Clears the name of the account used to communicate with the Online Wallet.
// Any Wallet error automatically clears the currently active account name.
void ClearActiveWalletAccountName();
// Returns the name of the currently active account, or an empty string.
const string16& active_wallet_account_name() const {
return active_wallet_account_name_;
}
// Disables all Wallet accounts and switches to the local Autofill data.
// Should be called when the Wallet server returns an error with the message
// to be displayed. If |message| is empty the error state will be cleared.
void SetHadWalletError(const base::string16& message);
bool HadWalletError() const;
// Switches the dialog to the local Autofill data.
// Should be called when the Online Wallet sign-in attempt has failed.
void SetHadWalletSigninError();
// Returns true if the selected account is an Online Wallet account.
bool WalletIsSelected() const;
// Returns true if the current selection matches the currently active
// Wallet account.
bool IsActiveWalletAccountSelected() const;
// Returns the command id of the current selection.
int checked_item() const { return checked_item_; }
base::string16 wallet_error_message() const { return wallet_error_message_; }
protected:
// Command IDs of the items in this menu; protected for the tests.
// kActiveWalletItemId is the currently active account.
// kAutofillItemId is "Pay without the Wallet" (local autofill data).
// In the future, kFirstAdditionalItemId will be added as the first id
// for additional accounts.
static const int kActiveWalletItemId;
static const int kAutofillItemId;
private:
// Reconstructs the set of menu items.
void ReconstructMenuItems();
AccountChooserModelDelegate* delegate_;
// The command id of the currently selected item.
int checked_item_;
// The message to be displayed if there is a Wallet error. This message is
// only non-empty if a Wallet error has occurred.
base::string16 wallet_error_message_;
// For logging UMA metrics.
const AutofillMetrics& metric_logger_;
const DialogType dialog_type_;
// The name (email) of the account currently used in communications with the
// Online Wallet service.
string16 active_wallet_account_name_;
DISALLOW_COPY_AND_ASSIGN(AccountChooserModel);
};
} // namespace autofill
#endif // CHROME_BROWSER_UI_AUTOFILL_ACCOUNT_CHOOSER_MODEL_H_