// 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 #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_